diff options
author | Manuel Novoa III <mjn3@codepoet.org> | 2003-03-19 09:13:01 +0000 |
---|---|---|
committer | Manuel Novoa III <mjn3@codepoet.org> | 2003-03-19 09:13:01 +0000 |
commit | cad5364599eb5062d59e0c397ed638ddd61a8d5d (patch) | |
tree | a318d0f03aa076c74b576ea45dc543a5669e8e91 /libbb/parse_number.c | |
parent | e01f9662a5bd5d91be4f6b3941b57fff73cd5af1 (diff) | |
download | busybox-w32-cad5364599eb5062d59e0c397ed638ddd61a8d5d.tar.gz busybox-w32-cad5364599eb5062d59e0c397ed638ddd61a8d5d.tar.bz2 busybox-w32-cad5364599eb5062d59e0c397ed638ddd61a8d5d.zip |
Major coreutils update.
Diffstat (limited to 'libbb/parse_number.c')
-rw-r--r-- | libbb/parse_number.c | 84 |
1 files changed, 39 insertions, 45 deletions
diff --git a/libbb/parse_number.c b/libbb/parse_number.c index 755a357ad..92ad6a216 100644 --- a/libbb/parse_number.c +++ b/libbb/parse_number.c | |||
@@ -1,70 +1,64 @@ | |||
1 | /* vi: set sw=4 ts=4: */ | 1 | /* vi: set sw=4 ts=4: */ |
2 | /* | 2 | /* |
3 | * Utility routines. | 3 | * bb_xparse_number implementation for busybox |
4 | * | 4 | * |
5 | * Copyright (C) many different people. If you wrote this, please | 5 | * Copyright (C) 2003 Manuel Novoa III <mjn3@codepoet.org> |
6 | * acknowledge your work. | ||
7 | * | 6 | * |
8 | * This program is free software; you can redistribute it and/or modify | 7 | * This program is free software; you can redistribute it and/or modify |
9 | * it under the terms of the GNU General Public License as published by | 8 | * it under the terms of the GNU General Public License as published by |
10 | * the Free Software Foundation; either version 2 of the License, or | 9 | * the Free Software Foundation; either version 2 of the License, or |
11 | * (at your option) any later version. | 10 | * (at your option) any later version. |
12 | * | 11 | * |
13 | * This program is distributed in the hope that it will be useful, but | 12 | * This program is distributed in the hope that it will be useful, |
14 | * WITHOUT ANY WARRANTY; without even the implied warranty of | 13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | 14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
16 | * General Public License for more details. | 15 | * General Public License for more details. |
17 | * | 16 | * |
18 | * You should have received a copy of the GNU General Public License | 17 | * You should have received a copy of the GNU General Public License |
19 | * along with this program; if not, write to the Free Software | 18 | * along with this program; if not, write to the Free Software |
20 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 | 19 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
21 | * USA | 20 | * |
22 | */ | 21 | */ |
23 | 22 | ||
24 | #include <stdio.h> | ||
25 | #include <string.h> | ||
26 | #include <stdlib.h> | 23 | #include <stdlib.h> |
24 | #include <string.h> | ||
25 | #include <limits.h> | ||
26 | #include <errno.h> | ||
27 | #include <assert.h> | ||
27 | #include "libbb.h" | 28 | #include "libbb.h" |
28 | 29 | ||
29 | 30 | extern | |
30 | unsigned long parse_number(const char *numstr, | 31 | unsigned long bb_xparse_number(const char *numstr, |
31 | const struct suffix_mult *suffixes) | 32 | const struct suffix_mult *suffixes) |
32 | { | 33 | { |
33 | const struct suffix_mult *sm; | 34 | unsigned long int r; |
34 | unsigned long int ret; | 35 | char *e; |
35 | int len; | 36 | int old_errno; |
36 | char *end; | ||
37 | 37 | ||
38 | ret = strtoul(numstr, &end, 10); | 38 | /* Since this is a lib function, we're not allowed to reset errno to 0. |
39 | if (numstr == end) | 39 | * Doing so could break an app that is deferring checking of errno. |
40 | error_msg_and_die("invalid number `%s'", numstr); | 40 | * So, save the old value so that we can restore it if successful. */ |
41 | while (end[0] != '\0') { | 41 | old_errno = errno; |
42 | sm = suffixes; | 42 | errno = 0; |
43 | while ( sm != 0 ) { | 43 | r = strtoul(numstr, &e, 10); |
44 | if(sm->suffix) { | 44 | |
45 | len = strlen(sm->suffix); | 45 | if ((numstr != e) && !errno) { |
46 | if (strncmp(sm->suffix, end, len) == 0) { | 46 | errno = old_errno; /* Ok. So restore errno. */ |
47 | ret *= sm->mult; | 47 | if (!*e) { |
48 | end += len; | 48 | return r; |
49 | break; | 49 | } |
50 | if (suffixes) { | ||
51 | assert(suffixes->suffix); /* No nul suffixes. */ | ||
52 | do { | ||
53 | if (strcmp(suffixes->suffix, e) == 0) { | ||
54 | if (ULONG_MAX / suffixes->mult < r) { /* Overflow! */ | ||
55 | break; | ||
56 | } | ||
57 | return r * suffixes->mult; | ||
50 | } | 58 | } |
51 | sm++; | 59 | ++suffixes; |
52 | 60 | } while (suffixes->suffix); | |
53 | } else | ||
54 | sm = 0; | ||
55 | } | 61 | } |
56 | if (sm == 0) | ||
57 | error_msg_and_die("invalid number `%s'", numstr); | ||
58 | } | 62 | } |
59 | return ret; | 63 | bb_error_msg_and_die("invalid number `%s'", numstr); |
60 | } | 64 | } |
61 | |||
62 | |||
63 | /* END CODE */ | ||
64 | /* | ||
65 | Local Variables: | ||
66 | c-file-style: "linux" | ||
67 | c-basic-offset: 4 | ||
68 | tab-width: 4 | ||
69 | End: | ||
70 | */ | ||