Provide implementations for strtoul(3) and strtoull(3)

This commit is contained in:
Xavier Del Campo Romero 2021-10-24 02:50:44 +02:00
parent eaff9ccf1d
commit cbd551e8a3
2 changed files with 63 additions and 0 deletions

View File

@ -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);

View File

@ -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];