From 30454a4ca132ea76851f799546f67f98b074f650 Mon Sep 17 00:00:00 2001 From: Rob Landley Date: Tue, 12 Jul 2016 14:51:51 -0500 Subject: Convert atolx() and friends to use long long internally. Update design.html to use this (and tail) as examples of simplicity of implementation winning and losing. --- lib/lib.c | 37 +++++++++++++++++++------------------ 1 file changed, 19 insertions(+), 18 deletions(-) (limited to 'lib/lib.c') diff --git a/lib/lib.c b/lib/lib.c index b742bd17..56656435 100644 --- a/lib/lib.c +++ b/lib/lib.c @@ -273,16 +273,16 @@ struct string_list *find_in_path(char *path, char *filename) return rlist; } -long estrtol(char *str, char **end, int base) +long long estrtol(char *str, char **end, int base) { errno = 0; - return strtol(str, end, base); + return strtoll(str, end, base); } -long xstrtol(char *str, char **end, int base) +long long xstrtol(char *str, char **end, int base) { - long l = estrtol(str, end, base); + long long l = estrtol(str, end, base); if (errno) perror_exit_raw(str); @@ -291,31 +291,32 @@ long xstrtol(char *str, char **end, int base) // atol() with the kilo/mega/giga/tera/peta/exa extensions. // (zetta and yotta don't fit in 64 bits.) -long atolx(char *numstr) +long long atolx(char *numstr) { - char *c, *suffixes="cbkmgtpe", *end; - long val; + char *c = numstr, *suffixes="cbkmgtpe", *end; + long long val; val = xstrtol(numstr, &c, 0); - if (*c) { - if (c != numstr && (end = strchr(suffixes, tolower(*c)))) { - int shift = end-suffixes-2; - if (shift >= 0) val *= 1024L<<(shift*10); - } else { - while (isspace(*c)) c++; - if (*c) error_exit("not integer: %s", numstr); + if (c != numstr && (end = strchr(suffixes, tolower(*c)))) { + int shift = end-suffixes-2; + + if (shift >= 0) { + if (toupper(*++c)=='d') do val *= 1000; while (shift--); + else val *= 1024LL<<(shift*10); } } + while (isspace(*c)) c++; + if (c==numstr || *c) error_exit("not integer: %s", numstr); return val; } -long atolx_range(char *numstr, long low, long high) +long long atolx_range(char *numstr, long long low, long long high) { - long val = atolx(numstr); + long long val = atolx(numstr); - if (val < low) error_exit("%ld < %ld", val, low); - if (val > high) error_exit("%ld > %ld", val, high); + if (val < low) error_exit("%lld < %lld", val, low); + if (val > high) error_exit("%lld > %lld", val, high); return val; } -- cgit v1.2.3