safe_strtoXX interface proved to be a bit unconvenient.

Remove it, introduce saner bb_strtoXX.
Saved ~350 bytes.
This commit is contained in:
Denis Vlasenko
2006-11-27 14:43:21 +00:00
parent 8a0a83d503
commit d686a045c8
16 changed files with 145 additions and 280 deletions

View File

@@ -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

View File

@@ -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

View File

@@ -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();
}

View File

@@ -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);

View File

@@ -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