From: <ust...@us...> - 2009-03-30 20:55:03
|
Revision: 2972 http://clucene.svn.sourceforge.net/clucene/?rev=2972&view=rev Author: ustramooner Date: 2009-03-30 20:54:55 +0000 (Mon, 30 Mar 2009) Log Message: ----------- check float<>byte conversions. check error handling properly Modified Paths: -------------- branches/lucene2_3_2/src/shared/CMakeLists.txt branches/lucene2_3_2/src/shared/cmake/CheckErrorHandling.cmake Added Paths: ----------- branches/lucene2_3_2/src/shared/cmake/CheckFloatByte.cmake branches/lucene2_3_2/src/shared/cmake/CheckFloatByte.cpp.in Modified: branches/lucene2_3_2/src/shared/CMakeLists.txt =================================================================== --- branches/lucene2_3_2/src/shared/CMakeLists.txt 2009-03-30 20:51:34 UTC (rev 2971) +++ branches/lucene2_3_2/src/shared/CMakeLists.txt 2009-03-30 20:54:55 UTC (rev 2972) @@ -28,6 +28,7 @@ INCLUDE (DefineStaticSyntax) INCLUDE (DefineMAXPATHValue) +INCLUDE (CheckFloatByte) INCLUDE (CheckErrorHandling) INCLUDE (CheckHashmaps) INCLUDE (CheckNamespace) @@ -86,9 +87,8 @@ wcscmp wcsncmp wcscspn ) #todo: wcstoq is bsd equiv of wcstoll, we can use that... -CHECK_OPTIONAL_FUNCTIONS( wcsupr wcscasecmp wcsicmp wcstoll wprintf lltow wcstod strupr strlwr lltoa strtoll gettimeofday _vsnwprintf - "MapViewOfFile(0,0,0,0,0)" - mmap +CHECK_OPTIONAL_FUNCTIONS( wcsupr wcscasecmp wcsicmp wcstoll wprintf lltow + wcstod strupr strlwr lltoa strtoll gettimeofday _vsnwprintf mmap "MapViewOfFile(0,0,0,0,0)" ) #make decisions about which functions to use... @@ -220,6 +220,9 @@ #Check that we can handle try/catch CHECK_HAVE_FUNCTION_TRY_BLOCKS (_CL_HAVE_TRY_BLOCKS) +#check that we support new float byte<->float conversions +CHECK_FLOAT_BYTE_WORKS(_CL_HAVE_NO_FLOAT_BYTE, 1) + #check how to use hashmaps CHECK_HASH_MAPS (CL_NS_HASHING_VALUE LUCENE_DISABLE_HASHING) Modified: branches/lucene2_3_2/src/shared/cmake/CheckErrorHandling.cmake =================================================================== --- branches/lucene2_3_2/src/shared/cmake/CheckErrorHandling.cmake 2009-03-30 20:51:34 UTC (rev 2971) +++ branches/lucene2_3_2/src/shared/cmake/CheckErrorHandling.cmake 2009-03-30 20:54:55 UTC (rev 2972) @@ -6,7 +6,7 @@ CHECK_CXX_SOURCE_RUNS(" void foo() { try{ return; } catch( ... ){} } int main(){ foo(); return 0; }" ${result}) - IF ( NOT _CL_HAVE_TRY_BLOCKS ) - SET ( ${result} 1 ) - ENDIF ( NOT _CL_HAVE_TRY_BLOCKS ) + IF ( NOT ${result} ) + SET ( ${result} 1 FORCE) + ENDIF ( NOT ${result} ) ENDMACRO ( CHECK_HAVE_FUNCTION_TRY_BLOCKS ) Added: branches/lucene2_3_2/src/shared/cmake/CheckFloatByte.cmake =================================================================== --- branches/lucene2_3_2/src/shared/cmake/CheckFloatByte.cmake (rev 0) +++ branches/lucene2_3_2/src/shared/cmake/CheckFloatByte.cmake 2009-03-30 20:54:55 UTC (rev 2972) @@ -0,0 +1,37 @@ +# - Check if our methods for converting from floats to bytes and back work. +# CHECK_FLOAT_BYTE_WORKS(RESULT reverse) +# reverse: set to false if the check succeeds +# +# CMAKE_REQUIRED_FLAGS = string of compile command line flags +# CMAKE_REQUIRED_DEFINITIONS = list of macros to define (-DFOO=bar) +# CMAKE_REQUIRED_INCLUDES = list of include directories +# CMAKE_REQUIRED_LIBRARIES = list of libraries to link +# CMAKE_EXTRA_INCLUDE_FILES = list of extra includes to check in + +MACRO(CHECK_FLOAT_BYTE_WORKS RESULT reverse) + IF("${RESULT}" MATCHES "^${RESULT}$") + MESSAGE(STATUS "Checking support new float byte<->float conversions") + + CONFIGURE_FILE("${clucene-shared_SOURCE_DIR}/cmake/CheckFloatByte.cpp.in" + "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/CheckFloatByte.cpp" IMMEDIATE @ONLY) + + TRY_COMPILE(${RESULT} + ${CMAKE_BINARY_DIR} + "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/CheckFloatByte.cpp" + OUTPUT_VARIABLE OUTPUT) + IF(${RESULT}) + MESSAGE(STATUS "Checking support new float byte<->float conversions - yes") + ELSE(${RESULT}) + MESSAGE(STATUS "Checking support new float byte<->float conversions - no") + ENDIF(${RESULT}) + + #reverse decision if required. + IF (${reverse}) + IF (${RESULT}) + SET ( ${RESULT} 0 ) + ELSE (${RESULT}) + SET ( ${RESULT} 1 ) + ENDIF (${RESULT}) + ENDIF (${reverse}) + ENDIF("${RESULT}" MATCHES "^${RESULT}$") +ENDMACRO(CHECK_FLOAT_BYTE_WORKS) Added: branches/lucene2_3_2/src/shared/cmake/CheckFloatByte.cpp.in =================================================================== --- branches/lucene2_3_2/src/shared/cmake/CheckFloatByte.cpp.in (rev 0) +++ branches/lucene2_3_2/src/shared/cmake/CheckFloatByte.cpp.in 2009-03-30 20:54:55 UTC (rev 2972) @@ -0,0 +1,81 @@ + typedef long double float_t; + typedef long int32_t; + typedef char uint8_t; + + //float to bits conversion utilities... + union clvalue { + int32_t i; + float f; //must use a float type, else types dont match up + }; + + int32_t floatToIntBits(float_t value) + { + clvalue u; + int32_t e, f; + u.f = value; + e = u.i & 0x7f800000; + f = u.i & 0x007fffff; + + if (e == 0x7f800000 && f != 0) + u.i = 0x7fc00000; + + return u.i; + } + float_t intBitsToFloat(int32_t bits) + { + clvalue u; + u.i = bits; + return u.f; + } + + float_t byteToFloat(uint8_t b) { + if (b == 0) // zero is a special case + return 0.0f; + int32_t mantissa = b & 7; + int32_t exponent = (b >> 3) & 31; + int32_t bits = ((exponent+(63-15)) << 24) | (mantissa << 21); + return intBitsToFloat(bits); + } + + uint8_t floatToByte(float_t f) { + if (f < 0.0f) // round negatives up to zero + f = 0.0f; + + if (f == 0.0f) // zero is a special case + return 0; + + int32_t bits = floatToIntBits(f); // parse float_t into parts + int32_t mantissa = (bits & 0xffffff) >> 21; + int32_t exponent = (((bits >> 24) & 0x7f) - 63) + 15; + + if (exponent > 31) { // overflow: use max value + exponent = 31; + mantissa = 7; + } + + if (exponent < 0) { // underflow: use min value + exponent = 0; + mantissa = 1; + } + + return (uint8_t)((exponent << 3) | mantissa); // pack into a uint8_t + } + + +#ifdef __CLASSIC_C__ +int main(){ + int ac; + char*av[]; +#else +int main(int ac, char*av[]){ +#endif + //well known conversion + if ( floatToByte(0.5f) != 120 ) + return 1; + + //converting back works? + if ( floatToByte(byteToFloat(57)) != 57 ) + return 1; + + return 0; +} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |