home *** CD-ROM | disk | FTP | other *** search
/ minnie.tuhs.org / unixen.tar / unixen / PDP-11 / Trees / V7 / usr / src / libc / gen / ecvt.c < prev    next >
Encoding:
Text File  |  1979-01-10  |  1.6 KB  |  105 lines

  1. /*
  2.  *    ecvt converts to decimal
  3.  *    the number of digits is specified by ndigit
  4.  *    decpt is set to the position of the decimal point
  5.  *    sign is set to 0 for positive, 1 for negative
  6.  */
  7.  
  8. char    *cvt();
  9.  
  10. #define    NDIG    80
  11. char*
  12. ecvt(arg, ndigits, decpt, sign)
  13. double arg;
  14. int ndigits, *decpt, *sign;
  15. {
  16.     return(cvt(arg, ndigits, decpt, sign, 1));
  17. }
  18.  
  19. char*
  20. fcvt(arg, ndigits, decpt, sign)
  21. double arg;
  22. int ndigits, *decpt, *sign;
  23. {
  24.     return(cvt(arg, ndigits, decpt, sign, 0));
  25. }
  26.  
  27. static char*
  28. cvt(arg, ndigits, decpt, sign, eflag)
  29. double arg;
  30. int ndigits, *decpt, *sign;
  31. {
  32.     register int r2;
  33.     double fi, fj;
  34.     register char *p, *p1;
  35.     static char buf[NDIG];
  36.     double modf();
  37.  
  38.     if (ndigits<0)
  39.         ndigits = 0;
  40.     if (ndigits>=NDIG-1)
  41.         ndigits = NDIG-2;
  42.     r2 = 0;
  43.     *sign = 0;
  44.     p = &buf[0];
  45.     if (arg<0) {
  46.         *sign = 1;
  47.         arg = -arg;
  48.     }
  49.     arg = modf(arg, &fi);
  50.     p1 = &buf[NDIG];
  51.     /*
  52.      * Do integer part
  53.      */
  54.     if (fi != 0) {
  55.         p1 = &buf[NDIG];
  56.         while (fi != 0) {
  57.             fj = modf(fi/10, &fi);
  58.             *--p1 = (int)((fj+.03)*10) + '0';
  59.             r2++;
  60.         }
  61.         while (p1 < &buf[NDIG])
  62.             *p++ = *p1++;
  63.     } else if (arg > 0) {
  64.         while ((fj = arg*10) < 1) {
  65.             arg = fj;
  66.             r2--;
  67.         }
  68.     }
  69.     p1 = &buf[ndigits];
  70.     if (eflag==0)
  71.         p1 += r2;
  72.     *decpt = r2;
  73.     if (p1 < &buf[0]) {
  74.         buf[0] = '\0';
  75.         return(buf);
  76.     }
  77.     while (p<=p1 && p<&buf[NDIG]) {
  78.         arg *= 10;
  79.         arg = modf(arg, &fj);
  80.         *p++ = (int)fj + '0';
  81.     }
  82.     if (p1 >= &buf[NDIG]) {
  83.         buf[NDIG-1] = '\0';
  84.         return(buf);
  85.     }
  86.     p = p1;
  87.     *p1 += 5;
  88.     while (*p1 > '9') {
  89.         *p1 = '0';
  90.         if (p1>buf)
  91.             ++*--p1;
  92.         else {
  93.             *p1 = '1';
  94.             (*decpt)++;
  95.             if (eflag==0) {
  96.                 if (p>buf)
  97.                     *p = '0';
  98.                 p++;
  99.             }
  100.         }
  101.     }
  102.     *p = '\0';
  103.     return(buf);
  104. }
  105.