[hackers] [sbase] printf: replace strtonum with strtol functions in conversions || Quentin Rameau

From: <git_AT_suckless.org>
Date: Tue, 1 Mar 2016 12:14:50 +0100 (CET)

commit 3da450e20361076952483456c6f196ea7579ce7a
Author: Quentin Rameau <quinq_AT_fifth.space>
AuthorDate: Mon Feb 29 17:34:34 2016 +0100
Commit: sin <sin_AT_2f30.org>
CommitDate: Tue Mar 1 11:14:42 2016 +0000

    printf: replace strtonum with strtol functions in conversions
    
    Use strtol and strtoul respectively for d, i and o, u, x, X conversions.
    This way we can convert other bases than 10, which strtonum doesn't
    provide.
    Also don't exit on conversion error but display a warning, set a return
    error code, and continue.

diff --git a/printf.c b/printf.c
index 52d97e1..2e24817 100644
--- a/printf.c
+++ b/printf.c
_AT_@ -1,5 +1,6 @@
 /* See LICENSE file for copyright and license details. */
 #include <ctype.h>
+#include <errno.h>
 #include <limits.h>
 #include <stdio.h>
 #include <stdlib.h>
_AT_@ -21,7 +22,7 @@ main(int argc, char *argv[])
         size_t i, j, argi, lastargi, formatlen;
         long long num;
         double dou;
- int cooldown = 0, width, precision;
+ int cooldown = 0, width, precision, ret = 0;
         char *format, *tmp, *arg, *fmt, flag;
 
         argv0 = argv[0];
_AT_@ -134,8 +135,25 @@ main(int argc, char *argv[])
                                 rarg = ereallocarray(NULL, utflen(arg) + 1, sizeof(*rarg));
                                 utftorunestr(arg, rarg);
                                 num = rarg[0];
+ } else if (arg[0]) {
+ errno = 0;
+ if (format[i] == 'd' || format[i] == 'i')
+ num = strtol(arg, &tmp, 0);
+ else
+ num = strtoul(arg, &tmp, 0);
+
+ if (tmp == arg || *tmp != '\0') {
+ ret = 1;
+ weprintf("%%%c %s: conversion error\n",
+ format[i], arg);
+ }
+ if (errno == ERANGE) {
+ ret = 1;
+ weprintf("%%%c %s: out of range\n",
+ format[i], arg);
+ }
                         } else {
- num = (strlen(arg) > 0) ? estrtonum(arg, LLONG_MIN, LLONG_MAX) : 0;
+ num = 0;
                         }
                         fmt = estrdup(flag ? "%#*.*ll#" : "%*.*ll#");
                         if (flag)
_AT_@ -160,5 +178,5 @@ main(int argc, char *argv[])
                         cooldown = 1;
         }
 
- return fshut(stdout, "<stdout>");
+ return fshut(stdout, "<stdout>") | ret;
 }
Received on Tue Mar 01 2016 - 12:14:50 CET

This archive was generated by hypermail 2.3.0 : Tue Mar 01 2016 - 12:24:22 CET