[GRASS-dev] portable.h elimination
Paul Kelly
paul-grass at stjohnspoint.co.uk
Tue Mar 13 18:08:59 EDT 2007
On Tue, 13 Mar 2007, Moritz Lennert wrote:
> On Mon, March 5, 2007 14:06, Glynn Clements wrote:
>>
>> I've modified lib/vector/diglib to determine the byte ordering at run
>> time, rather than generating the portable.h header file.
>>
>> The supplied test case passes. It might be useful to test it using dig
>> files generated on an architecture with the opposite byte order (I
>> have no way to test this). It might also be worth testing it on MinGW.
>
> How should I test ?
Thanks for reminding me about this Moritz - I'd looked at it both quite a
while ago and more recently after Glynn posted about the portable.h
changes. I don't think there's any change on MinGW - the portable test in
the lib/vector/diglib Makefile always failed anyway - presumably that's
why it was conditionalised on not running on MinGW. If it is forced to run
anyway, I get the following output:
==============TEST=============
gcc -L/c/grass/grass6/dist.i686-pc-mingw32/lib -Wl,--export-dynamic,--enable-runtime-pseudo-reloc -L/c/grass/forgrass/lib -I/c/grass/forgrass/include -g -O2 -I/c/grass/forgrass/include -I/c/grass/forgrass/include -I/c/grass/grass6/dist.i686-pc-mingw32/include -o OBJ.i686-pc-mingw32/test test.c -lgrass_dig2 -lgrass_gis -lgrass_datetime -lxdr -liberty -lws2_32 -lz -lgrass_rtree -lgrass_rtree \
-lgrass_gis -lgrass_datetime -lxdr -liberty -lws2_32 -lz -lgrass_datetime -lxdr -liberty -lws2_32 -lz
cd OBJ.i686-pc-mingw32; PATH=".:/bin:/mingw/bin:/mingw/lib:/c/grass/forgrass/bin:/c/grass/forgrass/lib:/c/tcl/bin:/c/WINDOWS/system32:/c/WINDOWS:/c/WINDOWS/System32/Wbem:/c/Program Files/QuickTime/QTSystem/:/c/grass/forgrass/bin:/c/grass/forgrass/lib:/c/tcl/bin:/c/WINDOWS/system32:/c/WINDOWS:/c/WINDOWS/System32/Wbem:/c/Program Files/QuickTime/QTSystem/:/c/jed09916/bin:/c/grass/grass6/dist.i686-pc-mingw32/lib" ./test; diff ./test.tmp ../test.ok
ERROR in read/write portable double, byte_order = 0
Written: -1.3332999999999999e+0003E
Read : -1.7976931348623157e+3083E
ERROR in read/write portable double, byte_order = 0
Written: -2.2250738585072014e-3083E
Read : -1.7976931348623157e+3083E
ERROR in read/write portable double, byte_order = 0
Written: 0.0000000000000000e+0003E
Read : -1.7976931348623157e+3083E
ERROR in read/write portable double, byte_order = 0
Written: 2.2250738585072014e-3083E
Read : -1.7976931348623157e+3083E
ERROR in read/write portable double, byte_order = 0
Written: 1.3332999999999999e+0003E
Read : -1.7976931348623157e+3083E
ERROR in read/write portable double, byte_order = 0
Written: 1.7976931348623157e+3083E
Read : -1.7976931348623157e+3083E
ERROR in read/write portable float, byte_order = 0
Written: -3.40282347e+0383E
Read : -1.#QNAN000e+0003E
ERROR in read/write portable float, byte_order = 0
Written: -1.33329999e+0003E
Read : -1.#QNAN000e+0003E
ERROR in read/write portable float, byte_order = 0
Written: -1.17549435e-0383E
Read : -1.#QNAN000e+0003E
ERROR in read/write portable float, byte_order = 0
Written: 0.00000000e+0003E
Read : -1.#QNAN000e+0003E
ERROR in read/write portable float, byte_order = 0
Written: 1.17549435e-0383E
Read : -1.#QNAN000e+0003E
ERROR in read/write portable float, byte_order = 0
Written: 1.33329999e+0003E
Read : -1.#QNAN000e+0003E
ERROR in read/write portable float, byte_order = 0
Written: 3.40282347e+0383E
Read : -1.#QNAN000e+0003E
ERROR in read/write portable long, byte_order = 0
Written: -2147483647
Read : -1048577
ERROR in read/write portable long, byte_order = 0
Written: -123456789
Read : -1048577
ERROR in read/write portable long, byte_order = 0
Written: 0
Read : -1048577
ERROR in read/write portable long, byte_order = 0
Written: 123456789
Read : -1048577
ERROR in read/write portable long, byte_order = 0
Written: 2147483647
Read : -1048577
ERROR in read/write portable int, byte_order = 0
Written: -2147483647
Read : -1048577
ERROR in read/write portable int, byte_order = 0
Written: -123456789
Read : -1048577
ERROR in read/write portable int, byte_order = 0
Written: 0
Read : -1048577
ERROR in read/write portable int, byte_order = 0
Written: 123456789
Read : -1048577
ERROR in read/write portable int, byte_order = 0
Written: 2147483647
Read : -1048577
ERROR in read/write portable short, byte_order = 0
Written: -32768
Read : -17
ERROR in read/write portable short, byte_order = 0
Written: -12345
Read : -17
ERROR in read/write portable short, byte_order = 0
Written: 0
Read : -17
ERROR in read/write portable short, byte_order = 0
Written: 12345
Read : -17
ERROR in read/write portable short, byte_order = 0
Written: 32767
Read : -17
ERROR in read/write portable char, byte_order = 0
Written: -128
Read : -1
ERROR in read/write portable char, byte_order = 0
Written: -123
Read : -1
ERROR in read/write portable char, byte_order = 0
Written: 0
Read : -1
ERROR in read/write portable char, byte_order = 0
Written: 123
Read : -1
ERROR in read/write portable char, byte_order = 0
Written: 127
Read : -1
ERROR in read/write portable double, byte_order = 1
Written: -1.7976931348623157e+3083E
Read : -1.#QNAN00000000000e+0003E
ERROR in read/write portable double, byte_order = 1
Written: -1.3332999999999999e+0003E
Read : -1.#QNAN00000000000e+0003E
ERROR in read/write portable double, byte_order = 1
Written: -2.2250738585072014e-3083E
Read : -1.#QNAN00000000000e+0003E
ERROR in read/write portable double, byte_order = 1
Written: 0.0000000000000000e+0003E
Read : -1.#QNAN00000000000e+0003E
ERROR in read/write portable double, byte_order = 1
Written: 2.2250738585072014e-3083E
Read : -1.#QNAN00000000000e+0003E
ERROR in read/write portable double, byte_order = 1
Written: 1.3332999999999999e+0003E
Read : -1.#QNAN00000000000e+0003E
ERROR in read/write portable double, byte_order = 1
Written: 1.7976931348623157e+3083E
Read : -1.#QNAN00000000000e+0003E
ERROR in read/write portable float, byte_order = 1
Written: -3.40282347e+0383E
Read : -1.#QNAN000e+0003E
ERROR in read/write portable float, byte_order = 1
Written: -1.33329999e+0003E
Read : -1.#QNAN000e+0003E
ERROR in read/write portable float, byte_order = 1
Written: -1.17549435e-0383E
Read : -1.#QNAN000e+0003E
ERROR in read/write portable float, byte_order = 1
Written: 0.00000000e+0003E
Read : -1.#QNAN000e+0003E
ERROR in read/write portable float, byte_order = 1
Written: 1.17549435e-0383E
Read : -1.#QNAN000e+0003E
ERROR in read/write portable float, byte_order = 1
Written: 1.33329999e+0003E
Read : -1.#QNAN000e+0003E
ERROR in read/write portable float, byte_order = 1
Written: 3.40282347e+0383E
Read : -1.#QNAN000e+0003E
ERROR in read/write portable long, byte_order = 1
Written: -2147483647
Read : -4097
ERROR in read/write portable long, byte_order = 1
Written: -123456789
Read : -4097
ERROR in read/write portable long, byte_order = 1
Written: 0
Read : -4097
ERROR in read/write portable long, byte_order = 1
Written: 123456789
Read : -4097
ERROR in read/write portable long, byte_order = 1
Written: 2147483647
Read : -4097
ERROR in read/write portable int, byte_order = 1
Written: -2147483647
Read : -4097
ERROR in read/write portable int, byte_order = 1
Written: -123456789
Read : -4097
ERROR in read/write portable int, byte_order = 1
Written: 0
Read : -4097
ERROR in read/write portable int, byte_order = 1
Written: 123456789
Read : -4097
ERROR in read/write portable int, byte_order = 1
Written: 2147483647
Read : -4097
ERROR in read/write portable short, byte_order = 1
Written: -32768
Read : -4097
ERROR in read/write portable short, byte_order = 1
Written: -12345
Read : -4097
ERROR in read/write portable short, byte_order = 1
Written: 0
Read : -4097
ERROR in read/write portable short, byte_order = 1
Written: 12345
Read : -4097
ERROR in read/write portable short, byte_order = 1
Written: 32767
Read : -4097
ERROR in read/write portable char, byte_order = 1
Written: -128
Read : -1
ERROR in read/write portable char, byte_order = 1
Written: -123
Read : -1
ERROR in read/write portable char, byte_order = 1
Written: 0
Read : -1
ERROR in read/write portable char, byte_order = 1
Written: 123
Read : -1
ERROR in read/write portable char, byte_order = 1
Written: 127
Read : -1
Binary files ./test.tmp and ../test.ok differ
make: *** [OBJ.i686-pc-mingw32/test] Error 1
For some reason (can't quite remember why) I changed test.c in the past to
try and get this to work. ISTR someone suggested somewhere extra seeks
were needed on Windows. This is what I changed:
--- test.c.orig Tue Mar 6 12:05:41 2007
+++ test.c.pk Fri Dec 15 10:55:33 2006
@@ -62,6 +62,7 @@
for (j=0; j < 7; j++)
{
fprintf (fp.file, "double ");
+ dig_fseek (&fp, 0, SEEK_CUR);
dig__fwrite_port_D ( &(td[j]), 1, &fp);
dig_fseek (&fp, -(PORT_DOUBLE), SEEK_CUR);
dig__fread_port_D (&db, 1, &fp);
@@ -76,6 +77,7 @@
for (j=0; j < 7; j++)
{
fprintf (fp.file, "float ");
+ dig_fseek (&fp, 0, SEEK_CUR);
dig__fwrite_port_F ( &(tf[j]), 1, &fp);
dig_fseek (&fp, -(PORT_FLOAT), SEEK_CUR);
dig__fread_port_F (&fb, 1, &fp);
@@ -91,6 +93,7 @@
for (j=0; j < 5; j++)
{
fprintf (fp.file, "long ");
+ dig_fseek (&fp, 0, SEEK_CUR);
dig__fwrite_port_L ( &(tl[j]), 1, &fp);
dig_fseek (&fp, -(PORT_LONG), SEEK_CUR);
dig__fread_port_L (&lb, 1, &fp);
@@ -106,6 +109,7 @@
for (j=0; j < 5; j++)
{
fprintf (fp.file, "int ");
+ dig_fseek (&fp, 0, SEEK_CUR);
dig__fwrite_port_I ( &(ti[j]), 1, &fp);
dig_fseek (&fp, -(PORT_INT), SEEK_CUR);
dig__fread_port_I (&ib, 1, &fp);
@@ -121,6 +125,7 @@
for (j=0; j < 5; j++)
{
fprintf (fp.file, "short ");
+ dig_fseek (&fp, 0, SEEK_CUR);
dig__fwrite_port_S ( &(ts[j]), 1, &fp);
dig_fseek (&fp, -(PORT_SHORT), SEEK_CUR);
dig__fread_port_S (&sb, 1, &fp);
@@ -135,6 +140,7 @@
for (j=0; j < 5; j++)
{
fprintf (fp.file, "char ");
+ dig_fseek (&fp, 0, SEEK_CUR);
dig__fwrite_port_C ( &(tc[j]), 1, &fp);
dig_fseek (&fp, -(PORT_CHAR), SEEK_CUR);
dig__fread_port_C (&cb, 1, &fp);
And with that the output from the test is now:
==============TEST=============
gcc -L/c/grass/grass6/dist.i686-pc-mingw32/lib -Wl,--export-dynamic,--enable-runtime-pseudo-reloc -L/c/grass/forgrass/lib -I/c/grass/forgrass/include -g -O2 -I/c/grass/forgrass/include -I/c/grass/forgrass/include -I/c/grass/grass6/dist.i686-pc-mingw32/include -o OBJ.i686-pc-mingw32/test test.c -lgrass_dig2 -lgrass_gis -lgrass_datetime -lxdr -liberty -lws2_32 -lz -lgrass_rtree -lgrass_rtree \
-lgrass_gis -lgrass_datetime -lxdr -liberty -lws2_32 -lz -lgrass_datetime -lxdr -liberty -lws2_32 -lz
cd OBJ.i686-pc-mingw32; PATH=".:/bin:/mingw/bin:/mingw/lib:/c/grass/forgrass/bin:/c/grass/forgrass/lib:/c/tcl/bin:/c/WINDOWS/system32:/c/WINDOWS:/c/WINDOWS/System32/Wbem:/c/Program Files/QuickTime/QTSystem/:/c/grass/forgrass/bin:/c/grass/forgrass/lib:/c/tcl/bin:/c/WINDOWS/system32:/c/WINDOWS:/c/WINDOWS/System32/Wbem:/c/Program Files/QuickTime/QTSystem/:/c/jed09916/bin:/c/grass/grass6/dist.i686-pc-mingw32/lib" ./test; diff ./test.tmp ../test.ok
Binary files ./test.tmp and ../test.ok differ
make: *** [OBJ.i686-pc-mingw32/test] Error 1
i.e. the test files are still different, but it doesn't have lots of
errors while running. I have no idea if/how that is significant!
Paul
More information about the grass-dev
mailing list