Annotation of 43BSDReno/lib/libcompat/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.2 (Berkeley) 6/24/90";
                      3: #endif LIBC_SCCS and not lint
                      4: 
                      5: #if defined(hp300) && !defined(IEEE)
                      6: #define        IEEE    1
                      7: #endif
                      8: 
                      9: /*
                     10:  *     ecvt converts to decimal
                     11:  *     the number of digits is specified by ndigit
                     12:  *     decpt is set to the position of the decimal point
                     13:  *     sign is set to 0 for positive, 1 for negative
                     14:  */
                     15: 
                     16: char   *cvt();
                     17: 
                     18: #ifdef IEEE
                     19: #include <signal.h>
                     20: #define        NDIG    512
                     21: #else
                     22: #define        NDIG    80
                     23: #endif
                     24: 
                     25: char*
                     26: ecvt(arg, ndigits, decpt, sign)
                     27: double arg;
                     28: int ndigits, *decpt, *sign;
                     29: {
                     30:        return(cvt(arg, ndigits, decpt, sign, 1));
                     31: }
                     32: 
                     33: char*
                     34: fcvt(arg, ndigits, decpt, sign)
                     35: double arg;
                     36: int ndigits, *decpt, *sign;
                     37: {
                     38:        return(cvt(arg, ndigits, decpt, sign, 0));
                     39: }
                     40: 
                     41: static char*
                     42: cvt(arg, ndigits, decpt, sign, eflag)
                     43: double arg;
                     44: int ndigits, *decpt, *sign;
                     45: {
                     46:        register int r2;
                     47:        double fi, fj;
                     48:        register char *p, *p1;
                     49:        static char buf[NDIG];
                     50:        double modf();
                     51: 
                     52: #ifdef IEEE
                     53:        /* XXX */
                     54:        if (isspecial(arg, buf))
                     55:                return(buf);
                     56: #endif
                     57:        if (ndigits<0)
                     58:                ndigits = 0;
                     59:        if (ndigits>=NDIG-1)
                     60:                ndigits = NDIG-2;
                     61:        r2 = 0;
                     62:        *sign = 0;
                     63:        p = &buf[0];
                     64:        if (arg<0) {
                     65:                *sign = 1;
                     66:                arg = -arg;
                     67:        }
                     68:        arg = modf(arg, &fi);
                     69:        p1 = &buf[NDIG];
                     70:        /*
                     71:         * Do integer part
                     72:         */
                     73:        if (fi != 0) {
                     74:                p1 = &buf[NDIG];
                     75:                while (fi != 0) {
                     76:                        fj = modf(fi/10, &fi);
                     77:                        *--p1 = (int)((fj+.03)*10) + '0';
                     78:                        r2++;
                     79:                }
                     80:                while (p1 < &buf[NDIG])
                     81:                        *p++ = *p1++;
                     82:        } else if (arg > 0) {
                     83:                while ((fj = arg*10) < 1) {
                     84:                        arg = fj;
                     85:                        r2--;
                     86:                }
                     87:        }
                     88:        p1 = &buf[ndigits];
                     89:        if (eflag==0)
                     90:                p1 += r2;
                     91:        *decpt = r2;
                     92:        if (p1 < &buf[0]) {
                     93:                buf[0] = '\0';
                     94:                return(buf);
                     95:        }
                     96:        while (p<=p1 && p<&buf[NDIG]) {
                     97:                arg *= 10;
                     98:                arg = modf(arg, &fj);
                     99:                *p++ = (int)fj + '0';
                    100:        }
                    101:        if (p1 >= &buf[NDIG]) {
                    102:                buf[NDIG-1] = '\0';
                    103:                return(buf);
                    104:        }
                    105:        p = p1;
                    106:        *p1 += 5;
                    107:        while (*p1 > '9') {
                    108:                *p1 = '0';
                    109:                if (p1>buf)
                    110:                        ++*--p1;
                    111:                else {
                    112:                        *p1 = '1';
                    113:                        (*decpt)++;
                    114:                        if (eflag==0) {
                    115:                                if (p>buf)
                    116:                                        *p = '0';
                    117:                                p++;
                    118:                        }
                    119:                }
                    120:        }
                    121:        *p = '\0';
                    122:        return(buf);
                    123: }
                    124: 
                    125: #ifdef IEEE
                    126: struct IEEEdp {
                    127:        unsigned sign:1,
                    128:                 exp:11,
                    129:                 manh:20,
                    130:                 manl:32;
                    131: };
                    132: 
                    133: isspecial(f, bp)
                    134:        double f;
                    135:        char *bp;
                    136: {
                    137:        register struct IEEEdp *ip = (struct IEEEdp *) &f;
                    138: 
                    139:        if (ip->exp != 0x7ff)
                    140:                return(0);
                    141:        if (ip->manh || ip->manl)
                    142:                strcpy(bp, "NaN");
                    143:        else if (ip->sign)
                    144:                strcpy(bp, "-Infinity");
                    145:        else
                    146:                strcpy(bp, "Infinity");
                    147:        return(1);
                    148: }
                    149: #endif

unix.superglobalmegacorp.com

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