diff --git a/include/libbb.h b/include/libbb.h index 152fb7e01..5cba27932 100644 --- a/include/libbb.h +++ b/include/libbb.h @@ -317,17 +317,11 @@ struct suffix_mult { }; #include "xatonum.h" /* Specialized: */ -unsigned xatou_range(const char *numstr, unsigned lower, unsigned upper); -unsigned xatou_sfx(const char *numstr, const struct suffix_mult *suffixes); -unsigned xatou(const char *numstr); -int xatoi_range(const char *numstr, int lower, int upper); -int xatoi(const char *numstr); /* Using xatoi() instead of naive atoi() is not always convenient - * in many places people want *non-negative* values, but store them * in signed int. Therefore we need this one: * dies if input is not in [0, INT_MAX] range. Also will reject '-0' etc */ int xatoi_u(const char *numstr); -uint32_t xatou32(const char *numstr); /* Useful for reading port numbers */ uint16_t xatou16(const char *numstr); diff --git a/include/xatonum.h b/include/xatonum.h index cdb5e7393..46e49b0eb 100644 --- a/include/xatonum.h +++ b/include/xatonum.h @@ -92,3 +92,15 @@ DEFINE_EQUIV_STR_CONV(int, i, l, u, ul) #else DECLARE_STR_CONV(int, i, u) #endif + +/* Specialized */ + +int BUG_xatou32_unimplemented(void); +extern inline uint32_t xatou32(const char *numstr) +{ + if (UINT_MAX == 0xffffffff) + return xatou(numstr); + if (ULONG_MAX == 0xffffffff) + return xatoul(numstr); + return BUG_xatou32_unimplemented(); +} diff --git a/libbb/xatonum.c b/libbb/xatonum.c index 910667c14..0d487dd9b 100644 --- a/libbb/xatonum.c +++ b/libbb/xatonum.c @@ -52,6 +52,15 @@ #endif #if UINT_MAX != ULONG_MAX +extern inline unsigned bb_strtoui(const char *str, char **end, int b) +{ + unsigned long v = strtoul(str, end, b); + if (v > UINT_MAX) { + errno = ERANGE; + return UINT_MAX; + } + return v; +} #define type int #define xstrtou(rest) xstrtou##rest #define xstrto(rest) xstrtoi##rest @@ -60,7 +69,8 @@ #define XSTR_UTYPE_MAX UINT_MAX #define XSTR_TYPE_MAX INT_MAX #define XSTR_TYPE_MIN INT_MIN -#define XSTR_STRTOU strtoul +/* 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 @@ -77,7 +87,7 @@ int xatoi_u(const char *numstr) { - return xatoul_range(numstr, 0, INT_MAX); + return xatou_range(numstr, 0, INT_MAX); } uint32_t xatou32(const char *numstr) @@ -87,5 +97,5 @@ uint32_t xatou32(const char *numstr) uint16_t xatou16(const char *numstr) { - return xatoul_range(numstr, 0, 0xffff); + return xatou_range(numstr, 0, 0xffff); }