Annotation of embedaddon/ntp/libntp/hextolfp.c, revision 1.1.1.1
1.1 misho 1: /*
2: * hextolfp - convert an ascii hex string to an l_fp number
3: */
4: #include <stdio.h>
5: #include <ctype.h>
6:
7: #include "ntp_fp.h"
8: #include "ntp_string.h"
9: #include "ntp_stdlib.h"
10:
11: int
12: hextolfp(
13: const char *str,
14: l_fp *lfp
15: )
16: {
17: register const char *cp;
18: register const char *cpstart;
19: register u_long dec_i;
20: register u_long dec_f;
21: char *ind = NULL;
22: static const char *digits = "0123456789abcdefABCDEF";
23:
24: dec_i = dec_f = 0;
25: cp = str;
26:
27: /*
28: * We understand numbers of the form:
29: *
30: * [spaces]8_hex_digits[.]8_hex_digits[spaces|\n|\0]
31: */
32: while (isspace((int)*cp))
33: cp++;
34:
35: cpstart = cp;
36: while (*cp != '\0' && (cp - cpstart) < 8 &&
37: (ind = strchr(digits, *cp)) != NULL) {
38: dec_i = dec_i << 4; /* multiply by 16 */
39: dec_i += ((ind - digits) > 15) ? (ind - digits) - 6
40: : (ind - digits);
41: cp++;
42: }
43:
44: if ((cp - cpstart) < 8 || ind == NULL)
45: return 0;
46: if (*cp == '.')
47: cp++;
48:
49: cpstart = cp;
50: while (*cp != '\0' && (cp - cpstart) < 8 &&
51: (ind = strchr(digits, *cp)) != NULL) {
52: dec_f = dec_f << 4; /* multiply by 16 */
53: dec_f += ((ind - digits) > 15) ? (ind - digits) - 6
54: : (ind - digits);
55: cp++;
56: }
57:
58: if ((cp - cpstart) < 8 || ind == NULL)
59: return 0;
60:
61: if (*cp != '\0' && !isspace((int)*cp))
62: return 0;
63:
64: lfp->l_ui = dec_i;
65: lfp->l_uf = dec_f;
66: return 1;
67: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>