printf: fix printf "%u\n" +18446744073709551614
authorDenys Vlasenko <vda.linux@googlemail.com>
Tue, 30 Oct 2018 22:24:18 +0000 (23:24 +0100)
committerDenys Vlasenko <vda.linux@googlemail.com>
Tue, 30 Oct 2018 22:24:18 +0000 (23:24 +0100)
function                                             old     new   delta
conv_strtoll                                          19      32     +13
conv_strtoull                                         49      61     +12
bb_strtoll                                            89      84      -5
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 2/1 up/down: 25/-5)              Total: 20 bytes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
coreutils/printf.c
libbb/bb_strtonum.c

index b2429c5cfc50a501da510c76add2e322ed301809..67d3b2eda9ff30ffa6227f29521c58427c8f20eb 100644 (file)
@@ -95,6 +95,12 @@ static int multiconvert(const char *arg, void *result, converter convert)
 
 static void FAST_FUNC conv_strtoull(const char *arg, void *result)
 {
+       /* Allow leading '+' - bb_strtoull() by itself does not allow it,
+        * and probably shouldn't (other callers might require purely numeric
+        * inputs to be allowed.
+        */
+       if (arg[0] == '+')
+               arg++;
        *(unsigned long long*)result = bb_strtoull(arg, NULL, 0);
        /* both coreutils 6.10 and bash 3.2:
         * $ printf '%x\n' -2
@@ -107,6 +113,8 @@ static void FAST_FUNC conv_strtoull(const char *arg, void *result)
 }
 static void FAST_FUNC conv_strtoll(const char *arg, void *result)
 {
+       if (arg[0] == '+')
+               arg++;
        *(long long*)result = bb_strtoll(arg, NULL, 0);
 }
 static void FAST_FUNC conv_strtod(const char *arg, void *result)
index cb70f10536432257ed99017c0294b34474a7e08e..2185017b02533ef81e4f9f8844edf8c30a161a63 100644 (file)
@@ -81,7 +81,7 @@ long long FAST_FUNC bb_strtoll(const char *arg, char **endp, int base)
        /* Check for the weird "feature":
         * a "-" string is apparently a valid "number" for strto[u]l[l]!
         * It returns zero and errno is 0! :( */
-       first = (arg[0] != '-' && arg[0] != '+' ? arg[0] : arg[1]);
+       first = (arg[0] != '-' ? arg[0] : arg[1]);
        if (!isalnum(first)) return ret_ERANGE();
 
        errno = 0;