Pristine Ack-5.5
[Ack-5.5.git] / lang / m2 / comp / def.H
1 /*
2  * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
3  * See the copyright notice in the ACK home directory, in the file "Copyright".
4  *
5  * Author: Ceriel J.H. Jacobs
6  */
7
8 /* I D E N T I F I E R   D E S C R I P T O R   S T R U C T U R E */
9
10 /* $Id: def.H,v 1.44 1994/06/24 12:40:22 ceriel Exp $ */
11
12 struct module {
13         struct node *mo_priority;/* priority of a module */
14         struct scopelist *mo_vis;/* scope of this module */
15         struct node *mo_body;   /* body of this module */
16 #define mod_priority    df_value.df_module.mo_priority
17 #define mod_vis         df_value.df_module.mo_vis
18 #define mod_body        df_value.df_module.mo_body
19 };
20
21 struct variable {
22         arith va_off;           /* address or offset of variable */
23         char *va_name;          /* name of variable if given */
24 #define var_off         df_value.df_variable.va_off
25 #define var_name        df_value.df_variable.va_name
26 };
27
28 struct constant {
29         struct token co_const;  /* result of a constant expression */
30 #define con_const       df_value.df_constant.co_const
31 };
32
33 struct enumval {
34         arith en_val;   /* value of this enumeration literal */
35         struct def *en_next;    /* next enumeration literal */
36 #define enm_val         df_value.df_enum.en_val
37 #define enm_next        df_value.df_enum.en_next
38 };
39
40 struct field {
41         arith fd_off;
42         struct variant {
43                 struct caselabellist *v_cases;
44                 label v_casedescr;
45                 struct def *v_varianttag;
46         } *fd_variant;
47 #define fld_off         df_value.df_field.fd_off
48 #define fld_variant     df_value.df_field.fd_variant
49 };
50
51 struct import {
52         struct def *im_def;     /* imported definition */
53 #define imp_def         df_value.df_import.im_def
54 };
55
56 struct dforward {
57         struct scopelist *fo_vis;
58         struct node *fo_node;
59         char *fo_name;
60 #define for_node        df_value.df_forward.fo_node
61 #define for_vis         df_value.df_forward.fo_vis
62 #define prc_vis         df_value.df_forward.fo_vis
63 #define prc_body        df_value.df_forward.fo_node
64 #define prc_name        df_value.df_forward.fo_name
65 };
66
67 struct forwtype {
68         struct node *f_node;
69         struct def *f_def;
70 #define df_forw_node    df_value.df_fortype.f_node
71 #define df_forw_def     df_value.df_fortype.f_def
72 };
73
74 struct def      {               /* list of definitions for a name */
75         struct def *df_next;    /* next definition in definitions chain */
76         struct def *df_nextinscope;
77                                 /* link all definitions in a scope */
78         struct idf *df_idf;     /* link back to the name */
79         struct scope *df_scope; /* scope in which this definition resides */
80         unsigned short df_kind; /* the kind of this definition: */
81 #define D_MODULE        0x0001  /* a module */
82 #define D_PROCEDURE     0x0002  /* procedure of function */
83 #define D_VARIABLE      0x0004  /* a variable */
84 #define D_FIELD         0x0008  /* a field in a record */
85 #define D_TYPE          0x0010  /* a type */
86 #define D_ENUM          0x0020  /* an enumeration literal */
87 #define D_CONST         0x0040  /* a constant */
88 #define D_IMPORT        0x0080  /* an imported definition */
89 #define D_PROCHEAD      0x0100  /* a procedure heading in a definition module */
90 #define D_HIDDEN        0x0200  /* a hidden type */
91 #define D_FORWARD       0x0400  /* not yet defined */
92 #define D_FORWMODULE    0x0800  /* module must be declared later */
93 #define D_FORWTYPE      0x1000  /* forward type */
94 #define D_ERROR         0x4000  /* a compiler generated definition for an
95                                    undefined variable
96                                 */
97 #define D_INUSE         0x8000  /* identification in this scope (like D_IMPORT)
98                                 */
99 #define D_END           (D_MODULE|D_PROCEDURE)  /* special value for stab.c */
100 #define D_PEND          (D_MODULE|D_PROCEDURE|D_VARIABLE)       /* special value for stab.c */
101 #define D_VALUE (D_PROCEDURE|D_VARIABLE|D_FIELD|D_ENUM|D_CONST|D_PROCHEAD)
102 #define D_ISTYPE        (D_HIDDEN|D_TYPE)
103 #define D_IMPORTED      (D_IMPORT|D_INUSE)
104 #define is_type(dfx)    ((dfx)->df_kind & D_ISTYPE)
105         unsigned short df_flags;
106 #define D_NOREG         0x01    /* set if it may not reside in a register */
107 #define D_USED          0x02    /* set if used */
108 #define D_DEFINED       0x04    /* set if it is assigned a value */
109 #define D_VARPAR        0x08    /* set if it is a VAR parameter */
110 #define D_VALPAR        0x10    /* set if it is a value parameter */
111 #define D_EXPORTED      0x20    /* set if exported */
112 #define D_QEXPORTED     0x40    /* set if qualified exported */
113 #define D_BUSY          0x80    /* set if busy reading this definition module */
114 #define D_FOREIGN       0x100   /* set for foreign language modules */
115 #define D_ADDRGIVEN     0x200   /* set if address given for variable */
116 #define D_FORLOOP       0x400   /* set if busy in for-loop */
117 #define D_IMP_BY_EXP    0x800   /* imported definition by export */
118         struct type *df_type;
119         union {
120                 struct module df_module;
121                 struct variable df_variable;
122                 struct constant df_constant;
123                 struct enumval df_enum;
124                 struct field df_field;
125                 struct import df_import;
126                 struct dforward df_forward;     /* also used for proc */
127                 struct forwtype df_fortype;
128                 int df_stdname; /* define for standard name */
129         } df_value;
130 };
131
132 typedef struct def      t_def;
133 /* ALLOCDEF "def" 50 */
134
135 extern t_def
136         *define(),
137         *DefineLocalModule(),
138         *MkDef(),
139         *DeclProc(),
140         *lookup(),
141         *lookfor();
142
143 #define NULLDEF ((t_def *) 0)