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