Provide implementations for strtoul(3) and strtoull(3)
This commit is contained in:
parent
eaff9ccf1d
commit
cbd551e8a3
|
@ -52,6 +52,8 @@ void *realloc(void *buf , size_t n);
|
|||
|
||||
int abs(int x);
|
||||
long long strtoll(const char *nptr, char **endptr, int base);
|
||||
unsigned long long strtoull(const char *nptr, char **endptr, int base);
|
||||
unsigned long strtoul(const char *nptr, char **endptr, int base);
|
||||
long strtol(const char *nptr, char **endptr, int base);
|
||||
double strtod(const char *nptr, char **endptr);
|
||||
long double strtold(const char *nptr, char **endptr);
|
||||
|
|
|
@ -330,11 +330,72 @@ long long strtoll(const char *nptr, char **endptr, int base)
|
|||
return n?-r:r;
|
||||
}
|
||||
|
||||
unsigned long long strtoull(const char *nptr, char **endptr, int base)
|
||||
{
|
||||
int r = 0;
|
||||
int t = 0;
|
||||
int n = 0;
|
||||
|
||||
while(*nptr && isspace(*nptr))
|
||||
nptr++;
|
||||
|
||||
if(base == 0)
|
||||
{
|
||||
if(*nptr == '0')
|
||||
base = 8;
|
||||
else
|
||||
base = 10;
|
||||
}
|
||||
|
||||
if(!(base >= 2 && base <= 36))
|
||||
return 0;
|
||||
|
||||
if(base == 16 && *nptr == '0')
|
||||
{
|
||||
if(*(nptr+1) == 'x' || *(nptr+1) == 'X')
|
||||
nptr+=2;
|
||||
}
|
||||
|
||||
while(*nptr)
|
||||
{
|
||||
switch(*nptr)
|
||||
{
|
||||
case '0'...'9':
|
||||
t = *nptr - '0';
|
||||
break;
|
||||
case 'a' ... 'z':
|
||||
t = (*nptr - 'a') + 10;
|
||||
break;
|
||||
case 'A' ... 'Z':
|
||||
t = (*nptr - 'A') + 10;
|
||||
break;
|
||||
default:
|
||||
t = 1000;
|
||||
break;
|
||||
}
|
||||
|
||||
if(t>=base)
|
||||
break;
|
||||
|
||||
r*=base;
|
||||
r+=t;
|
||||
nptr++;
|
||||
}
|
||||
|
||||
if(endptr)*endptr = (char*)nptr;
|
||||
return n?-r:r;
|
||||
}
|
||||
|
||||
long strtol(const char *nptr, char **endptr, int base)
|
||||
{
|
||||
return (long)strtoll(nptr, endptr, base);
|
||||
}
|
||||
|
||||
unsigned long strtoul(const char *nptr, char **endptr, int base)
|
||||
{
|
||||
return strtoull(nptr, endptr, base);
|
||||
}
|
||||
|
||||
double strtod(const char *nptr, char **endptr)
|
||||
{
|
||||
char strbuf[64];
|
||||
|
|
Loading…
Reference in New Issue