|
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.
|