Blob


1 /* Copyright (c) 2002-2006 Lucent Technologies; see LICENSE */
2 #include <stdarg.h>
3 #include <string.h>
4 #include "plan9.h"
5 #include "fmt.h"
6 #include "fmtdef.h"
8 /*
9 * Reads a floating-point number by interpreting successive characters
10 * returned by (*f)(vp). The last call it makes to f terminates the
11 * scan, so is not a character in the number. It may therefore be
12 * necessary to back up the input stream up one byte after calling charstod.
13 */
15 double
16 fmtcharstod(int(*f)(void*), void *vp)
17 {
18 double num, dem;
19 int neg, eneg, dig, exp, c;
21 num = 0;
22 neg = 0;
23 dig = 0;
24 exp = 0;
25 eneg = 0;
27 c = (*f)(vp);
28 while(c == ' ' || c == '\t')
29 c = (*f)(vp);
30 if(c == '-' || c == '+'){
31 if(c == '-')
32 neg = 1;
33 c = (*f)(vp);
34 }
35 while(c >= '0' && c <= '9'){
36 num = num*10 + c-'0';
37 c = (*f)(vp);
38 }
39 if(c == '.')
40 c = (*f)(vp);
41 while(c >= '0' && c <= '9'){
42 num = num*10 + c-'0';
43 dig++;
44 c = (*f)(vp);
45 }
46 if(c == 'e' || c == 'E'){
47 c = (*f)(vp);
48 if(c == '-' || c == '+'){
49 if(c == '-'){
50 dig = -dig;
51 eneg = 1;
52 }
53 c = (*f)(vp);
54 }
55 while(c >= '0' && c <= '9'){
56 exp = exp*10 + c-'0';
57 c = (*f)(vp);
58 }
59 }
60 exp -= dig;
61 if(exp < 0){
62 exp = -exp;
63 eneg = !eneg;
64 }
65 dem = __fmtpow10(exp);
66 if(eneg)
67 num /= dem;
68 else
69 num *= dem;
70 if(neg)
71 return -num;
72 return num;
73 }