Annotation of embedaddon/ntp/libntp/dofptoa.c, revision 1.1.1.1
1.1 misho 1: /*
2: * dofptoa - do the grunge work to convert an fp number to ascii
3: */
4: #include <stdio.h>
5:
6: #include "ntp_fp.h"
7: #include "lib_strbuf.h"
8: #include "ntp_string.h"
9: #include "ntp_stdlib.h"
10:
11: char *
12: dofptoa(
13: u_fp fpv,
14: int neg,
15: short ndec,
16: int msec
17: )
18: {
19: register u_char *cp, *cpend;
20: register u_long val;
21: register short dec;
22: u_char cbuf[12];
23: u_char *cpdec;
24: char *buf;
25: char *bp;
26:
27: /*
28: * Get a string buffer before starting
29: */
30: LIB_GETBUF(buf);
31:
32: /*
33: * Zero out the buffer
34: */
35: memset((char *)cbuf, 0, sizeof cbuf);
36:
37: /*
38: * Set the pointers to point at the first
39: * decimal place. Get a local copy of the value.
40: */
41: cp = cpend = &cbuf[5];
42: val = fpv;
43:
44: /*
45: * If we have to, decode the integral part
46: */
47: if (!(val & 0xffff0000))
48: cp--;
49: else {
50: register u_short sv = (u_short)(val >> 16);
51: register u_short tmp;
52: register u_short ten = 10;
53:
54: do {
55: tmp = sv;
56: sv = (u_short) (sv/ten);
57: *(--cp) = (u_char)(tmp - ((sv<<3) + (sv<<1)));
58: } while (sv != 0);
59: }
60:
61: /*
62: * Figure out how much of the fraction to do
63: */
64: if (msec) {
65: dec = (short)(ndec + 3);
66: if (dec < 3)
67: dec = 3;
68: cpdec = &cbuf[8];
69: } else {
70: dec = ndec;
71: cpdec = cpend;
72: }
73:
74: if (dec > 6)
75: dec = 6;
76:
77: if (dec > 0) {
78: do {
79: val &= 0xffff;
80: val = (val << 3) + (val << 1);
81: *cpend++ = (u_char)(val >> 16);
82: } while (--dec > 0);
83: }
84:
85: if (val & 0x8000) {
86: register u_char *tp;
87: /*
88: * Round it. Ick.
89: */
90: tp = cpend;
91: *(--tp) += 1;
92: while (*tp >= 10) {
93: *tp = 0;
94: *(--tp) += 1;
95: }
96: }
97:
98: /*
99: * Remove leading zeroes if necessary
100: */
101: while (cp < (cpdec -1) && *cp == 0)
102: cp++;
103:
104: /*
105: * Copy it into the buffer, asciizing as we go.
106: */
107: bp = buf;
108: if (neg)
109: *bp++ = '-';
110:
111: while (cp < cpend) {
112: if (cp == cpdec)
113: *bp++ = '.';
114: *bp++ = (char)(*cp++ + '0');
115: }
116: *bp = '\0';
117: return buf;
118: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>