Imported Upstream version 2.9.0
[debian/cc1111] / device / lib / pic16 / libc / stdlib / 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
22 float atof(char * s)
23 {
24         float value, fraction;
25         char iexp;
26         char sign;
27
28         //Skip leading blanks
29         while (isspace(*s)) s++;
30
31         //Get the sign
32         if (*s == '-')
33         {
34                 sign=1;
35                 s++;
36         }
37         else
38         {
39                 sign=0;
40                 if (*s == '+') s++;
41         }
42
43         //Get the integer part
44         for (value=0.0; isdigit(*s); s++)
45         {
46                 value=10.0*value+(*s-'0');
47         }
48
49         //Get the fraction
50         if (*s == '.')
51         {
52                 s++;
53                 for (fraction=0.1; isdigit(*s); s++)
54                 {
55                         value+=(*s-'0')*fraction;
56                         fraction*=0.1;
57                 }
58         }
59
60         //Finally, the exponent (not very efficient, but enough for now*/
61         if (toupper(*s)=='E')
62         {
63                 s++;
64                 iexp=(char)atoi(s);
65                 {
66                         while(iexp!=0)
67                         {
68                                 if(iexp<0)
69                                 {
70                                         value*=0.1;
71                                         iexp++;
72                                 }
73                                 else
74                                 {
75                                         value*=10.0;
76                                         iexp--;
77                                 }
78                         }
79                 }
80         }
81
82         if(sign) value*=-1.0;
83         return (value);
84 }