Imported Upstream version 2.9.0
[debian/cc1111] / device / lib / _atof.c
1 /*  atof.c: converts an ASCII string to float
2
3     Copyright (C) 2003  Jesus Calvino-Fraga, jesusc@ieee.org
4
5     This library is free software; you can redistribute it and/or
6     modify it under the terms of the GNU Lesser General Public
7     License as published by the Free Software Foundation; either
8     version 2.1 of the License, or (at your option) any later version.
9
10     This library is distributed in the hope that it will be useful,
11     but WITHOUT ANY WARRANTY; without even the implied warranty of
12     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13     Lesser General Public License for more details.
14
15     You should have received a copy of the GNU Lesser General Public
16     License along with this library; if not, write to the Free Software
17     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA */
18
19 #include <ctype.h>
20 #include <stdlib.h>
21 #include <stdbool.h>
22
23 float atof(char * s)
24 {
25         float value, fraction;
26         char iexp;
27         BOOL sign;
28
29         //Skip leading blanks
30         while (isspace(*s)) s++;
31
32         //Get the sign
33         if (*s == '-')
34         {
35                 sign=1;
36                 s++;
37         }
38         else
39         {
40                 sign=0;
41                 if (*s == '+') s++;
42         }
43
44         //Get the integer part
45         for (value=0.0; isdigit(*s); s++)
46         {
47                 value=10.0*value+(*s-'0');
48         }
49
50         //Get the fraction
51         if (*s == '.')
52         {
53                 s++;
54                 for (fraction=0.1; isdigit(*s); s++)
55                 {
56                         value+=(*s-'0')*fraction;
57                         fraction*=0.1;
58                 }
59         }
60
61         //Finally, the exponent (not very efficient, but enough for now*/
62         if (toupper(*s)=='E')
63         {
64                 s++;
65                 iexp=(char)atoi(s);
66                 {
67                         while(iexp!=0)
68                         {
69                                 if(iexp<0)
70                                 {
71                                         value*=0.1;
72                                         iexp++;
73                                 }
74                                 else
75                                 {
76                                         value*=10.0;
77                                         iexp--;
78                                 }
79                         }
80                 }
81         }
82
83         if(sign) value*=-1.0;
84         return (value);
85 }