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

Defined functions

cvt defined in line 28; used 3 times

Defined macros

NDIG defined in line 11; used 9 times
Last modified: 1981-07-10
Generated: 2016-12-26
Generated by src2html V0.67
page hit count: 648
Valid CSS Valid XHTML 1.0 Strict