Annotation of embedaddon/ntp/libntp/atolfp.c, revision 1.1.1.1
1.1 misho 1: /*
2: * atolfp - convert an ascii 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_assert.h"
10:
11: /*
12: * Powers of 10
13: */
14: static u_long ten_to_the_n[10] = {
15: 0,
16: 10,
17: 100,
18: 1000,
19: 10000,
20: 100000,
21: 1000000,
22: 10000000,
23: 100000000,
24: 1000000000,
25: };
26:
27:
28: int
29: atolfp(
30: const char *str,
31: l_fp *lfp
32: )
33: {
34: register const char *cp;
35: register u_long dec_i;
36: register u_long dec_f;
37: char *ind;
38: int ndec;
39: int isneg;
40: static const char *digits = "0123456789";
41:
42: NTP_REQUIRE(str != NULL);
43:
44: isneg = 0;
45: dec_i = dec_f = 0;
46: ndec = 0;
47: cp = str;
48:
49: /*
50: * We understand numbers of the form:
51: *
52: * [spaces][-|+][digits][.][digits][spaces|\n|\0]
53: */
54: while (isspace((int)*cp))
55: cp++;
56:
57: if (*cp == '-') {
58: cp++;
59: isneg = 1;
60: }
61:
62: if (*cp == '+')
63: cp++;
64:
65: if (*cp != '.' && !isdigit((int)*cp))
66: return 0;
67:
68: while (*cp != '\0' && (ind = strchr(digits, *cp)) != NULL) {
69: dec_i = (dec_i << 3) + (dec_i << 1); /* multiply by 10 */
70: dec_i += (ind - digits);
71: cp++;
72: }
73:
74: if (*cp != '\0' && !isspace((int)*cp)) {
75: if (*cp++ != '.')
76: return 0;
77:
78: while (ndec < 9 && *cp != '\0'
79: && (ind = strchr(digits, *cp)) != NULL) {
80: ndec++;
81: dec_f = (dec_f << 3) + (dec_f << 1); /* *10 */
82: dec_f += (ind - digits);
83: cp++;
84: }
85:
86: while (isdigit((int)*cp))
87: cp++;
88:
89: if (*cp != '\0' && !isspace((int)*cp))
90: return 0;
91: }
92:
93: if (ndec > 0) {
94: register u_long tmp;
95: register u_long bit;
96: register u_long ten_fact;
97:
98: ten_fact = ten_to_the_n[ndec];
99:
100: tmp = 0;
101: bit = 0x80000000;
102: while (bit != 0) {
103: dec_f <<= 1;
104: if (dec_f >= ten_fact) {
105: tmp |= bit;
106: dec_f -= ten_fact;
107: }
108: bit >>= 1;
109: }
110: if ((dec_f << 1) > ten_fact)
111: tmp++;
112: dec_f = tmp;
113: }
114:
115: if (isneg)
116: M_NEG(dec_i, dec_f);
117:
118: lfp->l_ui = dec_i;
119: lfp->l_uf = dec_f;
120: return 1;
121: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>