Annotation of researchv9/libc/gen/ecvt.c, revision 1.1.1.1

1.1       root        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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.