1*26889Smckusick #if defined(LIBC_SCCS) && !defined(lint) 2*26889Smckusick static char sccsid[] = "@(#)ecvt.c 5.1 (Berkeley) 03/15/86"; 3*26889Smckusick #endif LIBC_SCCS and not lint 4*26889Smckusick 51963Swnj /* 61963Swnj * ecvt converts to decimal 71963Swnj * the number of digits is specified by ndigit 81963Swnj * decpt is set to the position of the decimal point 91963Swnj * sign is set to 0 for positive, 1 for negative 101963Swnj */ 111963Swnj 121963Swnj char *cvt(); 131963Swnj 141963Swnj #define NDIG 80 151963Swnj char* 161963Swnj ecvt(arg, ndigits, decpt, sign) 171963Swnj double arg; 181963Swnj int ndigits, *decpt, *sign; 191963Swnj { 201963Swnj return(cvt(arg, ndigits, decpt, sign, 1)); 211963Swnj } 221963Swnj 231963Swnj char* 241963Swnj fcvt(arg, ndigits, decpt, sign) 251963Swnj double arg; 261963Swnj int ndigits, *decpt, *sign; 271963Swnj { 281963Swnj return(cvt(arg, ndigits, decpt, sign, 0)); 291963Swnj } 301963Swnj 311963Swnj static char* 321963Swnj cvt(arg, ndigits, decpt, sign, eflag) 331963Swnj double arg; 341963Swnj int ndigits, *decpt, *sign; 351963Swnj { 361963Swnj register int r2; 371963Swnj double fi, fj; 381963Swnj register char *p, *p1; 391963Swnj static char buf[NDIG]; 401963Swnj double modf(); 411963Swnj 421963Swnj if (ndigits<0) 431963Swnj ndigits = 0; 441963Swnj if (ndigits>=NDIG-1) 451963Swnj ndigits = NDIG-2; 461963Swnj r2 = 0; 471963Swnj *sign = 0; 481963Swnj p = &buf[0]; 491963Swnj if (arg<0) { 501963Swnj *sign = 1; 511963Swnj arg = -arg; 521963Swnj } 531963Swnj arg = modf(arg, &fi); 541963Swnj p1 = &buf[NDIG]; 551963Swnj /* 561963Swnj * Do integer part 571963Swnj */ 581963Swnj if (fi != 0) { 591963Swnj p1 = &buf[NDIG]; 601963Swnj while (fi != 0) { 611963Swnj fj = modf(fi/10, &fi); 621963Swnj *--p1 = (int)((fj+.03)*10) + '0'; 631963Swnj r2++; 641963Swnj } 651963Swnj while (p1 < &buf[NDIG]) 661963Swnj *p++ = *p1++; 671963Swnj } else if (arg > 0) { 681963Swnj while ((fj = arg*10) < 1) { 691963Swnj arg = fj; 701963Swnj r2--; 711963Swnj } 721963Swnj } 731963Swnj p1 = &buf[ndigits]; 741963Swnj if (eflag==0) 751963Swnj p1 += r2; 761963Swnj *decpt = r2; 771963Swnj if (p1 < &buf[0]) { 781963Swnj buf[0] = '\0'; 791963Swnj return(buf); 801963Swnj } 811963Swnj while (p<=p1 && p<&buf[NDIG]) { 821963Swnj arg *= 10; 831963Swnj arg = modf(arg, &fj); 841963Swnj *p++ = (int)fj + '0'; 851963Swnj } 861963Swnj if (p1 >= &buf[NDIG]) { 871963Swnj buf[NDIG-1] = '\0'; 881963Swnj return(buf); 891963Swnj } 901963Swnj p = p1; 911963Swnj *p1 += 5; 921963Swnj while (*p1 > '9') { 931963Swnj *p1 = '0'; 941963Swnj if (p1>buf) 951963Swnj ++*--p1; 961963Swnj else { 971963Swnj *p1 = '1'; 981963Swnj (*decpt)++; 991963Swnj if (eflag==0) { 1001963Swnj if (p>buf) 1011963Swnj *p = '0'; 1021963Swnj p++; 1031963Swnj } 1041963Swnj } 1051963Swnj } 1061963Swnj *p = '\0'; 1071963Swnj return(buf); 1081963Swnj } 109