1*22089Smckusick #ifndef lint 2*22089Smckusick static char sccsid[] = "@(#)gcvt.c 5.1 (Berkeley) 06/05/85"; 3*22089Smckusick #endif not lint 4*22089Smckusick 52012Swnj /* 62012Swnj * gcvt - Floating output conversion to 72012Swnj * minimal length string 82012Swnj */ 92012Swnj 102012Swnj char *ecvt(); 112012Swnj 122012Swnj char * 132012Swnj gcvt(number, ndigit, buf) 142012Swnj double number; 152012Swnj char *buf; 162012Swnj { 172012Swnj int sign, decpt; 182012Swnj register char *p1, *p2; 192012Swnj register i; 202012Swnj 212012Swnj p1 = ecvt(number, ndigit, &decpt, &sign); 222012Swnj p2 = buf; 232012Swnj if (sign) 242012Swnj *p2++ = '-'; 252012Swnj for (i=ndigit-1; i>0 && p1[i]=='0'; i--) 262012Swnj ndigit--; 272012Swnj if (decpt >= 0 && decpt-ndigit > 4 282012Swnj || decpt < 0 && decpt < -3) { /* use E-style */ 292012Swnj decpt--; 302012Swnj *p2++ = *p1++; 312012Swnj *p2++ = '.'; 322012Swnj for (i=1; i<ndigit; i++) 332012Swnj *p2++ = *p1++; 342012Swnj *p2++ = 'e'; 352012Swnj if (decpt<0) { 362012Swnj decpt = -decpt; 372012Swnj *p2++ = '-'; 382012Swnj } else 392012Swnj *p2++ = '+'; 402012Swnj *p2++ = decpt/10 + '0'; 412012Swnj *p2++ = decpt%10 + '0'; 422012Swnj } else { 432012Swnj if (decpt<=0) { 442012Swnj if (*p1!='0') 452012Swnj *p2++ = '.'; 462012Swnj while (decpt<0) { 472012Swnj decpt++; 482012Swnj *p2++ = '0'; 492012Swnj } 502012Swnj } 512012Swnj for (i=1; i<=ndigit; i++) { 522012Swnj *p2++ = *p1++; 532012Swnj if (i==decpt) 542012Swnj *p2++ = '.'; 552012Swnj } 562012Swnj if (ndigit<decpt) { 572012Swnj while (ndigit++<decpt) 582012Swnj *p2++ = '0'; 592012Swnj *p2++ = '.'; 602012Swnj } 612012Swnj } 622012Swnj if (p2[-1]=='.') 632012Swnj p2--; 642012Swnj *p2 = '\0'; 652012Swnj return(buf); 662012Swnj } 67