Annotation of 43BSDTahoe/lib/libc/compat-4.3/ecvt.c, revision 1.1.1.1

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

unix.superglobalmegacorp.com

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