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>