|
|
1.1 ! root 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
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.