meta: move photon/libc to root
This commit is contained in:
91
libc/stdlib/strtod.c
Normal file
91
libc/stdlib/strtod.c
Normal file
@@ -0,0 +1,91 @@
|
||||
#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;
|
||||
}
|
||||
Reference in New Issue
Block a user