12b7e04a9d934afdedde936f2806a6723e62777deGuido van Rossum
22b7e04a9d934afdedde936f2806a6723e62777deGuido van Rossum/* Just in case you haven't got an atof() around...
32b7e04a9d934afdedde936f2806a6723e62777deGuido van Rossum   This one doesn't check for bad syntax or overflow,
42b7e04a9d934afdedde936f2806a6723e62777deGuido van Rossum   and is slow and inaccurate.
52b7e04a9d934afdedde936f2806a6723e62777deGuido van Rossum   But it's good enough for the occasional string literal... */
62b7e04a9d934afdedde936f2806a6723e62777deGuido van Rossum
74f1cd8bdcbd20bb0acdbe9e240f28c09dd38370fMartin v. Löwis#include "pyconfig.h"
82b7e04a9d934afdedde936f2806a6723e62777deGuido van Rossum
92b7e04a9d934afdedde936f2806a6723e62777deGuido van Rossum#include <ctype.h>
102b7e04a9d934afdedde936f2806a6723e62777deGuido van Rossum
11f70ef4f8606f99744252a804229d53a4d97601c1Thomas Woutersdouble atof(char *s)
122b7e04a9d934afdedde936f2806a6723e62777deGuido van Rossum{
13c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    double a = 0.0;
14c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    int e = 0;
15c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    int c;
16c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    while ((c = *s++) != '\0' && isdigit(c)) {
17c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        a = a*10.0 + (c - '0');
18c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
19c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (c == '.') {
20c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        while ((c = *s++) != '\0' && isdigit(c)) {
21c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            a = a*10.0 + (c - '0');
22c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            e = e-1;
23c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
24c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
25c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (c == 'e' || c == 'E') {
26c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        int sign = 1;
27c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        int i = 0;
28c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        c = *s++;
29c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (c == '+')
30c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            c = *s++;
31c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        else if (c == '-') {
32c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            c = *s++;
33c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            sign = -1;
34c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
35c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        while (isdigit(c)) {
36c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            i = i*10 + (c - '0');
37c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            c = *s++;
38c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
39c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        e += i*sign;
40c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
41c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    while (e > 0) {
42c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        a *= 10.0;
43c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        e--;
44c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
45c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    while (e < 0) {
46c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        a *= 0.1;
47c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        e++;
48c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
49c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return a;
502b7e04a9d934afdedde936f2806a6723e62777deGuido van Rossum}
51