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);
|
int abs(int x);
|
||||||
long long strtoll(const char *nptr, char **endptr, int base);
|
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);
|
long strtol(const char *nptr, char **endptr, int base);
|
||||||
double strtod(const char *nptr, char **endptr);
|
double strtod(const char *nptr, char **endptr);
|
||||||
long double strtold(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;
|
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)
|
long strtol(const char *nptr, char **endptr, int base)
|
||||||
{
|
{
|
||||||
return (long)strtoll(nptr, endptr, 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)
|
double strtod(const char *nptr, char **endptr)
|
||||||
{
|
{
|
||||||
char strbuf[64];
|
char strbuf[64];
|
||||||
|
|
Loading…
Reference in New Issue