X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=include%2Fxatonum.h;h=387545518f504a82fd156a1e903fbd4d1965aacc;hb=990d0f63eeb502c8762076e5c5499196e09cba55;hp=cdb5e7393ee6b0109ebfceeff65215b0b8555f82;hpb=ed836cdc30642ddbecc286b279d461ca44135cbb;p=oweals%2Fbusybox.git diff --git a/include/xatonum.h b/include/xatonum.h index cdb5e7393..387545518 100644 --- a/include/xatonum.h +++ b/include/xatonum.h @@ -18,7 +18,7 @@ unsigned type xato##UT##_range_sfx(const char *str, unsigned type l, unsigned ty unsigned type xato##UT##_range(const char *str, unsigned type l, unsigned type u); \ unsigned type xato##UT##_sfx(const char *str, const struct suffix_mult *sfx); \ unsigned type xato##UT(const char *str); \ -type xstrto##T##_range_sfx(const char *str, int b, type l, type u, const struct suffix_mult *sfx) ;\ +type xstrto##T##_range_sfx(const char *str, int b, type l, type u, const struct suffix_mult *sfx); \ type xstrto##T##_range(const char *str, int b, type l, type u); \ type xato##T##_range_sfx(const char *str, type l, type u, const struct suffix_mult *sfx); \ type xato##T##_range(const char *str, type l, type u); \ @@ -29,50 +29,50 @@ type xato##T(const char *str); \ DECLARE_STR_CONV(long long, ll, ull) -/* Provides extern inline definitions of functions */ +/* Provides inline definitions of functions */ /* (useful for mapping them to the type of the same width) */ #define DEFINE_EQUIV_STR_CONV(narrow, N, W, UN, UW) \ \ -extern inline \ +static ALWAYS_INLINE \ unsigned narrow xstrto##UN##_range_sfx(const char *str, int b, unsigned narrow l, unsigned narrow u, const struct suffix_mult *sfx) \ { return xstrto##UW##_range_sfx(str, b, l, u, sfx); } \ -extern inline \ +static ALWAYS_INLINE \ unsigned narrow xstrto##UN##_range(const char *str, int b, unsigned narrow l, unsigned narrow u) \ { return xstrto##UW##_range(str, b, l, u); } \ -extern inline \ +static ALWAYS_INLINE \ unsigned narrow xstrto##UN##_sfx(const char *str, int b, const struct suffix_mult *sfx) \ { return xstrto##UW##_sfx(str, b, sfx); } \ -extern inline \ +static ALWAYS_INLINE \ unsigned narrow xstrto##UN(const char *str, int b) \ { return xstrto##UW(str, b); } \ -extern inline \ +static ALWAYS_INLINE \ unsigned narrow xato##UN##_range_sfx(const char *str, unsigned narrow l, unsigned narrow u, const struct suffix_mult *sfx) \ { return xato##UW##_range_sfx(str, l, u, sfx); } \ -extern inline \ +static ALWAYS_INLINE \ unsigned narrow xato##UN##_range(const char *str, unsigned narrow l, unsigned narrow u) \ { return xato##UW##_range(str, l, u); } \ -extern inline \ +static ALWAYS_INLINE \ unsigned narrow xato##UN##_sfx(const char *str, const struct suffix_mult *sfx) \ { return xato##UW##_sfx(str, sfx); } \ -extern inline \ +static ALWAYS_INLINE \ unsigned narrow xato##UN(const char *str) \ { return xato##UW(str); } \ -extern inline \ +static ALWAYS_INLINE \ narrow xstrto##N##_range_sfx(const char *str, int b, narrow l, narrow u, const struct suffix_mult *sfx) \ { return xstrto##W##_range_sfx(str, b, l, u, sfx); } \ -extern inline \ +static ALWAYS_INLINE \ narrow xstrto##N##_range(const char *str, int b, narrow l, narrow u) \ { return xstrto##W##_range(str, b, l, u); } \ -extern inline \ +static ALWAYS_INLINE \ narrow xato##N##_range_sfx(const char *str, narrow l, narrow u, const struct suffix_mult *sfx) \ { return xato##W##_range_sfx(str, l, u, sfx); } \ -extern inline \ +static ALWAYS_INLINE \ narrow xato##N##_range(const char *str, narrow l, narrow u) \ { return xato##W##_range(str, l, u); } \ -extern inline \ +static ALWAYS_INLINE \ narrow xato##N##_sfx(const char *str, const struct suffix_mult *sfx) \ { return xato##W##_sfx(str, sfx); } \ -extern inline \ +static ALWAYS_INLINE \ narrow xato##N(const char *str) \ { return xato##W(str); } \ @@ -92,3 +92,66 @@ DEFINE_EQUIV_STR_CONV(int, i, l, u, ul) #else DECLARE_STR_CONV(int, i, u) #endif + +/* Specialized */ + +int BUG_xatou32_unimplemented(void); +static ALWAYS_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(); +} + +/* Non-aborting kind of convertors */ + +unsigned long long bb_strtoull(const char *arg, char **endp, int base); +long long bb_strtoll(const char *arg, char **endp, int base); + +#if ULONG_MAX == ULLONG_MAX +static ALWAYS_INLINE +unsigned long bb_strtoul(const char *arg, char **endp, int base) +{ return bb_strtoull(arg, endp, base); } +static ALWAYS_INLINE +long bb_strtol(const char *arg, char **endp, int base) +{ return bb_strtoll(arg, endp, base); } +#else +unsigned long bb_strtoul(const char *arg, char **endp, int base); +long bb_strtol(const char *arg, char **endp, int base); +#endif + +#if UINT_MAX == ULLONG_MAX +static ALWAYS_INLINE +unsigned bb_strtou(const char *arg, char **endp, int base) +{ return bb_strtoull(arg, endp, base); } +static ALWAYS_INLINE +int bb_strtoi(const char *arg, char **endp, int base) +{ return bb_strtoll(arg, endp, base); } +#elif UINT_MAX == ULONG_MAX +static ALWAYS_INLINE +unsigned bb_strtou(const char *arg, char **endp, int base) +{ return bb_strtoul(arg, endp, base); } +static ALWAYS_INLINE +int bb_strtoi(const char *arg, char **endp, int base) +{ return bb_strtol(arg, endp, base); } +#else +unsigned bb_strtou(const char *arg, char **endp, int base); +int bb_strtoi(const char *arg, char **endp, int base); +#endif + +int BUG_bb_strtou32_unimplemented(void); +static ALWAYS_INLINE +uint32_t bb_strtou32(const char *arg, char **endp, int base) +{ + if (sizeof(uint32_t) == sizeof(unsigned)) + return bb_strtou(arg, endp, base); + if (sizeof(uint32_t) == sizeof(unsigned long)) + return bb_strtoul(arg, endp, base); + return BUG_bb_strtou32_unimplemented(); +} + +/* Floating point */ + +/* double bb_strtod(const char *arg, char **endp); */