Commit | Line | Data |
---|---|---|
35ba6a95 KB |
1 | /* |
2 | * Copyright (c) 1982 Regents of the University of California | |
3 | * @(#)asnumber.h 4.3 2/14/82 | |
4 | */ | |
5 | ||
6 | union Ib_int{ /* byte */ | |
7 | u_char Ib_uchar[1]; | |
8 | char Ichar; | |
9 | }; | |
10 | union Iw_int{ /* word */ | |
11 | u_char Iw_uchar[2]; | |
12 | u_short Iw_ushort[1]; | |
13 | short Iw_short; | |
14 | }; | |
15 | union Il_int{ /* long word */ | |
16 | u_char Il_uchar[4]; | |
17 | u_short Il_ushort[2]; | |
18 | u_int Il_ulong[1]; | |
19 | int Il_long; | |
20 | }; | |
21 | ||
22 | union Iq_int{ /* quad word */ | |
23 | u_char Iq_uchar[8]; | |
24 | u_short Iq_ushort[4]; | |
25 | u_int Iq_ulong[2]; | |
26 | }; | |
27 | ||
28 | ||
29 | union Ff_float{ | |
30 | u_char Ff_uchar[4]; | |
31 | u_short Ff_ushort[2]; | |
32 | u_int Ff_ulong[1]; | |
33 | float Ff_value; | |
34 | }; | |
35 | ||
36 | union Fd_float{ | |
37 | u_char Fd_uchar[8]; | |
38 | u_short Fd_ushort[4]; | |
39 | u_int Fd_ulong[2]; | |
40 | double Fd_value; | |
41 | }; | |
42 | ||
43 | ||
44 | struct as_number{ | |
45 | union { | |
46 | union Ib_int numIb_int; | |
47 | union Iw_int numIw_int; | |
48 | union Il_int numIl_int; | |
49 | union Iq_int numIq_int; | |
50 | union Ff_float numFf_float; | |
51 | union Fd_float numFd_float; | |
52 | }num_num; | |
53 | char num_tag; /* the key field: TYPB..TYPUNPACKED */ | |
54 | char num_sign; /* the sign */ | |
55 | short num_exponent; /* the unexcessed exp */ | |
56 | }; | |
57 | typedef struct as_number Bignum; | |
58 | ||
59 | extern Bignum Znumber; /* one all zero'ed out */ | |
60 | ||
61 | #define num_uchar num_num.numIq_int.Iq_uchar | |
62 | #define num_uint num_num.numIq_int.Iq_ulong | |
63 | #define num_ulong num_num.numIq_int.Iq_ulong | |
64 | #define num_ushort num_num.numIq_int.Iq_ushort | |
65 | /* | |
66 | * The following definitions must all be consistent. | |
67 | * They define the granularity of working on longs and quad | |
68 | * words. Currently, the granularity is as large as it can be: 32 bits | |
69 | * in a chunk. | |
70 | */ | |
71 | #define CH_N 2 /* number of pieces */ | |
72 | #define CH_BITS 32 /* number of bits per piece */ | |
73 | #define CH_FIELD(x) ((x).num_num.numIq_int.Iq_ulong) | |
74 | typedef u_int *chptr; /* basic data type */ | |
75 | #define SIGNBIT 0x80000000 | |
76 | ||
77 | #define HOC (CH_N - 1) /* high order chunk */ | |
78 | #if 0 | |
79 | #define MAXINT_1 ((unsigned)(1<<(CH_BITS - 1))) | |
80 | #define MAXINT_10 ((unsigned)((MAXINT_1/(unsigned)10))) | |
81 | #define MAXINT_5 ((unsigned)((MAXINT_1/(unsigned)5))) | |
82 | #else not 0 | |
83 | /* | |
84 | * These values were computed using dc, so are exact. | |
85 | * Only MAXINT_10 and MAXINT_5 are used in the programs. | |
86 | */ | |
87 | #define MAXINT_1 2147483648 | |
88 | #define MAXINT_10 214748364 | |
89 | #define MAXINT_5 429496729 | |
90 | #endif not 0 | |
91 | ||
92 | Bignum as_atoi(); /* converts string to integer */ | |
93 | Bignum as_atof(); /* converts string to float */ | |
94 | \f | |
95 | /* | |
96 | * Definitions for overflows. | |
97 | */ | |
98 | typedef u_int Ovf; | |
99 | ||
100 | #define OVF_ADDV (1<<0) /* integer: adding two vectors overflowed */ | |
101 | #define OVF_LSHIFT (1<<1) /* integer: left shifting a vector lost bits */ | |
102 | #define OVF_POSOVF (1<<2) /* integer: positive number overflowed */ | |
103 | #define OVF_MAXINT (1<<3) /* integer: the number was the maxint + 1*/ | |
104 | #define OVF_F (1<<4) /* float: F overflow */ | |
105 | #define OVF_D (1<<5) /* float: D overflow */ | |
106 | #define OVF_OVERFLOW (1<<9) /* overflow in conversion */ | |
107 | #define OVF_UNDERFLOW (1<<10) /* underflow in conversion */ | |
108 | ||
109 | Ovf posovf(); | |
110 | Ovf numclear(); | |
111 | Ovf numshift(); | |
112 | Ovf numaddv(); | |
113 | Ovf numaddd(); | |
114 | Ovf num1comp(); | |
115 | Ovf numnegate(); | |
116 | /* | |
117 | * Bit manipulations | |
118 | */ | |
119 | #define ONES(n) ((1 << (n)) - 1) | |
120 | /* | |
121 | * Assertions | |
122 | */ | |
123 | #if 1 | |
124 | #define assert(x, str) if (!(x)) panic("%s%s\n", "x", str) | |
125 | #else | |
126 | #define assert(x, str) | |
127 | #endif |