Files
photon/libc/stdlib/strtod.c

92 lines
1.9 KiB
C

#include <stdlib.h>
#include <string.h>
#include <ctype.h>
double strtod(const char *str, char **ptr)
{
if (ptr == (char **)0) {
return atof(str);
}
size_t len = strlen(str);
char rstr[len + 1];
strcpy(rstr, str);
char *p = rstr;
while (isspace(*p)) {
++p;
}
if (*p == '+' || *p == '-') {
++p;
}
if ((p[0] == 'i' || p[0] == 'I')
&& (p[1] == 'n' || p[1] == 'N')
&& (p[2] == 'f' || p[2] == 'F')) {
if ((p[3] == 'i' || p[3] == 'I')
&& (p[4] == 'n' || p[4] == 'N')
&& (p[5] == 'i' || p[5] == 'I')
&& (p[6] == 't' || p[6] == 'T')
&& (p[7] == 'y' || p[7] == 'Y')) {
*ptr = p + 8;
return atof(str);
} else {
*ptr = p + 3;
return atof(str);
}
}
if ((p[0] == 'n' || p[0] == 'N')
&& (p[1] == 'a' || p[1] == 'A')
&& (p[2] == 'n' || p[2] == 'N')) {
p += 3;
if (*p == '(') {
++p;
while (*p != '\0' && *p != ')') {
++p;
}
if (*p == ')') {
++p;
}
}
*ptr = p;
return atof(str);
}
if (isdigit(*p) || *p == '.') {
int got_dot = 0;
while (isdigit(*p) || (!got_dot && *p == '.')) {
if (*p == '.')
got_dot = 1;
++p;
}
if (*p == 'e' || *p == 'E') {
int i;
i = 1;
if (p[i] == '+' || p[i] == '-') {
++i;
}
if (isdigit (p[i])) {
while (isdigit (p[i])) {
++i;
}
*ptr = p + i;
return atof(str);
}
}
*ptr = p;
return atof(str);
}
*ptr = (char *)str;
return 0.0;
}