3
/* Convert a Sfdouble_t value represented in an ASCII format into
4
** the internal Sfdouble_t representation.
6
** Written by Kiem-Phong Vo.
9
#define BATCH (2*sizeof(int)) /* accumulate this many digits at a time */
10
#define IPART 0 /* doing integer part */
11
#define FPART 1 /* doing fractional part */
12
#define EPART 2 /* doing exponent part */
15
static Sfdouble_t sfpow10(reg int n)
17
static Sfdouble_t sfpow10(n)
24
{ case -3: return .001;
35
for(n += 4; n < 0; n += 1)
40
for(n -= 4; n > 0; n -= 1)
48
Sfdouble_t _sfstrtod(reg const char* s, char** retp)
50
Sfdouble_t _sfstrtod(s,retp)
51
reg char* s; /* string to convert */
52
char** retp; /* to return the remainder of string */
56
reg int mode, fexp, sign, expsign;
60
SFSETLOCALE(&decpoint,NIL(int*));
65
/* skip initial blanks */
70
if((sign = (*s == '-')) || *s == '+')
77
{ /* accumulate a handful of the digits */
78
for(m = BATCH, n = 0; m > 0; --m, ++s)
79
{ /* get and process a char */
86
/* number of digits accumulated */
90
{ /* doing the integer part */
93
else dval = dval*sfpow10(m) + (Sfdouble_t)n;
95
else if(mode == FPART)
96
{ /* doing the fractional part */
99
dval += n*sfpow10(fexp);
102
{ /* doing the exponent part */
112
{ /* detected a non-digit */
114
{ /* start the fractional part or no match */
120
else if(c == 'e' || c == 'E')
125
if((expsign = (c == '-')) || c == '+')
134
return sign ? -dval : dval;