|
 |
006bc1 |
From f3cf0d6e15240098147437fed7bd436ff55fdf8c Mon Sep 17 00:00:00 2001
|
|
 |
006bc1 |
From: Mike Pall <mike>
|
|
 |
006bc1 |
Date: Sun, 22 Apr 2018 13:14:28 +0200
|
|
 |
006bc1 |
Subject: [PATCH 36/72] Give expected results for negative non-base-10 numbers
|
|
 |
006bc1 |
in tonumber().
|
|
 |
006bc1 |
|
|
 |
006bc1 |
This was undefined in Lua 5.1, but it's defined in 5.2.
|
|
 |
006bc1 |
---
|
|
 |
006bc1 |
src/lib_base.c | 27 ++++++++++++++++++---------
|
|
 |
006bc1 |
1 file changed, 18 insertions(+), 9 deletions(-)
|
|
 |
006bc1 |
|
|
 |
006bc1 |
diff --git a/src/lib_base.c b/src/lib_base.c
|
|
 |
006bc1 |
index 3a75787..d61e876 100644
|
|
 |
006bc1 |
--- a/src/lib_base.c
|
|
 |
006bc1 |
+++ b/src/lib_base.c
|
|
 |
006bc1 |
@@ -287,18 +287,27 @@ LJLIB_ASM(tonumber) LJLIB_REC(.)
|
|
 |
006bc1 |
} else {
|
|
 |
006bc1 |
const char *p = strdata(lj_lib_checkstr(L, 1));
|
|
 |
006bc1 |
char *ep;
|
|
 |
006bc1 |
+ unsigned int neg = 0;
|
|
 |
006bc1 |
unsigned long ul;
|
|
 |
006bc1 |
if (base < 2 || base > 36)
|
|
 |
006bc1 |
lj_err_arg(L, 2, LJ_ERR_BASERNG);
|
|
 |
006bc1 |
- ul = strtoul(p, &ep, base);
|
|
 |
006bc1 |
- if (p != ep) {
|
|
 |
006bc1 |
- while (lj_char_isspace((unsigned char)(*ep))) ep++;
|
|
 |
006bc1 |
- if (*ep == '\0') {
|
|
 |
006bc1 |
- if (LJ_DUALNUM && LJ_LIKELY(ul < 0x80000000u))
|
|
 |
006bc1 |
- setintV(L->base-1-LJ_FR2, (int32_t)ul);
|
|
 |
006bc1 |
- else
|
|
 |
006bc1 |
- setnumV(L->base-1-LJ_FR2, (lua_Number)ul);
|
|
 |
006bc1 |
- return FFH_RES(1);
|
|
 |
006bc1 |
+ while (lj_char_isspace((unsigned char)(*p))) p++;
|
|
 |
006bc1 |
+ if (*p == '-') { p++; neg = 1; } else if (*p == '+') { p++; }
|
|
 |
006bc1 |
+ if (lj_char_isalnum((unsigned char)(*p))) {
|
|
 |
006bc1 |
+ ul = strtoul(p, &ep, base);
|
|
 |
006bc1 |
+ if (p != ep) {
|
|
 |
006bc1 |
+ while (lj_char_isspace((unsigned char)(*ep))) ep++;
|
|
 |
006bc1 |
+ if (*ep == '\0') {
|
|
 |
006bc1 |
+ if (LJ_DUALNUM && LJ_LIKELY(ul < 0x80000000u+neg)) {
|
|
 |
006bc1 |
+ if (neg) ul = -ul;
|
|
 |
006bc1 |
+ setintV(L->base-1-LJ_FR2, (int32_t)ul);
|
|
 |
006bc1 |
+ } else {
|
|
 |
006bc1 |
+ lua_Number n = (lua_Number)ul;
|
|
 |
006bc1 |
+ if (neg) n = -n;
|
|
 |
006bc1 |
+ setnumV(L->base-1-LJ_FR2, n);
|
|
 |
006bc1 |
+ }
|
|
 |
006bc1 |
+ return FFH_RES(1);
|
|
 |
006bc1 |
+ }
|
|
 |
006bc1 |
}
|
|
 |
006bc1 |
}
|
|
 |
006bc1 |
}
|
|
 |
006bc1 |
--
|
|
 |
006bc1 |
2.20.1
|
|
 |
006bc1 |
|