1: /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1984. */ 2: /* $Header: b.h,v 1.1 84/06/28 00:48:39 timo Exp $ */ 3: 4: /* b.h: general */ 5: 6: #include <stdio.h> 7: #include <math.h> 8: #include <setjmp.h> 9: 10: #define Forward 11: #define Visible 12: #define Hidden static 13: #define Procedure 14: 15: #define EQ == 16: #define NE != 17: 18: /* The following are not intended as pseudo-encapsulation, */ 19: /* but to emphasize intention. */ 20: typedef char literal; 21: typedef char bool; 22: typedef char *txptr; 23: typedef char *string; /* Strings are always terminated with a char '\0'. */ 24: 25: #define Yes ((bool) 1) 26: #define No ((bool) 0) 27: typedef short intlet; 28: extern bool bugs; 29: 30: /************************************************************************/ 31: /* */ 32: /* Values */ 33: /* */ 34: /* There are different modules for values, however all agree that */ 35: /* the first field of a value is its type, and the second its reference */ 36: /* count. All other fields depend on the module. */ 37: /* */ 38: /************************************************************************/ 39: 40: typedef struct{literal type; intlet refcnt, len; string *cts;} *value; 41: 42: #define Dummy 0 43: #define Dumval ((value) Dummy) 44: #define Vnil ((value) 0) 45: #define Pnil ((value *) 0) 46: 47: /* Types: */ 48: #define Num '0' 49: #define Tex '"' 50: #define Com ',' 51: #define Lis 'L' 52: #define Tab 'M' 53: #define ELT '}' 54: /* locations: */ 55: #define Sim 'S' 56: #define Tri '@' 57: #define Tse '[' 58: #define Glo 'g' 59: #define Per 'p' 60: /* units: */ 61: #define How 'h' 62: #define For 'f' 63: #define Ref 'r' 64: #define Fun '+' 65: #define Prd 'i' 66: 67: #define Type(v) ((v)->type) 68: #define Length(v) ((v)->len) 69: #define Refcnt(v) ((v)->refcnt) 70: #define Unique(v) ((v)->refcnt==1) 71: 72: #define Overall for (k= 0; k < len; k++) 73: 74: #define k_Over_len for (k= 0; k < len; k++) 75: #define Last(k) (k == len-1) 76: 77: #define Ats(v) ((value *)&((v)->cts)) 78: #define Str(v) ((string)&((v)->cts)) /* only for use in part1 */ 79: 80: /* Environments and context */ 81: 82: typedef value envtab; 83: typedef struct ec{envtab tab; struct ec *inv_env;} envchain; 84: typedef envchain *env; 85: 86: typedef struct{env curnv; value *bndtgs; 87: literal cntxt, resexp; value uname; literal utype; 88: intlet cur_ilev, lino; txptr tx, ceol;} context; 89: 90: #define Enil ((env) 0) 91: 92: /* contexts: */ 93: #define In_command 'c' 94: #define In_read '?' 95: #define In_unit 'u' 96: #define In_value 'v' 97: #define In_formal 'f' 98: #define In_prmnv 'p' 99: 100: /* results */ 101: #define Ret 'V' 102: #define Rep '+' 103: #define Voi ' ' 104: 105: /* adicity */ 106: #define Zer '0' 107: #define Mon '1' 108: #define Dya '2' 109: 110: /* funprd.def */ 111: #define Pre 'P' 112: #define Use 'U' 113: 114: /************************************************************************/ 115: /* */ 116: /* A function or predicate is modelled as a compound consisting of */ 117: /* (i) two short integers for (L, H) priority */ 118: /* (relevant only for functions); */ 119: /* (ii) Zer/Mon/Dya for zero-, mon- or dyadicity; */ 120: /* (iii) Pre/Use for pre- or user-definedness; */ 121: /* (iv) if Pre, a literal to switch on; */ 122: /* if Use, a pointer to the yield/test-unit text. */ 123: /* */ 124: /************************************************************************/ 125: 126: typedef struct{envtab reftab; txptr fux, lux; bool filed;} how; 127: typedef struct{envtab reftab; txptr fux, lux; bool filed; 128: intlet L, H; literal adic, def;} funprd; 129: /* The first four fields should have the same structure as those of 'hows' */ 130: 131: typedef struct{context con; txptr ftx;} formal; 132: typedef struct{txptr rp; intlet rlino;} ref; 133: 134: /************************************************************************/ 135: /* */ 136: /* Locations */ 137: /* */ 138: /* A simple location is modelled as a pair basic-identifier and */ 139: /* environment, where a basic-identifier is modelled as a text */ 140: /* and an environment as a pointer to a pair (T, E), where T is a */ 141: /* table with basic-identifiers as keys and content values as */ 142: /* associates, and E is the invoking environment or nil. */ 143: /* */ 144: /* A trimmed-text location is modelled as a triple (R, B, C). */ 145: /* */ 146: /* A compound location is modelled as a compound whose fields are */ 147: /* locations, rather than values. */ 148: /* */ 149: /* A table-selection location is modelled as a pair (R, K). */ 150: /* */ 151: /************************************************************************/ 152: 153: typedef value loc; 154: 155: typedef value basidf; 156: typedef struct{basidf i; env e;} simploc; 157: typedef struct{loc R; intlet B, C;} trimloc; 158: typedef struct{loc R; value K;} tbseloc; 159: 160: /* Functions and Predicates */ 161: typedef value fun; 162: typedef value prd; 163: 164: char *malloc(), *realloc(); 165: char *getenv();