diff options
Diffstat (limited to 'mdk-stage1/dietlibc/lib/strtoull.c')
-rw-r--r-- | mdk-stage1/dietlibc/lib/strtoull.c | 37 |
1 files changed, 14 insertions, 23 deletions
diff --git a/mdk-stage1/dietlibc/lib/strtoull.c b/mdk-stage1/dietlibc/lib/strtoull.c index 64f095f60..40818958d 100644 --- a/mdk-stage1/dietlibc/lib/strtoull.c +++ b/mdk-stage1/dietlibc/lib/strtoull.c @@ -1,38 +1,29 @@ #include <ctype.h> -static char *num="0123456789abcdefghijklmnopqrstuvwxyz"; - unsigned long long int strtoull(const char *nptr, char **endptr, int base) { long long int v=0; - int a=1,i; - while(isspace(*nptr)) nptr++; + while(isspace(*nptr)) ++nptr; - if (*nptr == '+') { nptr++; } - if (!base) - { - if (*nptr=='0') - { + if (*nptr == '+') ++nptr; + if (!base) { + if (*nptr=='0') { base=8; - if ((*(nptr+1)=='x')||(*(nptr+1)=='X')) base=16; + if ((*(nptr+1)=='x')||(*(nptr+1)=='X')) { + nptr+=2; + base=16; + } } else base=10; } - while((a)&&(*nptr)) - { - a=0; - for (i=0;(!a)&&(i<base);i++) - { - if ((*nptr == num[i]) || (*nptr == (num[i]-' '))) - { - a=1; - v=(v*base)+(&num[i]-num); - } - } - if ((!a)&&(base==16)&&((*nptr=='x')||(*nptr=='X'))) a=1; - if (a) nptr++; + while(*nptr) { + register unsigned char c=*nptr; + c=(c>='a'?c-'a'+10:c>='A'?c-'A'+10:c-'0'); + if (c>=base) break; + v=v*base+c; + ++nptr; } if (endptr) *endptr=(char *)nptr; return v; |