Annotation of embedaddon/ntp/libntp/dofptoa.c, revision 1.1

1.1     ! misho       1: /*
        !             2:  * dofptoa - do the grunge work to convert an fp number to ascii
        !             3:  */
        !             4: #include <stdio.h>
        !             5: 
        !             6: #include "ntp_fp.h"
        !             7: #include "lib_strbuf.h"
        !             8: #include "ntp_string.h"
        !             9: #include "ntp_stdlib.h"
        !            10: 
        !            11: char *
        !            12: dofptoa(
        !            13:        u_fp fpv,
        !            14:        int neg,
        !            15:        short ndec,
        !            16:        int msec
        !            17:        )
        !            18: {
        !            19:        register u_char *cp, *cpend;
        !            20:        register u_long val;
        !            21:        register short dec;
        !            22:        u_char cbuf[12];
        !            23:        u_char *cpdec;
        !            24:        char *buf;
        !            25:        char *bp;
        !            26: 
        !            27:        /*
        !            28:         * Get a string buffer before starting
        !            29:         */
        !            30:        LIB_GETBUF(buf);
        !            31: 
        !            32:        /*
        !            33:         * Zero out the buffer
        !            34:         */
        !            35:        memset((char *)cbuf, 0, sizeof cbuf);
        !            36: 
        !            37:        /*
        !            38:         * Set the pointers to point at the first
        !            39:         * decimal place.  Get a local copy of the value.
        !            40:         */
        !            41:        cp = cpend = &cbuf[5];
        !            42:        val = fpv;
        !            43: 
        !            44:        /*
        !            45:         * If we have to, decode the integral part
        !            46:         */
        !            47:        if (!(val & 0xffff0000))
        !            48:            cp--;
        !            49:        else {
        !            50:                register u_short sv = (u_short)(val >> 16);
        !            51:                register u_short tmp;
        !            52:                register u_short ten = 10;
        !            53: 
        !            54:                do {
        !            55:                        tmp = sv;
        !            56:                        sv = (u_short) (sv/ten);
        !            57:                        *(--cp) = (u_char)(tmp - ((sv<<3) + (sv<<1)));
        !            58:                } while (sv != 0);
        !            59:        }
        !            60: 
        !            61:        /*
        !            62:         * Figure out how much of the fraction to do
        !            63:         */
        !            64:        if (msec) {
        !            65:                dec = (short)(ndec + 3);
        !            66:                if (dec < 3)
        !            67:                    dec = 3;
        !            68:                cpdec = &cbuf[8];
        !            69:        } else {
        !            70:                dec = ndec;
        !            71:                cpdec = cpend;
        !            72:        }
        !            73: 
        !            74:        if (dec > 6)
        !            75:            dec = 6;
        !            76:        
        !            77:        if (dec > 0) {
        !            78:                do {
        !            79:                        val &= 0xffff;
        !            80:                        val = (val << 3) + (val << 1);
        !            81:                        *cpend++ = (u_char)(val >> 16);
        !            82:                } while (--dec > 0);
        !            83:        }
        !            84: 
        !            85:        if (val & 0x8000) {
        !            86:                register u_char *tp;
        !            87:                /*
        !            88:                 * Round it. Ick.
        !            89:                 */
        !            90:                tp = cpend;
        !            91:                *(--tp) += 1;
        !            92:                while (*tp >= 10) {
        !            93:                        *tp = 0;
        !            94:                        *(--tp) += 1;
        !            95:                }
        !            96:        }
        !            97: 
        !            98:        /*
        !            99:         * Remove leading zeroes if necessary
        !           100:         */
        !           101:        while (cp < (cpdec -1) && *cp == 0)
        !           102:            cp++;
        !           103:        
        !           104:        /*
        !           105:         * Copy it into the buffer, asciizing as we go.
        !           106:         */
        !           107:        bp = buf;
        !           108:        if (neg)
        !           109:            *bp++ = '-';
        !           110:        
        !           111:        while (cp < cpend) {
        !           112:                if (cp == cpdec)
        !           113:                    *bp++ = '.';
        !           114:                *bp++ = (char)(*cp++ + '0');
        !           115:        }
        !           116:        *bp = '\0';
        !           117:        return buf;
        !           118: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>