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