1/* vi: set sw=4 ts=4: */ 2/* 3 * ascii-to-numbers implementations for busybox 4 * 5 * Copyright (C) 2003 Manuel Novoa III <mjn3@codepoet.org> 6 * 7 * Licensed under GPLv2, see file LICENSE in this source tree. 8 */ 9 10#include "libbb.h" 11 12#define type long long 13#define xstrtou(rest) xstrtoull##rest 14#define xstrto(rest) xstrtoll##rest 15#define xatou(rest) xatoull##rest 16#define xato(rest) xatoll##rest 17#define XSTR_UTYPE_MAX ULLONG_MAX 18#define XSTR_TYPE_MAX LLONG_MAX 19#define XSTR_TYPE_MIN LLONG_MIN 20#define XSTR_STRTOU strtoull 21#include "xatonum_template.c" 22 23#if ULONG_MAX != ULLONG_MAX 24#define type long 25#define xstrtou(rest) xstrtoul##rest 26#define xstrto(rest) xstrtol##rest 27#define xatou(rest) xatoul##rest 28#define xato(rest) xatol##rest 29#define XSTR_UTYPE_MAX ULONG_MAX 30#define XSTR_TYPE_MAX LONG_MAX 31#define XSTR_TYPE_MIN LONG_MIN 32#define XSTR_STRTOU strtoul 33#include "xatonum_template.c" 34#endif 35 36#if UINT_MAX != ULONG_MAX 37static ALWAYS_INLINE 38unsigned bb_strtoui(const char *str, char **end, int b) 39{ 40 unsigned long v = strtoul(str, end, b); 41 if (v > UINT_MAX) { 42 errno = ERANGE; 43 return UINT_MAX; 44 } 45 return v; 46} 47#define type int 48#define xstrtou(rest) xstrtou##rest 49#define xstrto(rest) xstrtoi##rest 50#define xatou(rest) xatou##rest 51#define xato(rest) xatoi##rest 52#define XSTR_UTYPE_MAX UINT_MAX 53#define XSTR_TYPE_MAX INT_MAX 54#define XSTR_TYPE_MIN INT_MIN 55/* libc has no strtoui, so we need to create/use our own */ 56#define XSTR_STRTOU bb_strtoui 57#include "xatonum_template.c" 58#endif 59 60/* A few special cases */ 61 62int FAST_FUNC xatoi_positive(const char *numstr) 63{ 64 return xatou_range(numstr, 0, INT_MAX); 65} 66 67uint16_t FAST_FUNC xatou16(const char *numstr) 68{ 69 return xatou_range(numstr, 0, 0xffff); 70} 71