1*2012Swnj /* @(#)gcvt.c 4.1 (Berkeley) 12/21/80 */ 2*2012Swnj /* 3*2012Swnj * gcvt - Floating output conversion to 4*2012Swnj * minimal length string 5*2012Swnj */ 6*2012Swnj 7*2012Swnj char *ecvt(); 8*2012Swnj 9*2012Swnj char * 10*2012Swnj gcvt(number, ndigit, buf) 11*2012Swnj double number; 12*2012Swnj char *buf; 13*2012Swnj { 14*2012Swnj int sign, decpt; 15*2012Swnj register char *p1, *p2; 16*2012Swnj register i; 17*2012Swnj 18*2012Swnj p1 = ecvt(number, ndigit, &decpt, &sign); 19*2012Swnj p2 = buf; 20*2012Swnj if (sign) 21*2012Swnj *p2++ = '-'; 22*2012Swnj for (i=ndigit-1; i>0 && p1[i]=='0'; i--) 23*2012Swnj ndigit--; 24*2012Swnj if (decpt >= 0 && decpt-ndigit > 4 25*2012Swnj || decpt < 0 && decpt < -3) { /* use E-style */ 26*2012Swnj decpt--; 27*2012Swnj *p2++ = *p1++; 28*2012Swnj *p2++ = '.'; 29*2012Swnj for (i=1; i<ndigit; i++) 30*2012Swnj *p2++ = *p1++; 31*2012Swnj *p2++ = 'e'; 32*2012Swnj if (decpt<0) { 33*2012Swnj decpt = -decpt; 34*2012Swnj *p2++ = '-'; 35*2012Swnj } else 36*2012Swnj *p2++ = '+'; 37*2012Swnj *p2++ = decpt/10 + '0'; 38*2012Swnj *p2++ = decpt%10 + '0'; 39*2012Swnj } else { 40*2012Swnj if (decpt<=0) { 41*2012Swnj if (*p1!='0') 42*2012Swnj *p2++ = '.'; 43*2012Swnj while (decpt<0) { 44*2012Swnj decpt++; 45*2012Swnj *p2++ = '0'; 46*2012Swnj } 47*2012Swnj } 48*2012Swnj for (i=1; i<=ndigit; i++) { 49*2012Swnj *p2++ = *p1++; 50*2012Swnj if (i==decpt) 51*2012Swnj *p2++ = '.'; 52*2012Swnj } 53*2012Swnj if (ndigit<decpt) { 54*2012Swnj while (ndigit++<decpt) 55*2012Swnj *p2++ = '0'; 56*2012Swnj *p2++ = '.'; 57*2012Swnj } 58*2012Swnj } 59*2012Swnj if (p2[-1]=='.') 60*2012Swnj p2--; 61*2012Swnj *p2 = '\0'; 62*2012Swnj return(buf); 63*2012Swnj } 64