Hi,

I have been doing some investigation to figure out why gnucash is working on
my i386 but getting confused on the alpha.

I have come up with a few findings.  I guess I may be the first
one trying to use it on a 64-bit platform so I will try to send y'all some
patches ASAP.

Anyway, the code seems to incorrectly assume that:

 * a long is 4 bytes.  On Alpha, it's 8.
 * a long is different than a long long.  On Alpha, it's not.
 * a long is the same as an int.

Anyway, the offendor I have noted here is this.  Here is code in
writeTSDate:

  tmp = ts->tv_nsec;
  XACC_FLIP_INT (tmp);
  err = write( fd, &tmp, sizeof(int) );

But look at the corresponding code in readTSDate:

  err = read( fd, &nsecs, sizeof(long int) );

Now...  on i386, this will work.  Why?  Because both int and long are 32-bit
on i386.  On Alpha, int is 32-bit and long is 64-bit.  So, the code writes a
4-byte int and tries to read it back as an 8-byte int.  Oops.

If the binary format is going to be preserved, I would *highly* recommend
that at least abolish the usage of int, long, and long long in the code (or
at least the stuff that does file I/O) and instead use macros or typedefs
that explicitly specify the size such that it can be correct on all archs.

I note that Debian includes a stdint.h file with the following macros:

uint8_t
uint16_t
uint32_t
uint64_t
int8_t
int16_t
int32_t
int64_t

What I don't know is how standard stdint.h is, so ports to non-GNU
architectures may not be as easy.  However, I suspect that autoconf may have
something available here.

I shall go through the file today and make these changes, and let you know
if it fixes my problems.  If it does, I'll send a patch along.  Is this
mailing list used for patches?  If not, to what address should they be sent?

Alternatively, if there is a newer version in CVS or somewhere, you may want
to patch it yourself (a well-thought-out search & replace should do the
trick), in case there are new places to patch.

Normally I might suggest just fixing this one case.  But again, with data as
important as that which is handled by gnucash, I feel that there is zero
room for error and explicitly stating the sizes can go a long way to
improving portability.

Finally, sorry for barraging the mailing list with all these messages :-)
I just tried gnucash yesterday, and was instantly hooked on it.  Y'all are
doing a great job, and thanks for a great program!

Thanks,
John Goerzen

--
Gnucash Developer's List
To unsubscribe send empty email to: [EMAIL PROTECTED]


Reply via email to