home *** CD-ROM | disk | FTP | other *** search
/ minnie.tuhs.org / unixen.tar / unixen / PDP-11 / Trees / V7 / usr / src / libc / stdio / gcvt.c < prev    next >
Encoding:
C/C++ Source or Header  |  1979-01-10  |  1010 b   |  63 lines

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