--- gforth/engine/ecvt.c 1998/05/02 21:29:02 1.2 +++ gforth/engine/ecvt.c 2007/12/31 18:40:25 1.10 @@ -1,4 +1,22 @@ -/* cheap ecvt replacement */ +/* cheap ecvt replacement + + Copyright (C) 1998,2000,2007 Free Software Foundation, Inc. + + This file is part of Gforth. + + Gforth is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation, either version 3 + of the License, or (at your option) any later version. + + This program 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 General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, see http://www.gnu.org/licenses/. +*/ #include #include "config.h" @@ -13,8 +31,21 @@ char* ecvt(double x, int len, int* exp, { int i, j; double z; - fprintf(stderr, "using own ecvt\n"); + if (isnan(x)) { + *sign=0; + *exp=0; + return "nan"; + } + if (isinf(x)) { + *sign=0; /* this mimics the glibc ecvt */ + *exp=0; + if (x<0) + return "-inf"; + else + return "inf"; + } + if(len > (MAXCONV-1)) len = MAXCONV-1; if(x<0) @@ -38,6 +69,7 @@ char* ecvt(double x, int len, int* exp, for(i=0; i < len; i++) { z=floor(x); + if(z<0) z = 0; scratch[i]='0'+(char)((int)z); x = (x-z)*10; } @@ -76,3 +108,4 @@ int main(int argc, char ** argv) printf("ecvt Test: %f -> %s, %d, %d\n",9e0,conv,a,b); } #endif +