From owner-svn-src-all@FreeBSD.ORG Sat Aug 14 14:34:36 2010 Return-Path: Delivered-To: svn-src-all@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 9F631106566B; Sat, 14 Aug 2010 14:34:36 +0000 (UTC) (envelope-from des@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 848BC8FC1C; Sat, 14 Aug 2010 14:34:36 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id o7EEYaAR030304; Sat, 14 Aug 2010 14:34:36 GMT (envelope-from des@svn.freebsd.org) Received: (from des@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id o7EEYaSA030301; Sat, 14 Aug 2010 14:34:36 GMT (envelope-from des@svn.freebsd.org) Message-Id: <201008141434.o7EEYaSA030301@svn.freebsd.org> From: Dag-Erling Smorgrav Date: Sat, 14 Aug 2010 14:34:36 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org X-SVN-Group: head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r211304 - head/lib/libutil X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 14 Aug 2010 14:34:36 -0000 Author: des Date: Sat Aug 14 14:34:36 2010 New Revision: 211304 URL: http://svn.freebsd.org/changeset/base/211304 Log: Simplify expand_number() by combining the (unrolled) loop with the switch. Since expand_number() does not accept negative numbers, switch from int64_t to uint64_t; this makes it easier to check for overflow. MFC after: 3 weeks Modified: head/lib/libutil/expand_number.c head/lib/libutil/libutil.h Modified: head/lib/libutil/expand_number.c ============================================================================== --- head/lib/libutil/expand_number.c Sat Aug 14 14:18:02 2010 (r211303) +++ head/lib/libutil/expand_number.c Sat Aug 14 14:34:36 2010 (r211304) @@ -37,7 +37,7 @@ __FBSDID("$FreeBSD$"); /* * Convert an expression of the following forms to a int64_t. - * 1) A positive decimal number. + * 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). * 4) A positive decimal number followed by a 'm' or 'M' (mult by 1 << 20). @@ -47,14 +47,12 @@ __FBSDID("$FreeBSD$"); * 8) A positive decimal number followed by a 'e' or 'E' (mult by 1 << 60). */ int -expand_number(const char *buf, int64_t *num) +expand_number(const char *buf, uint64_t *num) { - static const char unit[] = "bkmgtpe"; - char *endptr, s; - int64_t number; - int i; + uint64_t number; + char *endptr; - number = strtoimax(buf, &endptr, 0); + number = strtoumax(buf, &endptr, 0); if (endptr == buf) { /* No valid digits. */ @@ -68,15 +66,23 @@ expand_number(const char *buf, int64_t * return (0); } - s = tolower(*endptr); - switch (s) { - case 'b': - case 'k': - case 'm': - case 'g': - case 't': - case 'p': +#define SHIFT(n, b) \ + do { if ((n << b) < n) goto overflow; n <<= b; } while (0) + + switch (tolower((unsigned char)*endptr)) { case 'e': + SHIFT(number, 10); + case 'p': + SHIFT(number, 10); + case 't': + SHIFT(number, 10); + case 'g': + SHIFT(number, 10); + case 'm': + SHIFT(number, 10); + case 'k': + SHIFT(number, 10); + case 'b': break; default: /* Unrecognized unit. */ @@ -84,17 +90,11 @@ expand_number(const char *buf, int64_t * return (-1); } - for (i = 0; unit[i] != '\0'; i++) { - if (s == unit[i]) - break; - if ((number < 0 && (number << 10) > number) || - (number >= 0 && (number << 10) < number)) { - errno = ERANGE; - return (-1); - } - number <<= 10; - } - *num = number; return (0); + +overflow: + /* Overflow */ + errno = ERANGE; + return (-1); } Modified: head/lib/libutil/libutil.h ============================================================================== --- head/lib/libutil/libutil.h Sat Aug 14 14:18:02 2010 (r211303) +++ head/lib/libutil/libutil.h Sat Aug 14 14:34:36 2010 (r211304) @@ -109,7 +109,7 @@ int forkpty(int *_amaster, char *_name, struct termios *_termp, struct winsize *_winp); int humanize_number(char *_buf, size_t _len, int64_t _number, const char *_suffix, int _scale, int _flags); -int expand_number(const char *_buf, int64_t *_num); +int expand_number(const char *_buf, uint64_t *_num); const char *uu_lockerr(int _uu_lockresult); int uu_lock(const char *_ttyname); int uu_unlock(const char *_ttyname);