|
On Wed, Mar 15, 2000 at 05:20:28PM -0500, Sean Porterfield wrote:
> Toward the end of this function, what is the purpose of "v = -v;" ?
> It's what is causing my precision to show as negative on some fields in
> my XML (I haven't yet found a pattern or reason). Before I just comment
> it out, I wanted to see if it had a purpose. It may well be indicitive
> of a hidden bug somewhere, of a misunderstanding due to OS400 version
> differences.
>
> (I'm on V4R2)
>
> /* Convert a signed decimal field to a C `int' */
> static int
> signed2int (buf, len)
> Byte *buf;
> int len;
> {
> int v = 0;
> while (len)
> {
> v *= 10;
> v += buf[0] & 0x0f;
> len--;
> buf++;
> }
> if ((buf[0] & 0xf0) == 0xd0)
> v = -v;
> return v;
> }
This converts an AS/400 signed field to an integer (we should probably be
converting to a long, but that doesn't matter on 32-bit architectures). This
is IBM's zoned-decimal format, which stores one digit per byte and zone-shifts
the last digit if the field is negative.
Basically, ebcdic digits zero through nine are X'F0' - X'F9', but the last
digit is converted to X'D0' - X'D9' for a negative number.
However, looking over it for the fifth time, the function is in error. Try
this instead:
/* Convert a signed decimal field to a C `int' */
static int
signed2int (buf, len)
Byte *buf;
int len;
{
int v = 0;
while (len)
{
v *= 10;
v += buf[0] & 0x0f;
len--;
if (--len == 0 && (buf[0] & 0xf0) == 0xd0)
v = -v;
buf++;
}
return v;
}
It seems we were checking the zone of a random garbage character (the first
character after the end of the field). I've just fixed this in CVS.
-Jay 'Eraserhead' Felice
>
>
> +---
> | This is the LINUX5250 Mailing List!
> | To submit a new message, send your mail to LINUX5250@midrange.com.
> | To subscribe to this list send email to LINUX5250-SUB@midrange.com.
> | To unsubscribe from this list send email to LINUX5250-UNSUB@midrange.com.
> | Questions should be directed to the list owner/operator: david@midrange.com
> +---
+---
| This is the LINUX5250 Mailing List!
| To submit a new message, send your mail to LINUX5250@midrange.com.
| To subscribe to this list send email to LINUX5250-SUB@midrange.com.
| To unsubscribe from this list send email to LINUX5250-UNSUB@midrange.com.
| Questions should be directed to the list owner/operator: david@midrange.com
+---
As an Amazon Associate we earn from qualifying purchases.
This mailing list archive is Copyright 1997-2025 by midrange.com and David Gibbs as a compilation work. Use of the archive is restricted to research of a business or technical nature. Any other uses are prohibited. Full details are available on our policy page. If you have questions about this, please contact [javascript protected email address].
Operating expenses for this site are earned using the Amazon Associate program and Google Adsense.