diff options
Diffstat (limited to 'busybox/libbb/xgetlarg.c')
-rw-r--r-- | busybox/libbb/xgetlarg.c | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/busybox/libbb/xgetlarg.c b/busybox/libbb/xgetlarg.c new file mode 100644 index 000000000..56fb60e82 --- /dev/null +++ b/busybox/libbb/xgetlarg.c | |||
@@ -0,0 +1,35 @@ | |||
1 | /* vi: set sw=4 ts=4: */ | ||
2 | /* | ||
3 | * Copyright (C) 2003-2004 Erik Andersen <andersen@codepoet.org> | ||
4 | */ | ||
5 | |||
6 | |||
7 | #include <stdio.h> | ||
8 | #include <stdlib.h> | ||
9 | #include <getopt.h> | ||
10 | #include <errno.h> | ||
11 | #include <assert.h> | ||
12 | #include <ctype.h> | ||
13 | |||
14 | #include "busybox.h" | ||
15 | |||
16 | extern long bb_xgetlarg(const char *arg, int base, long lower, long upper) | ||
17 | { | ||
18 | long result; | ||
19 | char *endptr; | ||
20 | int errno_save = errno; | ||
21 | |||
22 | assert(arg!=NULL); | ||
23 | |||
24 | /* Don't allow leading whitespace. */ | ||
25 | if ((isspace)(*arg)) { /* Use an actual funciton call for minimal size. */ | ||
26 | bb_show_usage(); | ||
27 | } | ||
28 | |||
29 | errno = 0; | ||
30 | result = strtol(arg, &endptr, base); | ||
31 | if (errno != 0 || *endptr!='\0' || endptr==arg || result < lower || result > upper) | ||
32 | bb_show_usage(); | ||
33 | errno = errno_save; | ||
34 | return result; | ||
35 | } | ||