[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH v2] ntoab: Handle LONG_MIN case.
From: |
Danny Milosavljevic |
Subject: |
[PATCH v2] ntoab: Handle LONG_MIN case. |
Date: |
Mon, 15 Jun 2020 01:08:01 +0200 |
* lib/mes/ntoab.c (ntoab): Handle LONG_MIN case.
---
lib/mes/ntoab.c | 25 ++++++++++++++++++++++++-
1 file changed, 24 insertions(+), 1 deletion(-)
diff --git a/lib/mes/ntoab.c b/lib/mes/ntoab.c
index a83b4d31..25780652 100644
--- a/lib/mes/ntoab.c
+++ b/lib/mes/ntoab.c
@@ -20,6 +20,10 @@
#include <assert.h>
#include <mes/lib.h>
+#include <stdint.h>
+
+#define STR(x) #x
+#define XSTR(s) STR(s)
char *
ntoab (long x, int base, int signed_p)
@@ -34,7 +38,26 @@ ntoab (long x, int base, int signed_p)
if (signed_p && x < 0)
{
sign_p = 1;
- u = -x;
+ 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;
}
else
u = x;