1: /*
2: * Copyright (c) 1982 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: * @(#)asnumber.h 5.1 (Berkeley) 4/30/85
7: */
8:
9: union Ib_int{ /* byte */
10: u_char Ib_uchar[1];
11: char Ichar;
12: };
13: union Iw_int{ /* word */
14: u_char Iw_uchar[2];
15: u_short Iw_ushort[1];
16: short Iw_short;
17: };
18: union Il_int{ /* long word */
19: u_char Il_uchar[4];
20: u_short Il_ushort[2];
21: u_int Il_ulong[1];
22: int Il_long;
23: };
24:
25: union Iq_int{ /* quad word */
26: u_char Iq_uchar[8];
27: u_short Iq_ushort[4];
28: u_int Iq_ulong[2];
29: };
30:
31: union Io_int{ /* octal word */
32: u_char Io_uchar[16];
33: u_short Io_ushort[8];
34: u_int Io_ulong[4];
35: union Iq_int Io_quad[2];
36: };
37:
38: union Ff_float{
39: u_char Ff_uchar[4];
40: u_short Ff_ushort[2];
41: u_int Ff_ulong[1];
42: float Ff_value;
43: };
44:
45: union Fd_float{
46: u_char Fd_uchar[8];
47: u_short Fd_ushort[4];
48: u_int Fd_ulong[2];
49: double Fd_value;
50: };
51:
52: union Fg_float{
53: u_char Fg_uchar[8];
54: u_short Fg_ushort[4];
55: u_int Fg_ulong[2];
56: };
57:
58: union Fh_float{
59: u_char Fh_uchar[16];
60: u_short Fh_ushort[8];
61: u_int Fh_ulong[4];
62: };
63:
64: struct as_number{
65: union {
66: union Ib_int numIb_int;
67: union Iw_int numIw_int;
68: union Il_int numIl_int;
69: union Iq_int numIq_int;
70: union Io_int numIo_int;
71: union Ff_float numFf_float;
72: union Fd_float numFd_float;
73: union Fg_float numFg_float;
74: union Fh_float numFh_float;
75: }num_num;
76: char num_tag; /* the key field: TYPB..TYPUNPACKED */
77: char num_sign; /* when unpacked, the sign */
78: short num_exponent; /* when unpacked, the unexcessed exp */
79: };
80: typedef struct as_number Bignum;
81:
82: extern Bignum Znumber; /* one all zero'ed out */
83:
84: #define num_uchar num_num.numIq_int.Iq_uchar
85: #define num_uint num_num.numIq_int.Iq_ulong
86: #define num_ulong num_num.numIq_int.Iq_ulong
87: #define num_ushort num_num.numIq_int.Iq_ushort
88: /*
89: * The following definitions must all be consistent.
90: * They define the granularity of working on longs, quad and octal
91: * words. Currently, the granularity is as large as it can be: 32 bits
92: * in a chunk.
93: */
94: #define CH_N 4 /* number of pieces */
95: #define CH_BITS 32 /* number of bits per piece */
96: #define CH_FIELD(x) ((x).num_num.numIo_int.Io_ulong)
97: typedef u_int *chptr; /* basic data type */
98: #define SIGNBIT 0x80000000
99:
100: #define HOC (CH_N - 1) /* high order chunk */
101: #if 0
102: #define MAXINT_1 ((unsigned)(1<<(CH_BITS - 1)))
103: #define MAXINT_10 ((unsigned)((MAXINT_1/(unsigned)10)))
104: #define MAXINT_5 ((unsigned)((MAXINT_1/(unsigned)5)))
105: #else not 0
106: /*
107: * These values were computed using dc, so are exact.
108: * Only MAXINT_10 and MAXINT_5 are used in the programs.
109: */
110: #define MAXINT_1 2147483648
111: #define MAXINT_10 214748364
112: #define MAXINT_5 429496729
113: #endif not 0
114:
115: Bignum as_atoi(); /* converts string to integer */
116: Bignum as_atof(); /* converts string to float */
117: Bignum bigatof(); /* converts string to float */
118: Bignum floatconvert(); /* converts amongst float #s */
119: Bignum intconvert(); /* converts amongst float #s */
120: Bignum bignumconvert(); /* converts amongst float #s */
121: Bignum bignumpack(); /* converts UNPACKED bignum to bignum */
122: Bignum bignumunpack(); /* converts bignum to UNPACKED bignum */
123:
124: /*
125: * Definitions for overflows.
126: */
127: typedef u_int Ovf;
128:
129: #define OVF_ADDV (1<<0) /* integer: adding two vectors overflowed */
130: #define OVF_LSHIFT (1<<1) /* integer: left shifting a vector lost bits */
131: #define OVF_POSOVF (1<<2) /* integer: positive number overflowed */
132: #define OVF_MAXINT (1<<3) /* integer: the number was the maxint + 1*/
133: #define OVF_F (1<<4) /* float: F overflow */
134: #define OVF_D (1<<5) /* float: D overflow */
135: #define OVF_G (1<<6) /* float: G overflow */
136: #define OVF_H (1<<7) /* float: H overflow */
137: #define OVF_OVERFLOW (1<<9) /* overflow in conversion */
138: #define OVF_UNDERFLOW (1<<10) /* underflow in conversion */
139:
140: Ovf posovf();
141: Ovf numclear();
142: Ovf numshift();
143: Ovf numaddv();
144: Ovf numaddd();
145: Ovf num1comp();
146: Ovf numnegate();
147:
148: /*
149: * Definitions to unpack big numbers numbers into
150: * a 128 bit fraction and 16 bit excess-free exponent,
151: * and an 8 copy bits for the sign.
152: *
153: * The fraction is represented as a normalized binary number,
154: * 128 bits long, with the binary point between bits 127 and the
155: * hypothetical 128'th bit. This hypothetical 128'th bit
156: * is always assumed to be one.
157: */
158: /*
159: * A map entry is NOTAKE if the corresponding byte is
160: * not to be taken
161: *
162: * The maps are for going from packed to unpacked format (b_up)
163: * and from unpacked to packed format (b_p)
164: * for the mantissa (b_upmmap) and for the exponent(b_upemap)
165: *
166: * byte #i in the packed number goes to byte #b_upmmap[i] in the unpacked
167: */
168: #define NOTAKE -1
169: struct ty_bigdesc{
170: char b_upmmap[16]; /* byte x of float goes to up_mmap[x] in mant */
171: char b_pmmap[16]; /* inverse of upmmap */
172: char b_upemap[2]; /* byte x of float goes to up_emap[x] in exp */
173: char b_pemap[2]; /* inverse of upemap */
174: char b_mlshift; /* left shift quantity to justify to left */
175: char b_ershift; /* right shift quantity to r justify exponent */
176: short b_msigbits; /* # sig bits in mantissa */
177: char b_esigbits; /* # sig bits in exponent */
178: short b_eexcess; /* exponent excess */
179: };
180: extern struct ty_bigdesc ty_bigdesc[];
181: /*
182: * Bit manipulations
183: */
184: #define ONES(n) ((1 << (n)) - 1)
185: /*
186: * Assertions
187: */
188: #if 1
189: #define assert(x, str) if (!(x)) panic("%s%s\n", "x", str)
190: #else
191: #define assert(x, str)
192: #endif
Defined struct's
Defined union's
Ib_int
defined in line
9; used 2 times
Defined typedef's
Bignum
defined in line
80; used 46 times
- in line 82,
115-122(8)
- in /usr/src/bin/as/as.h line
308
- in /usr/src/bin/as/asparse.c line
38
- in /usr/src/bin/as/asscan4.c line
31,
190
- in /usr/src/bin/as/asscanl.h line
120
- in /usr/src/bin/as/bignum1.c line
18-23(2),
51,
60-61(2),
267,
322,
331,
376
- in /usr/src/bin/as/bignum2.c line
13-17(3),
35-36(2),
93-94(2),
113-118(4),
231-238(5),
426,
437,
493
- in /usr/src/bin/as/natof.c line
17,
34-36(3)
Defined macros
CH_N
defined in line
94; used 10 times
HOC
defined in line
100; used 17 times
ONES
defined in line
184; used 18 times
- in /usr/src/bin/as/bignum1.c line
235,
255,
343,
349-355(4)
- in /usr/src/bin/as/bignum2.c line
182,
206,
212,
220,
367,
381-383(2),
488
- in /usr/src/bin/as/natof.c line
175,
208,
222
assert
defined in line
191; used 14 times
- in /usr/src/bin/as/bignum1.c line
160,
338
- in /usr/src/bin/as/bignum2.c line
190,
446-449(2),
460
- in /usr/src/bin/as/natof.c line
69,
75,
170,
187,
209,
223,
255,
286
Usage of this include