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

1.1     ! misho       1: /*
        !             2:  * mstolfp - convert an ascii string in milliseconds to an l_fp number
        !             3:  */
        !             4: #include <stdio.h>
        !             5: #include <ctype.h>
        !             6: 
        !             7: #include "ntp_fp.h"
        !             8: #include "ntp_stdlib.h"
        !             9: 
        !            10: int
        !            11: mstolfp(
        !            12:        const char *str,
        !            13:        l_fp *lfp
        !            14:        )
        !            15: {
        !            16:        register const char *cp;
        !            17:        register char *bp;
        !            18:        register const char *cpdec;
        !            19:        char buf[100];
        !            20: 
        !            21:        /*
        !            22:         * We understand numbers of the form:
        !            23:         *
        !            24:         * [spaces][-][digits][.][digits][spaces|\n|\0]
        !            25:         *
        !            26:         * This is one enormous hack.  Since I didn't feel like
        !            27:         * rewriting the decoding routine for milliseconds, what
        !            28:         * is essentially done here is to make a copy of the string
        !            29:         * with the decimal moved over three places so the seconds
        !            30:         * decoding routine can be used.
        !            31:         */
        !            32:        bp = buf;
        !            33:        cp = str;
        !            34:        while (isspace((int)*cp))
        !            35:            cp++;
        !            36:        
        !            37:        if (*cp == '-') {
        !            38:                *bp++ = '-';
        !            39:                cp++;
        !            40:        }
        !            41: 
        !            42:        if (*cp != '.' && !isdigit((int)*cp))
        !            43:            return 0;
        !            44: 
        !            45: 
        !            46:        /*
        !            47:         * Search forward for the decimal point or the end of the string.
        !            48:         */
        !            49:        cpdec = cp;
        !            50:        while (isdigit((int)*cpdec))
        !            51:            cpdec++;
        !            52: 
        !            53:        /*
        !            54:         * Found something.  If we have more than three digits copy the
        !            55:         * excess over, else insert a leading 0.
        !            56:         */
        !            57:        if ((cpdec - cp) > 3) {
        !            58:                do {
        !            59:                        *bp++ = (char)*cp++;
        !            60:                } while ((cpdec - cp) > 3);
        !            61:        } else {
        !            62:                *bp++ = '0';
        !            63:        }
        !            64: 
        !            65:        /*
        !            66:         * Stick the decimal in.  If we've got less than three digits in
        !            67:         * front of the millisecond decimal we insert the appropriate number
        !            68:         * of zeros.
        !            69:         */
        !            70:        *bp++ = '.';
        !            71:        if ((cpdec - cp) < 3) {
        !            72:                register int i = 3 - (cpdec - cp);
        !            73: 
        !            74:                do {
        !            75:                        *bp++ = '0';
        !            76:                } while (--i > 0);
        !            77:        }
        !            78: 
        !            79:        /*
        !            80:         * Copy the remainder up to the millisecond decimal.  If cpdec
        !            81:         * is pointing at a decimal point, copy in the trailing number too.
        !            82:         */
        !            83:        while (cp < cpdec)
        !            84:            *bp++ = (char)*cp++;
        !            85:        
        !            86:        if (*cp == '.') {
        !            87:                cp++;
        !            88:                while (isdigit((int)*cp))
        !            89:                    *bp++ = (char)*cp++;
        !            90:        }
        !            91:        *bp = '\0';
        !            92: 
        !            93:        /*
        !            94:         * Check to make sure the string is properly terminated.  If
        !            95:         * so, give the buffer to the decoding routine.
        !            96:         */
        !            97:        if (*cp != '\0' && !isspace((int)*cp))
        !            98:            return 0;
        !            99:        return atolfp(buf, lfp);
        !           100: }

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