From: jesusc Date: Sat, 7 Jun 2003 22:22:21 +0000 (+0000) Subject: added atof X-Git-Url: https://git.gag.com/?a=commitdiff_plain;h=ccc1ef43069661e6161d4871d4a44031bd133eb3;p=fw%2Fsdcc added atof git-svn-id: https://sdcc.svn.sourceforge.net/svnroot/sdcc/trunk/sdcc@2677 4a8a32a2-be11-0410-ad9d-d568d2c75423 --- diff --git a/device/include/stdlib.h b/device/include/stdlib.h index 80c363ac..c267b63a 100644 --- a/device/include/stdlib.h +++ b/device/include/stdlib.h @@ -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 index 00000000..ee7ff24b --- /dev/null +++ b/device/lib/_atof.c @@ -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 +#include + +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); +} diff --git a/device/lib/libfloat.lib b/device/lib/libfloat.lib index 20f89112..9b2a061a 100644 --- a/device/lib/libfloat.lib +++ b/device/lib/libfloat.lib @@ -1,3 +1,4 @@ +_atof _fsadd _fsdiv _fseq