Date: Sun, 15 Aug 2010 18:32:06 +0000 (UTC) From: Dag-Erling Smorgrav <des@FreeBSD.org> To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r211343 - head/lib/libutil Message-ID: <201008151832.o7FIW6nA068103@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: des Date: Sun Aug 15 18:32:06 2010 New Revision: 211343 URL: http://svn.freebsd.org/changeset/base/211343 Log: Further simplify the code, and update the manpage. Submitted by: Christoph Mallon <christoph.mallon@gmx.de> Modified: head/lib/libutil/expand_number.3 head/lib/libutil/expand_number.c Modified: head/lib/libutil/expand_number.3 ============================================================================== --- head/lib/libutil/expand_number.3 Sun Aug 15 17:49:41 2010 (r211342) +++ head/lib/libutil/expand_number.3 Sun Aug 15 18:32:06 2010 (r211343) @@ -25,7 +25,7 @@ .\" .\" $FreeBSD$ .\" -.Dd April 16, 2007 +.Dd August 15, 2010 .Dt EXPAND_NUMBER 3 .Os .Sh NAME @@ -37,14 +37,14 @@ .In libutil.h .Ft int .Fo expand_number -.Fa "const char *buf" "int64_t *num" +.Fa "const char *buf" "uint64_t *num" .Fc .Sh DESCRIPTION The .Fn expand_number function unformats the .Fa buf -string and stores a signed 64-bit quantity at address pointed out by the +string and stores a unsigned 64-bit quantity at address pointed out by the .Fa num argument. .Pp Modified: head/lib/libutil/expand_number.c ============================================================================== --- head/lib/libutil/expand_number.c Sun Aug 15 17:49:41 2010 (r211342) +++ head/lib/libutil/expand_number.c Sun Aug 15 18:32:06 2010 (r211343) @@ -36,7 +36,7 @@ __FBSDID("$FreeBSD$"); #include <stdint.h> /* - * Convert an expression of the following forms to a int64_t. + * Convert an expression of the following forms to a uint64_t. * 1) A positive decimal number. * 2) A positive decimal number followed by a 'b' or 'B' (mult by 1). * 3) A positive decimal number followed by a 'k' or 'K' (mult by 1 << 10). @@ -50,6 +50,7 @@ int expand_number(const char *buf, uint64_t *num) { uint64_t number; + unsigned shift; char *endptr; number = strtoumax(buf, &endptr, 0); @@ -60,41 +61,41 @@ expand_number(const char *buf, uint64_t return (-1); } - if (*endptr == '\0') { - /* No unit. */ - *num = number; - return (0); - } - -#define SHIFT(n, b) \ - do { if (((n << b) >> b) != n) goto overflow; n <<= b; } while (0) - switch (tolower((unsigned char)*endptr)) { case 'e': - SHIFT(number, 10); + shift = 60; + break; case 'p': - SHIFT(number, 10); + shift = 50; + break; case 't': - SHIFT(number, 10); + shift = 40; + break; case 'g': - SHIFT(number, 10); + shift = 30; + break; case 'm': - SHIFT(number, 10); + shift = 20; + break; case 'k': - SHIFT(number, 10); - case 'b': + shift = 10; break; + case 'b': + case '\0': /* No unit. */ + *num = number; + return (0); default: /* Unrecognized unit. */ errno = EINVAL; return (-1); } - *num = number; - return (0); + if ((number << shift) >> shift != number) { + /* Overflow */ + errno = ERANGE; + return (-1); + } -overflow: - /* Overflow */ - errno = ERANGE; - return (-1); + *num = number << shift; + return (0); }
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201008151832.o7FIW6nA068103>