92 lines
1.9 KiB
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;
|
|
}
|