added atof
authorjesusc <jesusc@4a8a32a2-be11-0410-ad9d-d568d2c75423>
Sat, 7 Jun 2003 22:22:21 +0000 (22:22 +0000)
committerjesusc <jesusc@4a8a32a2-be11-0410-ad9d-d568d2c75423>
Sat, 7 Jun 2003 22:22:21 +0000 (22:22 +0000)
git-svn-id: https://sdcc.svn.sourceforge.net/svnroot/sdcc/trunk/sdcc@2677 4a8a32a2-be11-0410-ad9d-d568d2c75423

device/include/stdlib.h
device/lib/_atof.c [new file with mode: 0644]
device/lib/libfloat.lib

index 80c363ac7f874ea83154039925aae1bbbd7f165c..c267b63afb9890181ad4716fd0724c27daa44d23 100644 (file)
@@ -29,6 +29,7 @@
 # define NULL (void *)0
 #endif
 
+extern float atof (char *);
 extern int atoi (char *);
 extern long atol (char *);
 
diff --git a/device/lib/_atof.c b/device/lib/_atof.c
new file mode 100644 (file)
index 0000000..ee7ff24
--- /dev/null
@@ -0,0 +1,89 @@
+/*  atof.c: converts an ASCII string to float
+
+    Copyright (C) 2003  Jesus Calvino-Fraga, jesusc@ieee.org 
+
+    This library is free software; you can redistribute it and/or
+    modify it under the terms of the GNU Lesser General Public
+    License as published by the Free Software Foundation; either
+    version 2.1 of the License, or (at your option) any later version.
+
+    This library is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+    Lesser General Public License for more details.
+
+    You should have received a copy of the GNU Lesser General Public
+    License along with this library; if not, write to the Free Software
+    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA */
+
+#include <ctype.h>
+#include <stdlib.h>
+
+float atof(char * s)
+{
+       float value, fraction;
+       char iexp;
+#ifdef SDCC_mcs51
+       bit sign;
+#else
+       char sign;
+#endif
+
+       //Skip leading blanks
+       while (isspace(*s)) s++;
+
+       //Get the sign
+       if (*s == '-')
+       {
+               sign=1;
+               s++;
+       }
+       else
+       {
+               sign=0;
+               if (*s == '+') s++;
+       }
+
+       //Get the integer part
+       for (value=0.0; isdigit(*s); s++)
+       {
+               value=10.0*value+(*s-'0');
+       }
+
+       //Get the fraction
+       if (*s=='.')
+       {
+               s++;
+               for (fraction=10.0; isdigit(*s); s++)
+               {
+                       value+=(*s-'0')/fraction;
+                       fraction*=10.0;
+               }
+       }
+
+       //Finally, the exponent (not very efficient, but enough for now*/
+       if (toupper(*s)=='E')
+       {
+               s++;
+               while(*s=='0') s++;//So atoi doesn't return an octal number
+               iexp=(char)atoi(s);
+               {
+                       while(iexp!=0)
+                       {
+                               if(iexp<0)
+                               {
+                                       value/=10.0;
+                                       iexp++;
+                               }
+                               else
+                               {
+                                       value*=10.0;
+                                       iexp--;
+                               }
+                       }
+               }
+       }
+
+       if(sign) value*=-1.0;
+       return (value);
+}
index 20f89112b7f1fb0763b15a32e97d8db173ff1cf5..9b2a061ace0a113ad46eba5233d3a24cb5ee17f7 100644 (file)
@@ -1,3 +1,4 @@
+_atof
 _fsadd
 _fsdiv
 _fseq