Subversion Repositories Kolibri OS

Rev

Rev 9230 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
9765 turbocat 1
/* Copyright (C) 1994 DJ Delorie, see COPYING.DJ for details */
9230 turbocat 2
#include 
3
 
9765 turbocat 4
#ifndef unconst
5
#define unconst(__v, __t) __extension__({union { const __t __cp; __t __p; } __q; __q.__cp = __v; __q.__p; })
6
#endif
9230 turbocat 7
 
9765 turbocat 8
double strtod(const char* s, char** sret)
9230 turbocat 9
{
9765 turbocat 10
    long double r; /* result */
11
    int e; /* exponent */
12
    long double d; /* scale */
13
    int sign; /* +- 1.0 */
9230 turbocat 14
    int esign;
15
    int i;
9765 turbocat 16
    int flags = 0;
9230 turbocat 17
 
18
    r = 0.0;
19
    sign = 1.0;
20
    e = 0;
21
    esign = 1;
22
 
23
    while ((*s == ' ') || (*s == '\t'))
24
        s++;
9765 turbocat 25
 
9230 turbocat 26
    if (*s == '+')
27
        s++;
9765 turbocat 28
    else if (*s == '-') {
9230 turbocat 29
        sign = -1;
30
        s++;
31
    }
32
 
9765 turbocat 33
    while ((*s >= '0') && (*s <= '9')) {
9230 turbocat 34
        flags |= 1;
35
        r *= 10.0;
36
        r += *s - '0';
37
        s++;
38
    }
39
 
9765 turbocat 40
    if (*s == '.') {
9230 turbocat 41
        d = 0.1L;
42
        s++;
9765 turbocat 43
 
44
        while ((*s >= '0') && (*s <= '9')) {
9230 turbocat 45
            flags |= 2;
46
            r += d * (*s - '0');
47
            s++;
48
            d *= 0.1L;
49
        }
50
    }
51
 
9765 turbocat 52
    if (flags == 0) {
9230 turbocat 53
        if (sret)
9765 turbocat 54
            *sret = unconst(s, char*);
9230 turbocat 55
        return 0;
56
    }
57
 
9765 turbocat 58
    if ((*s == 'e') || (*s == 'E')) {
9230 turbocat 59
        s++;
60
        if (*s == '+')
61
            s++;
9765 turbocat 62
        else if (*s == '-') {
9230 turbocat 63
            s++;
64
            esign = -1;
65
        }
9765 turbocat 66
 
67
        if ((*s < '0') || (*s > '9')) {
9230 turbocat 68
            if (sret)
9765 turbocat 69
                *sret = unconst(s, char*);
9230 turbocat 70
            return r;
71
        }
72
 
9765 turbocat 73
        while ((*s >= '0') && (*s <= '9')) {
9230 turbocat 74
            e *= 10;
75
            e += *s - '0';
76
            s++;
77
        }
78
    }
79
    if (esign < 0)
80
        for (i = 1; i <= e; i++)
81
            r *= 0.1L;
82
    else
83
        for (i = 1; i <= e; i++)
84
            r *= 10.0;
85
 
86
    if (sret)
9765 turbocat 87
        *sret = unconst(s, char*);
9230 turbocat 88
    return r * sign;
9765 turbocat 89
}