new copyright notice
[unix-history] / usr / src / old / as.tahoe / asnumber.h
CommitLineData
35ba6a95
KB
1/*
2 * Copyright (c) 1982 Regents of the University of California
3 * @(#)asnumber.h 4.3 2/14/82
4 */
5
6union Ib_int{ /* byte */
7 u_char Ib_uchar[1];
8 char Ichar;
9};
10union Iw_int{ /* word */
11 u_char Iw_uchar[2];
12 u_short Iw_ushort[1];
13 short Iw_short;
14};
15union 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
22union 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
29union 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
36union 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
44struct 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};
57typedef struct as_number Bignum;
58
59extern 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)
74typedef 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
92Bignum as_atoi(); /* converts string to integer */
93Bignum as_atof(); /* converts string to float */
94\f
95/*
96 * Definitions for overflows.
97 */
98typedef 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
109Ovf posovf();
110Ovf numclear();
111Ovf numshift();
112Ovf numaddv();
113Ovf numaddd();
114Ovf num1comp();
115Ovf 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