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 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 128