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