Annotation of 43BSD/lib/libc/vax/gen/ecvt.c, revision 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.