safe_strtoXX interface proved to be a bit unconvenient.
Remove it, introduce saner bb_strtoXX. Saved ~350 bytes.
This commit is contained in:
@@ -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
|
||||
|
@@ -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
|
||||
|
@@ -1,147 +0,0 @@
|
||||
/* vi: set sw=4 ts=4: */
|
||||
/*
|
||||
* Utility routines.
|
||||
*
|
||||
* Copyright (C) 1999-2004 by Erik Andersen <andersen@codepoet.org>
|
||||
*
|
||||
* Licensed under GPLv2 or later, see file LICENSE in this tarball for details.
|
||||
*/
|
||||
|
||||
#include <assert.h>
|
||||
#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();
|
||||
}
|
@@ -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);
|
||||
|
@@ -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
|
||||
|
Reference in New Issue
Block a user