diff options
author | Gwenolé Beauchesne <gbeauchesne@mandriva.org> | 2003-06-04 18:31:57 +0000 |
---|---|---|
committer | Gwenolé Beauchesne <gbeauchesne@mandriva.org> | 2003-06-04 18:31:57 +0000 |
commit | 09e967c2d732783b2579e4e120cd9b608404cb00 (patch) | |
tree | 8d2783a6a7e33608c6012efd6a88b8f5694df81d /mdk-stage1/dietlibc/lib/strtoul.c | |
parent | 18fcff49d3c836697d3b75a3d01d31c700e69974 (diff) | |
download | drakx-09e967c2d732783b2579e4e120cd9b608404cb00.tar drakx-09e967c2d732783b2579e4e120cd9b608404cb00.tar.gz drakx-09e967c2d732783b2579e4e120cd9b608404cb00.tar.bz2 drakx-09e967c2d732783b2579e4e120cd9b608404cb00.tar.xz drakx-09e967c2d732783b2579e4e120cd9b608404cb00.zip |
Merge from R9_0-AMD64, most notably:
- AMD64 support to insmod-busybox, minilibc, et al.
- Sync with insmod-modutils 2.4.19 something but everyone should use
dietlibc nowadays
- Factor out compilation and prefix with $(DIET) for dietlibc builds
- 64-bit & varargs fixes
Diffstat (limited to 'mdk-stage1/dietlibc/lib/strtoul.c')
-rw-r--r-- | mdk-stage1/dietlibc/lib/strtoul.c | 32 |
1 files changed, 22 insertions, 10 deletions
diff --git a/mdk-stage1/dietlibc/lib/strtoul.c b/mdk-stage1/dietlibc/lib/strtoul.c index 3f93962a9..e9c09fb59 100644 --- a/mdk-stage1/dietlibc/lib/strtoul.c +++ b/mdk-stage1/dietlibc/lib/strtoul.c @@ -1,32 +1,44 @@ #include <ctype.h> - -/* static char *num="0123456789abcdefghijklmnopqrstuvwxyz"; */ +#include "dietfeatures.h" +#include <errno.h> +#include <limits.h> +#include <stdlib.h> unsigned long int strtoul(const char *nptr, char **endptr, int base) { - long int v=0; + int neg = 0; + unsigned long int v=0; while(isspace(*nptr)) ++nptr; - + if (*nptr == '-') { neg=1; nptr++; } if (*nptr == '+') ++nptr; + if (base==16 && nptr[0]=='0') goto skip0x; if (!base) { if (*nptr=='0') { base=8; - if ((*(nptr+1)=='x')||(*(nptr+1)=='X')) { +skip0x: + if (nptr[1]=='x'||nptr[1]=='X') { nptr+=2; base=16; } - } - else + } else base=10; } while(*nptr) { register unsigned char c=*nptr; - c=(c>='a'?c-'a'+10:c>='A'?c-'A'+10:c-'0'); + c=(c>='a'?c-'a'+10:c>='A'?c-'A'+10:c<='9'?c-'0':0xff); if (c>=base) break; - v=v*base+c; + { + register unsigned long int w=v*base; + if (w<v) { + errno=ERANGE; + return ULONG_MAX; + } + v=w+c; + } ++nptr; } if (endptr) *endptr=(char *)nptr; - return v; + errno=0; /* in case v==ULONG_MAX, ugh! */ + return (neg?-v:v); } |