148399Sbostic /*-
2*61241Sbostic * Copyright (c) 1991, 1993
3*61241Sbostic * The Regents of the University of California. All rights reserved.
448399Sbostic *
548399Sbostic * %sccs.include.proprietary.c%
648399Sbostic */
748399Sbostic
826553Sdonn #if defined(LIBC_SCCS) && !defined(lint)
9*61241Sbostic static char sccsid[] = "@(#)gcvt.c 8.1 (Berkeley) 06/04/93";
1048399Sbostic #endif /* LIBC_SCCS and not lint */
1122089Smckusick
122012Swnj /*
132012Swnj * gcvt - Floating output conversion to
142012Swnj * minimal length string
152012Swnj */
162012Swnj
172012Swnj char *ecvt();
182012Swnj
192012Swnj char *
gcvt(number,ndigit,buf)202012Swnj gcvt(number, ndigit, buf)
212012Swnj double number;
222012Swnj char *buf;
232012Swnj {
242012Swnj int sign, decpt;
252012Swnj register char *p1, *p2;
262012Swnj register i;
272012Swnj
282012Swnj p1 = ecvt(number, ndigit, &decpt, &sign);
292012Swnj p2 = buf;
302012Swnj if (sign)
312012Swnj *p2++ = '-';
322012Swnj for (i=ndigit-1; i>0 && p1[i]=='0'; i--)
332012Swnj ndigit--;
342012Swnj if (decpt >= 0 && decpt-ndigit > 4
352012Swnj || decpt < 0 && decpt < -3) { /* use E-style */
362012Swnj decpt--;
372012Swnj *p2++ = *p1++;
382012Swnj *p2++ = '.';
392012Swnj for (i=1; i<ndigit; i++)
402012Swnj *p2++ = *p1++;
412012Swnj *p2++ = 'e';
422012Swnj if (decpt<0) {
432012Swnj decpt = -decpt;
442012Swnj *p2++ = '-';
452012Swnj } else
462012Swnj *p2++ = '+';
472012Swnj *p2++ = decpt/10 + '0';
482012Swnj *p2++ = decpt%10 + '0';
492012Swnj } else {
502012Swnj if (decpt<=0) {
512012Swnj if (*p1!='0')
522012Swnj *p2++ = '.';
532012Swnj while (decpt<0) {
542012Swnj decpt++;
552012Swnj *p2++ = '0';
562012Swnj }
572012Swnj }
582012Swnj for (i=1; i<=ndigit; i++) {
592012Swnj *p2++ = *p1++;
602012Swnj if (i==decpt)
612012Swnj *p2++ = '.';
622012Swnj }
632012Swnj if (ndigit<decpt) {
642012Swnj while (ndigit++<decpt)
652012Swnj *p2++ = '0';
662012Swnj *p2++ = '.';
672012Swnj }
682012Swnj }
692012Swnj if (p2[-1]=='.')
702012Swnj p2--;
712012Swnj *p2 = '\0';
722012Swnj return(buf);
732012Swnj }
74