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