Annotation of researchv9/libc/gen/ecvt.c, revision 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.