Blame SOURCES/0036-Give-expected-results-for-negative-non-base-10-numbe.patch

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