From: Joel Rosdahl Date: Mon, 25 Apr 2011 12:06:36 +0000 (+0200) Subject: Rename value_units to parse_size_with_suffix and handle errors X-Git-Tag: v3.2~244 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=512ead128699ccc960c3d6b218e81c688de628f0;p=thirdparty%2Fccache.git Rename value_units to parse_size_with_suffix and handle errors --- diff --git a/ccache.c b/ccache.c index ce6982f2e..b749c7fe9 100644 --- a/ccache.c +++ b/ccache.c @@ -2097,7 +2097,7 @@ ccache_main_options(int argc, char *argv[]) case 'M': /* --max-size */ check_cache_dir(); - v = value_units(optarg); + parse_size_with_suffix(optarg, &v); if (stats_set_limits(-1, v) == 0) { if (v == 0) { printf("Unset cache size limit\n"); diff --git a/ccache.h b/ccache.h index 59c05f7bb..9c415e6b8 100644 --- a/ccache.h +++ b/ccache.h @@ -129,7 +129,7 @@ char *remove_extension(const char *path); size_t file_size(struct stat *st); int safe_create_wronly(const char *fname); char *format_size(size_t v); -size_t value_units(const char *s); +bool parse_size_with_suffix(const char *str, size_t *size); char *x_realpath(const char *path); char *gnu_getcwd(void); #ifndef HAVE_STRTOK_R diff --git a/util.c b/util.c index 1b7c950ce..67aa43143 100644 --- a/util.c +++ b/util.c @@ -828,31 +828,39 @@ format_size(size_t v) return s; } -/* return a value in multiples of 1024 give a string that can end - in K, M or G -*/ -size_t -value_units(const char *s) +/* + * Parse a value in multiples of 1024 given a string that can end in K, M or G. + * Default suffix: G. + */ +bool +parse_size_with_suffix(const char *str, size_t *size) { - char m; - double v = atof(s); - m = s[strlen(s)-1]; - switch (m) { + char *endptr; + long x; + errno = 0; + x = strtol(str, &endptr, 10); + if (errno != 0 || x < 0 || endptr == str || *str == '\0') { + return false; + } + + *size = x; + switch (*endptr) { case 'G': case 'g': - default: - v *= 1024*1024; + case '\0': + *size *= 1024 * 1024; break; case 'M': case 'm': - v *= 1024; + *size *= 1024; break; case 'K': case 'k': - v *= 1; break; + default: + return false; } - return (size_t)v; + return true; } /*