|
|
1.1 ! root 1: /* Header file for XNS Courier compiler */ ! 2: ! 3: /* $Header: compiler.h,v 2.2 86/06/06 07:28:35 jqj Exp $ */ ! 4: /* $Log: compiler.h,v $ ! 5: * Revision 2.2 86/06/06 07:28:35 jqj ! 6: * many mods for better symbol table management: added CurrentModule, ! 7: * made check_dependency, make_symbol, check_def set/use/use a symbol ! 8: * table instead of a module name string, etc. Result is that we can ! 9: * now handle DEPENDS UPON 2 versions of same program. ! 10: * ! 11: * Revision 2.1 86/05/16 05:44:42 jqj ! 12: * make enumeration tags local to modules rather than global, to allow ! 13: * DEPENDS UPON two versions of the same program. For same reason, use ! 14: * gensymed symbol names that include version number. ! 15: * ! 16: * Revision 2.0 85/11/21 07:21:30 jqj ! 17: * 4.3BSD standard release ! 18: * ! 19: * Revision 1.5 85/05/23 06:19:24 jqj ! 20: * *** empty log message *** ! 21: * ! 22: * Revision 1.5 85/05/23 06:19:24 jqj ! 23: * Public Beta-test version, released 24 May 1985 ! 24: * ! 25: * Revision 1.4 85/03/26 06:09:31 jqj ! 26: * Revised public alpha-test version, released 26 March 1985 ! 27: * ! 28: * Revision 1.3 85/03/11 16:38:47 jqj ! 29: * Public alpha-test version, released 11 March 1985 ! 30: * ! 31: * Revision 1.2 85/02/21 11:04:54 jqj ! 32: * alpha test version ! 33: * ! 34: * Revision 1.1 85/02/15 13:58:15 jqj ! 35: * Initial revision ! 36: * ! 37: */ ! 38: ! 39: #include <stdio.h> ! 40: ! 41: #define MAXSTR 200 ! 42: #define streq(s, t) (strcmp(s, t) == 0) ! 43: #define New(t) ((t *) calloc(1, sizeof(t))) ! 44: ! 45: /* ! 46: * error message severity types ! 47: */ ! 48: enum severity { ! 49: WARNING, ! 50: ERROR, ! 51: FATAL, ! 52: }; ! 53: ! 54: /* ! 55: * Cons cell for lisp operations. ! 56: */ ! 57: struct cons { ! 58: struct cons *c_cdr; ! 59: struct cons *c_car; ! 60: }; ! 61: typedef struct cons *list; ! 62: ! 63: #define NIL ((list) 0) ! 64: #define car(x) ((x)->c_car) ! 65: #define cdr(x) ((x)->c_cdr) ! 66: #define caar(x) ((x)->c_car->c_car) ! 67: #define cdar(x) ((x)->c_car->c_cdr) ! 68: #define cadr(x) ((x)->c_cdr->c_car) ! 69: #define cddr(x) ((x)->c_cdr->c_cdr) ! 70: ! 71: #define ONIL ((struct object *) 0) ! 72: #define ocar(x) ((x)->o_car) ! 73: #define ocdr(x) ((x)->o_cdr) ! 74: ! 75: #define TNIL ((struct type *) 0) ! 76: ! 77: /* ! 78: * Object classes. ! 79: */ ! 80: enum class { ! 81: O_UNKNOWN = 0, /* make_symbol starts with this */ ! 82: O_TYPE, /* a typename symbol */ ! 83: O_CONSTANT, /* a constantname symbol */ ! 84: O_ENUMTAG, /* an enumeration tag */ ! 85: O_SYMBOLTABLE /* a symbol table */ ! 86: }; ! 87: ! 88: /* ! 89: * Type constructors. ! 90: */ ! 91: enum constr { ! 92: C_NUMERIC = 1, ! 93: C_BOOLEAN, ! 94: C_STRING, ! 95: C_ENUMERATION, ! 96: C_ARRAY, ! 97: C_SEQUENCE, ! 98: C_RECORD, ! 99: C_CHOICE, ! 100: C_PROCEDURE, ! 101: C_ERROR ! 102: }; ! 103: ! 104: /* ! 105: * Object structure, for types, and constants. ! 106: * These are the symbol table entries! ! 107: */ ! 108: struct object { ! 109: struct object *o_cdr, *o_car; /* for a binary tree symbol table */ ! 110: enum class o_class; ! 111: char *o_name; /* Courier name of this symbol */ ! 112: char *o_module; /* name of module it appears in */ ! 113: int o_modnumber; /* number of module it appears in */ ! 114: int o_modversion; /* version of module it appears in */ ! 115: union { ! 116: struct type *u_type; ! 117: struct constant *u_constant; ! 118: struct enumtag *u_enum; ! 119: struct symtab *u_symboltable; ! 120: } o_union; ! 121: }; ! 122: #define o_type o_union.u_type ! 123: #define o_constant o_union.u_constant ! 124: #define o_enum o_union.u_enum ! 125: #define o_symboltable o_union.u_symboltable ! 126: ! 127: #define class_of(x) (((struct object *) x)->o_class) ! 128: #define name_of(x) (((struct object *) x)->o_name) ! 129: #define value_of(x) (((struct object *) x)->o_value->cn_value) ! 130: #define enumvalue_of(x) (((struct object *) x)->o_enum->en_value) ! 131: #define enumname_of(x) (((struct object *) x)->o_enum->en_name) ! 132: ! 133: ! 134: /* ! 135: * Type structure. ! 136: * ! 137: * Formats of various lists are as follows. ! 138: * a-b is an a of type b. ! 139: * . indicates a cons operation. ! 140: * ... indicates a list of elements of the preceding form. ! 141: * ! 142: * enumeration: ! 143: * ((name-objectptr . value-numericstring) ...) ! 144: * [ the value is irrelevant, since it is stored in the enumtag] ! 145: * record, error, procedure arguments, procedure results: ! 146: * (((name-string) . type-typeptr) ...) ! 147: * choice: ! 148: * ((((name-symbol . value-numericstring) ...) . type-typeptr) ...) ! 149: * [value may be nil if it is inherited from someplace] ! 150: */ ! 151: struct type { ! 152: enum constr type_constr; /* constructor */ ! 153: char *type_pfname; /* name of pack function */ ! 154: char *type_ufname; /* name of unpack function */ ! 155: char *type_name; /* name of C type */ ! 156: int type_xsize; /* size of external form in 16-bit ! 157: words, or -1 if variable */ ! 158: union { ! 159: list u_list; /* enumeration, record, error */ ! 160: struct { ! 161: int u_size; ! 162: struct type *u_basetype; ! 163: } u_array; /* array, sequence */ ! 164: struct { ! 165: struct type *u_designator; ! 166: list u_candidates; ! 167: } u_choice; /* choice */ ! 168: struct { ! 169: list u_args, u_results, u_errors; ! 170: } u_procedure; /* procedure */ ! 171: } type_u; ! 172: }; ! 173: #define typename(tp) (tp->type_name) ! 174: ! 175: #define type_list type_u.u_list ! 176: #define type_array type_u.u_array ! 177: #define type_size type_array.u_size ! 178: #define type_basetype type_array.u_basetype ! 179: #define type_choice type_u.u_choice ! 180: #define type_designator type_choice.u_designator ! 181: #define type_candidates type_choice.u_candidates ! 182: #define type_procedure type_u.u_procedure ! 183: #define type_args type_procedure.u_args ! 184: #define type_results type_procedure.u_results ! 185: #define type_errors type_procedure.u_errors ! 186: ! 187: /* ! 188: * These definitions allow access from an object pointer ! 189: * known to be a type. ! 190: */ ! 191: #define t_constr o_type->type_constr ! 192: #define t_pfname o_type->type_pfname ! 193: #define t_ufname o_type->type_ufname ! 194: #define t_name o_type->type_name ! 195: #define t_xsize o_type->type_xsize ! 196: #define t_list o_type->type_u.u_list ! 197: #define t_size o_type->type_u.u_array.u_size ! 198: #define t_basetype o_type->type_u.u_array.u_basetype ! 199: #define t_designator o_type->type_u.u_choice.u_designator ! 200: #define t_candidates o_type->type_u.u_choice.u_candidates ! 201: #define t_args o_type->type_u.u_procedure.u_args ! 202: #define t_results o_type->type_u.u_procedure.u_results ! 203: #define t_errors o_type->type_u.u_procedure.u_errors ! 204: ! 205: ! 206: /* ! 207: * constant definition structure. ! 208: * ! 209: * Formats for cn_value follow: ! 210: * numeric constants, error constants ! 211: * e.g.: 34 ! 212: * string constants ! 213: * e.g.: "abc\"def" ! 214: * enumeration constants ! 215: * e.g.: red ! 216: * ! 217: * Formats for cn_list follow: ! 218: * record ! 219: * ((name-string . constant) ...) ! 220: * choice: ! 221: * (name-symbol . constant) ! 222: * array, sequence ! 223: * (constant ...) ! 224: * error ! 225: * (errorvalue-string . argsrecord-typtr) ! 226: * note that procedure and error constants are special. ! 227: */ ! 228: struct constant { ! 229: enum constr cn_constr; ! 230: char *cn_name; /* name of the C constant */ ! 231: char *cn_seqvalname; /* only for sequence constants */ ! 232: union { ! 233: list u_list; /* ConstructedConstant */ ! 234: char *u_value; /* PredefinedConstant */ ! 235: /* EnumerationConstant */ ! 236: } cn_union; ! 237: }; ! 238: #define cn_list cn_union.u_list ! 239: #define cn_value cn_union.u_value ! 240: ! 241: ! 242: /* ! 243: * enumeration definition structure. ! 244: */ ! 245: struct enumtag { ! 246: char * en_name; /* C name for this tag */ ! 247: unsigned short en_value; ! 248: }; ! 249: ! 250: /* ! 251: * symbol table structure ! 252: */ ! 253: struct symtab { ! 254: struct object *s_syms; ! 255: list s_dependencies; /* a list of modulews */ ! 256: }; ! 257: ! 258: /* ! 259: * Kinds of translation functions ! 260: */ ! 261: enum translation { ! 262: EXTERNALIZE, ! 263: INTERNALIZE, ! 264: }; ! 265: ! 266: /* ! 267: * Predefined types. ! 268: */ ! 269: extern struct type ! 270: *Boolean_type, ! 271: *Cardinal_type, *LongCardinal_type, ! 272: *Integer_type, *LongInteger_type, ! 273: *String_type, ! 274: *Unspecified_type, *LongUnspecified_type, ! 275: *NilRecord_type, ! 276: *StreamEnum_type; ! 277: ! 278: /* ! 279: * symbol table management routines ! 280: */ ! 281: extern struct object ! 282: *check_def(), *make_symbol(), *make_module(), *check_dependency(); ! 283: /* ! 284: * routines for entering types in the parse tree ! 285: */ ! 286: extern struct type ! 287: *make_type(), ! 288: *enumeration_type(), *array_type(), ! 289: *sequence_type(), *record_type(), *choice_type(), ! 290: *procedure_type(), *error_type(); ! 291: /* ! 292: * routines for entering constants in the parse tree ! 293: */ ! 294: extern struct constant ! 295: *Boolean_constant(), *Numeric_constant(), ! 296: *String_constant(), ! 297: *array_constant(), *choice_constant(), ! 298: *record_constant(), *enumeration_constant(); ! 299: /* ! 300: * list headers for all the procedures and errors seen in this module ! 301: */ ! 302: extern list Procedures, Errors; ! 303: /* ! 304: * basic lispish functions ! 305: */ ! 306: extern list cons(), nconc(); ! 307: /* ! 308: * files we'll be using ! 309: */ ! 310: extern FILE *header, *header1, *support1, *support2, *client, *server; ! 311: ! 312: /* ! 313: * random global variables ! 314: */ ! 315: extern char *CurrentProgram; ! 316: extern struct object *CurrentModule; ! 317: extern int CurrentVersion, CurrentNumber; ! 318: extern char *input_file; ! 319: extern int recursive_flag; ! 320: ! 321: /* ! 322: * more functions ! 323: */ ! 324: extern char *refstr(), *xfn(), *copy(), *gensym(), *make_full_name(); ! 325: extern char *malloc(), *calloc(), *strcpy();
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.