ntoab: Handle LONG_MIN case.

* lib/mes/ntoab.c (ntoab): Handle LONG_MIN case.
* lib/tests/scaffold/60-math.c (main): Add test for INT_MIN and hex.
This commit is contained in:
Danny Milosavljevic 2020-06-15 01:05:35 +02:00
parent 3b312ca983
commit b11510f4da
No known key found for this signature in database
GPG key ID: E71A35542C30BAA5
2 changed files with 27 additions and 1 deletions

View file

@ -20,6 +20,10 @@
#include <assert.h> #include <assert.h>
#include <mes/lib.h> #include <mes/lib.h>
#include <stdint.h>
#define STR(x) #x
#define XSTR(s) STR(s)
char * char *
ntoab (long x, int base, int signed_p) ntoab (long x, int base, int signed_p)
@ -34,6 +38,25 @@ ntoab (long x, int base, int signed_p)
if (signed_p && x < 0) if (signed_p && x < 0)
{ {
sign_p = 1; sign_p = 1;
if (x == LONG_MIN)
{
/* Cannot do u = (-x), so avoid it. */
long i;
if (base == 10)
return XSTR(LONG_MIN);
/* We cause the same result as
i = (-x) % base
u = (-x) / base
would in mathematics if x and base were integers.
It will be the case that -base < x <= 0 after the loop.
Because base > 1, the quotient will definitely fit into u.
i will contain the last digit to print. */
for (u = 0; x <= -base; x += base, ++u)
;
i = -x;
*p-- = i > 9 ? 'a' + i - 10 : '0' + i;
}
else
u = -x; u = -x;
} }
else else

View file

@ -196,6 +196,9 @@ ok1:
if (strcmp ("-2147483648", itoa (i))) if (strcmp ("-2147483648", itoa (i)))
return 34; return 34;
if (strcmp ("-80000000", ntoab (i, 16, 1)))
return 35;
oputs ("t: i = -2147483647\n"); oputs ("t: i = -2147483647\n");
i = -2147483647; i = -2147483647;