diff options
-rw-r--r-- | big.c | 63 |
1 files changed, 44 insertions, 19 deletions
@@ -879,12 +879,12 @@ word strtobig(word z, int base) return r; } -extern char *dicp; -word bigtostr(x) /* number to decimal string (as Miranda list) */ -word x; +/* number to decimal string (as Miranda list) */ +word bigtostr(word x) { word x1, sign, s = NIL; + #ifdef DEBUG extern int debug; if (debug & 04) { /* print octally */ @@ -892,45 +892,68 @@ word x; sign = big_is_negative(x); for (;;) { word i = OCTW; - while (i-- || d) - s = cons('0' + (d & 07), s), d >>= 3; + + while (i-- || d) { + s = cons('0' + (d & 07), s); + d >>= 3; + } + x = rest(x); - if (x) + if (x) { s = cons(' ', s), d = digit(x); - else + } else { return (sign ? cons('-', s) : s); + } } } #endif + if (rest(x) == 0) { extern char *dicp; sprintf(dicp, "%ld", getsmallint(x)); return (str_conv(dicp)); } + sign = big_is_negative(x); + x1 = make(INT, digit0(x), 0); /* reverse x into x1 */ - while (x = rest(x)) + while (x = rest(x)) { x1 = make(INT, digit(x), x1); + } x = x1; - for (;;) { /* in situ division of (reversed order) x by PTEN */ - word d = digit(x), rem = d % PTEN; + + /* in situ division of (reversed order) x by PTEN */ + for (;;) { + word d = digit(x); + word rem = d % PTEN; d = d / PTEN; x1 = rest(x); - if (d) + + if (d) { digit(x) = d; - else + } else { x = x1; /* remove leading zero from result */ - while (x1) - d = rem * IBASE + digit(x1), - digit(x1) = d / PTEN, rem = d % PTEN, x1 = rest(x1); + } + + while (x1) { + d = rem * IBASE + digit(x1); + digit(x1) = d / PTEN; + rem = d % PTEN; + x1 = rest(x1); + } + /* end of in situ division (also uses x1 as temporary) */ if (x) { word i = TENW; - while (i--) - s = cons('0' + rem % 10, s), rem = rem / 10; + while (i--) { + s = cons('0' + rem % 10, s); + rem = rem / 10; + } } else { - while (rem) - s = cons('0' + rem % 10, s), rem = rem / 10; + while (rem) { + s = cons('0' + rem % 10, s); + rem = rem / 10; + } return (sign ? cons('-', s) : s); } } @@ -939,6 +962,7 @@ word x; word bigtostrx(x) /* integer to hexadecimal string (as Miranda list) */ word x; { + extern char *dicp; word r = NIL, s = big_is_negative(x); while (x) { word count = 4; /* 60 bits => 20 octal digits => 4 bignum digits */ @@ -965,6 +989,7 @@ word x; word bigtostr8(x) /* integer to octal string (as Miranda list) */ word x; { + extern char *dicp; word r = NIL, s = big_is_negative(x); while (x) { char *q = dicp + 5; |