[Gdal-dev] (OGR) shapelib on ARM Linux bugfix
Etienne Dube
etdube at globetrotter.net
Wed Apr 7 01:12:55 EDT 2004
Hello everyone,
While developping a GPS mapping app for Qtopia / Opie, I stumbled across a
problem with the OGR Shapefile driver, occuring only on ARM CPUs (the program
runs fine on my x86 desktop.) The SHPOpen() function seems to read garbage
values instead of geographic coordinates from the ESRI shapefile. I was
suspecting a byte ordering problem with double precision floating point
values, but the ARM family uses little-endian byte ordering, like x86. The
catch is, ARMs don't have a numerical coprocessor; floating point operations
are emulated in software. For some reasons, the FPU emulation in ARM Linux
uses a rather strange byte-ordering scheme for double precision numbers (see
http://handhelds.org/hypermail/ipaq/163/16349.html and
http://handhelds.org/hypermail/ipaq/163/16352.html). Each 32-bit word in the
64-bit double value is stored little-endian, but the most significative
32-bit word comes last in memory ("big-wordian").
I had to do a major revamping of shpopen.c in order to add support for ARM. I
added a few functions to detect the three possible double precision byte
orders (big-endian, little-endian, and ARM's little-endian/big-wordian) and
swap the double values according to it. It adds a _slight_ performance hit
compared to the current implementation of shpopen.c, but this will be
negligible for virtually all applications.
The modified code was briefly tested on both ARM and x86 systems, I'll do a
few more tests to see if it doesn't break file writing / creation (no major
changes were done to the logic of the program, except for things related to
byte ordering, so it should be all right.) As I don't have a PPC/Sparc
machine, I didn't do any test to see if it still works with big-endian CPU
(I'm pretty sure it will.)
I included the patch (diff'ed against the most recent shpopen.c from the OGR
CVS tree) with this message. Frank, any comments or questions on this? Feel
free to commit the changes back to the OGR tree.
Etienne
-------------- next part --------------
A non-text attachment was scrubbed...
Name: shpopen.patch
Type: text/x-diff
Size: 29152 bytes
Desc: not available
Url : http://lists.osgeo.org/pipermail/gdal-dev/attachments/20040407/170f77aa/shpopen.bin
More information about the Gdal-dev
mailing list