executor/src/bindec.c

67 lines
1.3 KiB
C

/* Copyright 1986, 1989, 1990 by Abacus Research and
* Development, Inc. All rights reserved.
*/
#if !defined (OMIT_RCSID_STRINGS)
char ROMlib_rcsid_bindec[] =
"$Id: bindec.c 63 2004-12-24 18:19:43Z ctm $";
#endif
/* Forward declarations in BinaryDecimal.h (DO NOT DELETE THIS LINE) */
#include "rsys/common.h"
#include "rsys/glue.h"
A2(PUBLIC trap, void, NumToString, LONGINT, l, StringPtr, s)
{
register Byte *p = s+1;
register LONGINT d;
if (l == 0) {
s[0] = 1;
*p = '0';
return;
} else if ((uint32) l == 0x80000000L) {
register char *q = "-2147483648";
s[0] = 11;
while (*q)
*p++ = *q++; /* DON'T put the null byte in */
return;
} else if (l < 0) {
*p++ = '-';
l = -l;
}
d = 1000000000L;
while (!(*p = l / d)) /* must find something */
d /= 10;
l -= d * *p;
d /= 10;
*p++ += '0';
while (d) {
l -= (*p = l / d) * d;
*p++ += '0';
d /= 10;
}
s[0] = p - (s+1);
}
A2(PUBLIC trap, void, StringToNum, StringPtr, s, LONGINT *, lp)
{
register char *p = (char *)s+1;
register char *ep = p + s[0];
register LONGINT l = 0;
int sign = 1;
if (p != ep) {
if (*p == '+')
p++;
else if (*p == '-') {
p++;
sign = -1;
}
}
while (p != ep)
l = l * 10 + (*p++ & 0xF);
*lp = sign * l;
}