Annotation of embedaddon/ntp/libntp/dofptoa.c, revision 1.1.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>