Commit | Line | Data |
---|---|---|
ae0d5425 | 1 | /* |
c47956af | 2 | char id_fmtlib[] = "@(#)fmtlib.c 1.3"; |
ae0d5425 DW |
3 | * |
4 | * integer to ascii conversion | |
c47956af DW |
5 | * |
6 | * This code has been rearranged to produce optimized runtime code. | |
ae0d5425 DW |
7 | */ |
8 | ||
9 | #include "fio.h" | |
10 | ||
c47956af DW |
11 | static char _digit[] = "0123456789abcdefghijklmnopqrstuvwxyz"; |
12 | static char _icv_buf[MAXINTLENGTH+1]; | |
13 | #define _mask 0x7fffffff | |
ae0d5425 | 14 | |
c47956af DW |
15 | char * |
16 | icvt(value, ndigit, sign) | |
17 | long value; | |
18 | int *ndigit; | |
19 | int *sign; | |
ae0d5425 | 20 | { |
c47956af DW |
21 | register long val = value; |
22 | register long rad = radix; | |
23 | register char *b = &_icv_buf[MAXINTLENGTH]; | |
24 | register char *d = _digit; | |
25 | register long tmp1; | |
26 | register int tmp2; | |
27 | long rem; | |
28 | long kludge; | |
ae0d5425 | 29 | |
c47956af DW |
30 | if (val == 0) |
31 | { | |
32 | *--b = '0'; | |
33 | *sign = 0; | |
34 | *ndigit = 1; | |
35 | return(b); | |
ae0d5425 | 36 | } |
c47956af DW |
37 | |
38 | if (signit && (*sign = (val < 0))) /* signed conversion */ | |
ae0d5425 | 39 | { |
c47956af DW |
40 | /* |
41 | * It is necessary to do the first divide | |
42 | * before the absolute value, for the case -2^31 | |
43 | * | |
44 | * This is actually what is being done... | |
45 | * tmp1 = (int)(val % rad); | |
46 | * val /= rad; | |
47 | * val = -val | |
48 | * *--b = d[-tmp1]; | |
49 | */ | |
50 | tmp1 = val / rad; | |
51 | *--b = d[(tmp1 * rad) - val]; | |
52 | val = -tmp1; | |
ae0d5425 | 53 | } |
c47956af DW |
54 | else /* unsigned conversion */ |
55 | { | |
56 | *sign = 0; | |
57 | if (val < 0) | |
58 | { /* ALL THIS IS TO SIMULATE UNSIGNED LONG MOD & DIV */ | |
59 | kludge = _mask - (rad - 1); | |
60 | val &= _mask; | |
61 | /* | |
62 | * This is really what's being done... | |
63 | * rem = (kludge % rad) + (val % rad); | |
64 | * val = (kludge / rad) + (val / rad) + (rem / rad) + 1; | |
65 | * *--b = d[rem % rad]; | |
66 | */ | |
67 | tmp1 = kludge / rad; | |
68 | tmp2 = val / rad; | |
69 | rem = (kludge - (tmp1 * rad)) + (val - (tmp2 * rad)); | |
70 | val = ++tmp1 + tmp2; | |
71 | tmp1 = rem / rad; | |
72 | val += tmp1; | |
73 | *--b = d[rem - (tmp1 * rad)]; | |
ae0d5425 DW |
74 | } |
75 | } | |
c47956af DW |
76 | |
77 | while (val) | |
ae0d5425 | 78 | { |
c47956af DW |
79 | /* |
80 | * This is really what's being done ... | |
81 | * *--b = d[val % rad]; | |
82 | * val /= rad; | |
83 | */ | |
84 | tmp1 = val / rad; | |
85 | *--b = d[val - (tmp1 * rad)]; | |
86 | val = tmp1; | |
ae0d5425 | 87 | } |
c47956af DW |
88 | |
89 | *ndigit = (&_icv_buf[MAXINTLENGTH] - b); | |
90 | return(b); | |
ae0d5425 | 91 | } |