From d686a045c8134d3a42fa5cc6b2e09118e08d603f Mon Sep 17 00:00:00 2001 From: Denis Vlasenko Date: Mon, 27 Nov 2006 14:43:21 +0000 Subject: safe_strtoXX interface proved to be a bit unconvenient. Remove it, introduce saner bb_strtoXX. Saved ~350 bytes. --- libbb/Kbuild | 2 +- libbb/procps.c | 3 +- libbb/safe_strtol.c | 147 ----------------------------------------------- libbb/xatonum.c | 32 ----------- libbb/xatonum_template.c | 10 ++++ 5 files changed, 13 insertions(+), 181 deletions(-) delete mode 100644 libbb/safe_strtol.c (limited to 'libbb') diff --git a/libbb/Kbuild b/libbb/Kbuild index 550723c..c156153 100644 --- a/libbb/Kbuild +++ b/libbb/Kbuild @@ -10,6 +10,7 @@ lib-y += ask_confirmation.o lib-y += bb_askpass.o lib-y += bb_do_delay.o lib-y += bb_pwd.o +lib-y += bb_strtonum.o lib-y += change_identity.o lib-y += chomp.o lib-y += compare_string_array.o @@ -67,7 +68,6 @@ lib-y += remove_file.o lib-y += restricted_shell.o lib-y += run_shell.o lib-y += safe_strncpy.o -lib-y += safe_strtol.o lib-y += safe_write.o lib-y += setup_environment.o lib-y += sha1.o diff --git a/libbb/procps.c b/libbb/procps.c index ee4f5e5..017710f 100644 --- a/libbb/procps.c +++ b/libbb/procps.c @@ -119,7 +119,8 @@ procps_status_t* procps_scan(procps_status_t* sp, int flags) free_procps_scan(sp); return NULL; } - if (safe_strtou(entry->d_name, &pid)) + pid = bb_strtou(entry->d_name, NULL, 10); + if (errno) continue; /* 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 d3bb29c..0000000 --- a/libbb/safe_strtol.c +++ /dev/null @@ -1,147 +0,0 @@ -/* vi: set sw=4 ts=4: */ -/* - * Utility routines. - * - * Copyright (C) 1999-2004 by Erik Andersen - * - * Licensed under GPLv2 or later, see file LICENSE in this tarball for details. - */ - -#include -#include "libbb.h" - -int safe_strtod(const char *arg, double* value) -{ - char *endptr; - int errno_save = errno; - - assert(arg!=NULL); - errno = 0; - *value = strtod(arg, &endptr); - if (errno != 0 || *endptr != '\0' || endptr == arg) { - return 1; - } - errno = errno_save; - return 0; -} - -int safe_strtoull(const char *arg, unsigned long long* value) -{ - char *endptr; - int errno_save = errno; - - assert(arg!=NULL); - if (!isdigit(arg[0])) /* strtouXX takes minus signs w/o error! :( */ - return 1; - errno = 0; - *value = strtoull(arg, &endptr, 0); - if (errno != 0 || *endptr != '\0' || endptr == arg) { - return 1; - } - errno = errno_save; - return 0; -} - -int safe_strtoll(const char *arg, long long* value) -{ - char *endptr; - int errno_save = errno; - - assert(arg!=NULL); - errno = 0; - *value = strtoll(arg, &endptr, 0); - if (errno != 0 || *endptr != '\0' || endptr == arg) { - return 1; - } - errno = errno_save; - return 0; -} - -int safe_strtoul(const char *arg, unsigned long* value) -{ - char *endptr; - int errno_save = errno; - - assert(arg!=NULL); - if (!isdigit(arg[0])) /* strtouXX takes minus signs w/o error! :( */ - return 1; - errno = 0; - *value = strtoul(arg, &endptr, 0); - if (errno != 0 || *endptr != '\0' || endptr == arg) { - return 1; - } - errno = errno_save; - return 0; -} - -int safe_strtol(const char *arg, long* value) -{ - char *endptr; - int errno_save = errno; - - assert(arg!=NULL); - errno = 0; - *value = strtol(arg, &endptr, 0); - if (errno != 0 || *endptr != '\0' || endptr == arg) { - return 1; - } - errno = errno_save; - return 0; -} - -/* TODO: This is what uclibc is doing. Try to do the same? */ - -#if 0 -#if defined __HAVE_ELF__ - -# define strong_alias(name, aliasname) _strong_alias(name, aliasname) -# define _strong_alias(name, aliasname) \ - extern __typeof (name) aliasname __attribute__ ((alias (#name))); - -#else /* !defined __HAVE_ELF__ */ - -# define strong_alias(name, aliasname) _strong_alias (name, aliasname) -# define _strong_alias(name, aliasname) \ - __asm__(".global " __C_SYMBOL_PREFIX__ #aliasname "\n" \ - ".set " __C_SYMBOL_PREFIX__ #aliasname "," __C_SYMBOL_PREFIX__ #name); - -#endif -#endif - -int safe_strtoi(const char *arg, int* value) -{ - int error; - long lvalue; - if (sizeof(long) == sizeof(int)) - return safe_strtol(arg, (long*)value); - lvalue = *value; - error = safe_strtol(arg, &lvalue); - if (lvalue < INT_MIN || lvalue > INT_MAX) - return 1; - *value = (int) lvalue; - return error; -} - -int safe_strtou(const char *arg, unsigned* value) -{ - int error; - unsigned long lvalue; - if (sizeof(unsigned long) == sizeof(unsigned)) - return safe_strtoul(arg, (unsigned long*)value); - lvalue = *value; - error = safe_strtoul(arg, &lvalue); - if (lvalue > UINT_MAX) - return 1; - *value = (unsigned) lvalue; - return error; -} - -int BUG_safe_strtou32_unimplemented(void); -int safe_strtou32(const char *arg, uint32_t* value) -{ - if (sizeof(uint32_t) == sizeof(unsigned)) - return safe_strtou(arg, (unsigned*)value); - if (sizeof(uint32_t) == sizeof(unsigned long)) - return safe_strtoul(arg, (unsigned long*)value); - return BUG_safe_strtou32_unimplemented(); -} diff --git a/libbb/xatonum.c b/libbb/xatonum.c index 0d487dd..35607c3 100644 --- a/libbb/xatonum.c +++ b/libbb/xatonum.c @@ -19,15 +19,6 @@ #define XSTR_TYPE_MIN LLONG_MIN #define XSTR_STRTOU strtoull #include "xatonum_template.c" -#undef type -#undef xstrtou -#undef xstrto -#undef xatou -#undef xato -#undef XSTR_UTYPE_MAX -#undef XSTR_TYPE_MAX -#undef XSTR_TYPE_MIN -#undef XSTR_STRTOU #if ULONG_MAX != ULLONG_MAX #define type long @@ -40,15 +31,6 @@ #define XSTR_TYPE_MIN LONG_MIN #define XSTR_STRTOU strtoul #include "xatonum_template.c" -#undef type -#undef xstrtou -#undef xstrto -#undef xatou -#undef xato -#undef XSTR_UTYPE_MAX -#undef XSTR_TYPE_MAX -#undef XSTR_TYPE_MIN -#undef XSTR_STRTOU #endif #if UINT_MAX != ULONG_MAX @@ -72,15 +54,6 @@ extern inline unsigned bb_strtoui(const char *str, char **end, int b) /* libc has no strtoui, so we need to create/use our own */ #define XSTR_STRTOU bb_strtoui #include "xatonum_template.c" -#undef type -#undef xstrtou -#undef xstrto -#undef xatou -#undef xato -#undef XSTR_UTYPE_MAX -#undef XSTR_TYPE_MAX -#undef XSTR_TYPE_MIN -#undef XSTR_STRTOU #endif /* A few special cases */ @@ -90,11 +63,6 @@ int xatoi_u(const char *numstr) return xatou_range(numstr, 0, INT_MAX); } -uint32_t xatou32(const char *numstr) -{ - return xatoul_range(numstr, 0, 0xffffffff); -} - uint16_t xatou16(const char *numstr) { return xatou_range(numstr, 0, 0xffff); diff --git a/libbb/xatonum_template.c b/libbb/xatonum_template.c index 245586a..53ba544 100644 --- a/libbb/xatonum_template.c +++ b/libbb/xatonum_template.c @@ -173,3 +173,13 @@ type xato()(const char *numstr) { return xstrto(_range_sfx)(numstr, 10, XSTR_TYPE_MIN, XSTR_TYPE_MAX, NULL); } + +#undef type +#undef xstrtou +#undef xstrto +#undef xatou +#undef xato +#undef XSTR_UTYPE_MAX +#undef XSTR_TYPE_MAX +#undef XSTR_TYPE_MIN +#undef XSTR_STRTOU -- cgit v1.1