aboutsummaryrefslogtreecommitdiff
path: root/libbb
diff options
context:
space:
mode:
authorvda <vda@69ca8d6d-28ef-0310-b511-8ec308f3f277>2006-11-27 14:43:21 +0000
committervda <vda@69ca8d6d-28ef-0310-b511-8ec308f3f277>2006-11-27 14:43:21 +0000
commit278809224505ecc8bbef7b9a86982bf35b46e719 (patch)
tree38f509fc9556f68f758c77b06b480cc33b2725eb /libbb
parent7efaf01635fb84c9c6cbaa179831423f2d11bcf3 (diff)
downloadbusybox-w32-278809224505ecc8bbef7b9a86982bf35b46e719.tar.gz
busybox-w32-278809224505ecc8bbef7b9a86982bf35b46e719.tar.bz2
busybox-w32-278809224505ecc8bbef7b9a86982bf35b46e719.zip
safe_strtoXX interface proved to be a bit unconvenient.
Remove it, introduce saner bb_strtoXX. Saved ~350 bytes. git-svn-id: svn://busybox.net/trunk/busybox@16684 69ca8d6d-28ef-0310-b511-8ec308f3f277
Diffstat (limited to 'libbb')
-rw-r--r--libbb/Kbuild2
-rw-r--r--libbb/procps.c3
-rw-r--r--libbb/safe_strtol.c147
-rw-r--r--libbb/xatonum.c32
-rw-r--r--libbb/xatonum_template.c10
5 files changed, 13 insertions, 181 deletions
diff --git a/libbb/Kbuild b/libbb/Kbuild
index 550723cea..c15615302 100644
--- a/libbb/Kbuild
+++ b/libbb/Kbuild
@@ -10,6 +10,7 @@ lib-y += ask_confirmation.o
10lib-y += bb_askpass.o 10lib-y += bb_askpass.o
11lib-y += bb_do_delay.o 11lib-y += bb_do_delay.o
12lib-y += bb_pwd.o 12lib-y += bb_pwd.o
13lib-y += bb_strtonum.o
13lib-y += change_identity.o 14lib-y += change_identity.o
14lib-y += chomp.o 15lib-y += chomp.o
15lib-y += compare_string_array.o 16lib-y += compare_string_array.o
@@ -67,7 +68,6 @@ lib-y += remove_file.o
67lib-y += restricted_shell.o 68lib-y += restricted_shell.o
68lib-y += run_shell.o 69lib-y += run_shell.o
69lib-y += safe_strncpy.o 70lib-y += safe_strncpy.o
70lib-y += safe_strtol.o
71lib-y += safe_write.o 71lib-y += safe_write.o
72lib-y += setup_environment.o 72lib-y += setup_environment.o
73lib-y += sha1.o 73lib-y += sha1.o
diff --git a/libbb/procps.c b/libbb/procps.c
index ee4f5e53f..017710ff4 100644
--- a/libbb/procps.c
+++ b/libbb/procps.c
@@ -119,7 +119,8 @@ procps_status_t* procps_scan(procps_status_t* sp, int flags)
119 free_procps_scan(sp); 119 free_procps_scan(sp);
120 return NULL; 120 return NULL;
121 } 121 }
122 if (safe_strtou(entry->d_name, &pid)) 122 pid = bb_strtou(entry->d_name, NULL, 10);
123 if (errno)
123 continue; 124 continue;
124 125
125 /* After this point we have to break, not continue 126 /* After this point we have to break, not continue
diff --git a/libbb/safe_strtol.c b/libbb/safe_strtol.c
deleted file mode 100644
index d3bb29cdd..000000000
--- a/libbb/safe_strtol.c
+++ /dev/null
@@ -1,147 +0,0 @@
1/* vi: set sw=4 ts=4: */
2/*
3 * Utility routines.
4 *
5 * Copyright (C) 1999-2004 by Erik Andersen <andersen@codepoet.org>
6 *
7 * Licensed under GPLv2 or later, see file LICENSE in this tarball for details.
8 */
9
10#include <assert.h>
11#include "libbb.h"
12
13int safe_strtod(const char *arg, double* value)
14{
15 char *endptr;
16 int errno_save = errno;
17
18 assert(arg!=NULL);
19 errno = 0;
20 *value = strtod(arg, &endptr);
21 if (errno != 0 || *endptr != '\0' || endptr == arg) {
22 return 1;
23 }
24 errno = errno_save;
25 return 0;
26}
27
28int safe_strtoull(const char *arg, unsigned long long* value)
29{
30 char *endptr;
31 int errno_save = errno;
32
33 assert(arg!=NULL);
34 if (!isdigit(arg[0])) /* strtouXX takes minus signs w/o error! :( */
35 return 1;
36 errno = 0;
37 *value = strtoull(arg, &endptr, 0);
38 if (errno != 0 || *endptr != '\0' || endptr == arg) {
39 return 1;
40 }
41 errno = errno_save;
42 return 0;
43}
44
45int safe_strtoll(const char *arg, long long* value)
46{
47 char *endptr;
48 int errno_save = errno;
49
50 assert(arg!=NULL);
51 errno = 0;
52 *value = strtoll(arg, &endptr, 0);
53 if (errno != 0 || *endptr != '\0' || endptr == arg) {
54 return 1;
55 }
56 errno = errno_save;
57 return 0;
58}
59
60int safe_strtoul(const char *arg, unsigned long* value)
61{
62 char *endptr;
63 int errno_save = errno;
64
65 assert(arg!=NULL);
66 if (!isdigit(arg[0])) /* strtouXX takes minus signs w/o error! :( */
67 return 1;
68 errno = 0;
69 *value = strtoul(arg, &endptr, 0);
70 if (errno != 0 || *endptr != '\0' || endptr == arg) {
71 return 1;
72 }
73 errno = errno_save;
74 return 0;
75}
76
77int safe_strtol(const char *arg, long* value)
78{
79 char *endptr;
80 int errno_save = errno;
81
82 assert(arg!=NULL);
83 errno = 0;
84 *value = strtol(arg, &endptr, 0);
85 if (errno != 0 || *endptr != '\0' || endptr == arg) {
86 return 1;
87 }
88 errno = errno_save;
89 return 0;
90}
91
92/* TODO: This is what uclibc is doing. Try to do the same? */
93
94#if 0
95#if defined __HAVE_ELF__
96
97# define strong_alias(name, aliasname) _strong_alias(name, aliasname)
98# define _strong_alias(name, aliasname) \
99 extern __typeof (name) aliasname __attribute__ ((alias (#name)));
100
101#else /* !defined __HAVE_ELF__ */
102
103# define strong_alias(name, aliasname) _strong_alias (name, aliasname)
104# define _strong_alias(name, aliasname) \
105 __asm__(".global " __C_SYMBOL_PREFIX__ #aliasname "\n" \
106 ".set " __C_SYMBOL_PREFIX__ #aliasname "," __C_SYMBOL_PREFIX__ #name);
107
108#endif
109#endif
110
111int safe_strtoi(const char *arg, int* value)
112{
113 int error;
114 long lvalue;
115 if (sizeof(long) == sizeof(int))
116 return safe_strtol(arg, (long*)value);
117 lvalue = *value;
118 error = safe_strtol(arg, &lvalue);
119 if (lvalue < INT_MIN || lvalue > INT_MAX)
120 return 1;
121 *value = (int) lvalue;
122 return error;
123}
124
125int safe_strtou(const char *arg, unsigned* value)
126{
127 int error;
128 unsigned long lvalue;
129 if (sizeof(unsigned long) == sizeof(unsigned))
130 return safe_strtoul(arg, (unsigned long*)value);
131 lvalue = *value;
132 error = safe_strtoul(arg, &lvalue);
133 if (lvalue > UINT_MAX)
134 return 1;
135 *value = (unsigned) lvalue;
136 return error;
137}
138
139int BUG_safe_strtou32_unimplemented(void);
140int safe_strtou32(const char *arg, uint32_t* value)
141{
142 if (sizeof(uint32_t) == sizeof(unsigned))
143 return safe_strtou(arg, (unsigned*)value);
144 if (sizeof(uint32_t) == sizeof(unsigned long))
145 return safe_strtoul(arg, (unsigned long*)value);
146 return BUG_safe_strtou32_unimplemented();
147}
diff --git a/libbb/xatonum.c b/libbb/xatonum.c
index 0d487dd9b..35607c317 100644
--- a/libbb/xatonum.c
+++ b/libbb/xatonum.c
@@ -19,15 +19,6 @@
19#define XSTR_TYPE_MIN LLONG_MIN 19#define XSTR_TYPE_MIN LLONG_MIN
20#define XSTR_STRTOU strtoull 20#define XSTR_STRTOU strtoull
21#include "xatonum_template.c" 21#include "xatonum_template.c"
22#undef type
23#undef xstrtou
24#undef xstrto
25#undef xatou
26#undef xato
27#undef XSTR_UTYPE_MAX
28#undef XSTR_TYPE_MAX
29#undef XSTR_TYPE_MIN
30#undef XSTR_STRTOU
31 22
32#if ULONG_MAX != ULLONG_MAX 23#if ULONG_MAX != ULLONG_MAX
33#define type long 24#define type long
@@ -40,15 +31,6 @@
40#define XSTR_TYPE_MIN LONG_MIN 31#define XSTR_TYPE_MIN LONG_MIN
41#define XSTR_STRTOU strtoul 32#define XSTR_STRTOU strtoul
42#include "xatonum_template.c" 33#include "xatonum_template.c"
43#undef type
44#undef xstrtou
45#undef xstrto
46#undef xatou
47#undef xato
48#undef XSTR_UTYPE_MAX
49#undef XSTR_TYPE_MAX
50#undef XSTR_TYPE_MIN
51#undef XSTR_STRTOU
52#endif 34#endif
53 35
54#if UINT_MAX != ULONG_MAX 36#if UINT_MAX != ULONG_MAX
@@ -72,15 +54,6 @@ extern inline unsigned bb_strtoui(const char *str, char **end, int b)
72/* libc has no strtoui, so we need to create/use our own */ 54/* libc has no strtoui, so we need to create/use our own */
73#define XSTR_STRTOU bb_strtoui 55#define XSTR_STRTOU bb_strtoui
74#include "xatonum_template.c" 56#include "xatonum_template.c"
75#undef type
76#undef xstrtou
77#undef xstrto
78#undef xatou
79#undef xato
80#undef XSTR_UTYPE_MAX
81#undef XSTR_TYPE_MAX
82#undef XSTR_TYPE_MIN
83#undef XSTR_STRTOU
84#endif 57#endif
85 58
86/* A few special cases */ 59/* A few special cases */
@@ -90,11 +63,6 @@ int xatoi_u(const char *numstr)
90 return xatou_range(numstr, 0, INT_MAX); 63 return xatou_range(numstr, 0, INT_MAX);
91} 64}
92 65
93uint32_t xatou32(const char *numstr)
94{
95 return xatoul_range(numstr, 0, 0xffffffff);
96}
97
98uint16_t xatou16(const char *numstr) 66uint16_t xatou16(const char *numstr)
99{ 67{
100 return xatou_range(numstr, 0, 0xffff); 68 return xatou_range(numstr, 0, 0xffff);
diff --git a/libbb/xatonum_template.c b/libbb/xatonum_template.c
index 245586a5a..53ba544eb 100644
--- a/libbb/xatonum_template.c
+++ b/libbb/xatonum_template.c
@@ -173,3 +173,13 @@ type xato()(const char *numstr)
173{ 173{
174 return xstrto(_range_sfx)(numstr, 10, XSTR_TYPE_MIN, XSTR_TYPE_MAX, NULL); 174 return xstrto(_range_sfx)(numstr, 10, XSTR_TYPE_MIN, XSTR_TYPE_MAX, NULL);
175} 175}
176
177#undef type
178#undef xstrtou
179#undef xstrto
180#undef xatou
181#undef xato
182#undef XSTR_UTYPE_MAX
183#undef XSTR_TYPE_MAX
184#undef XSTR_TYPE_MIN
185#undef XSTR_STRTOU