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
11int
12hextolfp(
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}
68