1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
|
/*
* cstructs.h - structures and accompanying manifest constants for functions
* in the common subdirectory.
*/
/*
* fileparts holds a file name broken down into parts.
*/
struct fileparts { /* struct of file name parts */
char *dir; /* directory */
char *name; /* name */
char *ext; /* extension */
};
/*
* xval - holds references to literal constants
*/
union xval {
long ival; /* integer */
double rval; /* real */
word sval; /* offset into string space of string */
};
/*
* str_buf references a string buffer. Strings are built a character
* at a time. When a buffer "fragment" is filled, another is allocated
* and the the current string copied to it.
*/
struct str_buf_frag {
struct str_buf_frag *next; /* next buffer fragment */
char s[1]; /* variable size buffer, really > 1 */
};
struct str_buf {
unsigned int size; /* total size of current buffer */
char *strtimage; /* start of string currently being built */
char *endimage; /* next free character in buffer */
char *end; /* end of current buffer */
struct str_buf_frag *frag_lst; /* list of buffer fragments */
struct str_buf *next; /* buffers can be put on free list */
};
#define AppChar(sbuf, c) do {\
if ((sbuf).endimage >= (sbuf).end)\
new_sbuf(&(sbuf));\
*((sbuf).endimage)++ = (c);\
} while (0)
/*
* implement contains information about the implementation of an operation.
*/
#define NoRsltSeq -1L /* no result sequence: {} */
#define UnbndSeq -2L /* unbounded result sequence: {*} */
#define DoesRet 01 /* operation (or "body" function) returns */
#define DoesFail 02 /* operation (or "body" function) fails */
#define DoesSusp 04 /* operation (or "body" function) suspends */
#define DoesEFail 010 /* fails through error conversion */
#define DoesFThru 020 /* only "body" functions can "fall through" */
struct implement {
struct implement *blink; /* link for bucket chain in hash tables */
char oper_typ; /* 'K'=keyword, 'F'=function, 'O'=operator */
char prefix[2]; /* prefix to make start of name unique */
char *name; /* function/operator/keyword name */
char *op; /* operator symbol (operators only) */
int nargs; /* number of arguments operation requires */
int *arg_flgs; /* array of arg flags: deref/underef, var len*/
long min_result; /* minimum result sequence length */
long max_result; /* maiximum result sequence length */
int resume; /* flag - resumption after last result */
int ret_flag; /* DoesRet, DoesFail, DoesSusp */
int use_rslt; /* flag - explicitly uses result location */
char *comment; /* description of operation */
int ntnds; /* size of tnds array */
struct tend_var *tnds; /* pointer to array of info about tended vars */
int nvars; /* size of vars array */
struct ord_var *vars; /* pointer to array of info about ordinary vars */
struct il_code *in_line; /* inline version of the operation */
int iconc_flgs; /* flags for internal use by the compiler */
};
/*
* These codes are shared between the data base and rtt. They are defined
* here, though not all are used by the data base.
*/
#define TndDesc 1 /* a tended descriptor */
#define TndStr 2 /* a tended character pointer */
#define TndBlk 3 /* a tended block pointer */
#define OtherDcl 4 /* a declaration that is not special */
#define IsTypedef 5 /* a typedef */
#define VArgLen 6 /* identifier for length of variable parm list */
#define RsltLoc 7 /* the special result location of an operation */
#define Label 8 /* label */
#define RtParm 16 /* undereferenced parameter of run-time routine */
#define DrfPrm 32 /* dereferenced parameter of run-time routine */
#define VarPrm 64 /* variable part of parm list (with RtParm or DrfPrm) */
#define PrmMark 128 /* flag - used while recognizing params of body fnc */
#define ByRef 256 /* flag - parameter to body function passed by reference */
/*
* Flags to indicate what types are returned from the function implementing
* a body. These are unsed in determining the calling conventions
* of the function.
*/
#define RetInt 1 /* body/function returns a C_integer */
#define RetDbl 2 /* body/function returns a C_double */
#define RetOther 4 /* body (not function itself) returns something else */
#define RetNoVal 8 /* function returns no value */
#define RetSig 16 /* function returns a signal */
/*
* tend_var contains information about a tended variable in the "declare {...}"
* action of an operation.
*/
struct tend_var {
int var_type; /* TndDesc, TndStr, or TndBlk */
struct il_c *init; /* initial value from declaration */
char *blk_name; /* TndBlk: struct name of block */
};
/*
* ord_var contains information about an ordinary variable in the
* "declare {...}" action of an operation.
*/
struct ord_var {
char *name; /* name of variable */
struct il_c *dcl; /* declaration of variable (includes name) */
};
/*
* il_code has information about an action in an operation.
*/
#define IL_If1 1
#define IL_If2 2
#define IL_Tcase1 3
#define IL_Tcase2 4
#define IL_Lcase 5
#define IL_Err1 6
#define IL_Err2 7
#define IL_Lst 8
#define IL_Const 9
#define IL_Bang 10
#define IL_And 11
#define IL_Cnv1 12
#define IL_Cnv2 13
#define IL_Def1 14
#define IL_Def2 15
#define IL_Is 16
#define IL_Var 17
#define IL_Subscr 18
#define IL_Block 19
#define IL_Call 20
#define IL_Abstr 21
#define IL_VarTyp 22
#define IL_Store 23
#define IL_Compnt 24
#define IL_TpAsgn 25
#define IL_Union 26
#define IL_Inter 27
#define IL_New 28
#define IL_IcnTyp 29
#define IL_Acase 30
#define CM_Fields -1
union il_fld {
struct il_code *fld;
struct il_c *c_cd;
int *vect;
char *s;
word n;
};
struct il_code {
int il_type;
union il_fld u[1]; /* actual number of fields varies with type */
};
/*
* The following manifest constants are used to describe types, conversions,
* and returned values. Non-negative numbers are reserved for types described
* in the type specification system.
*/
#define TypAny -1
#define TypEmpty -2
#define TypVar -3
#define TypCInt -4
#define TypCDbl -5
#define TypCStr -6
#define TypEInt -7
#define TypECInt -8
#define TypTStr -9
#define TypTCset -10
#define RetDesc -11
#define RetNVar -12
#define RetSVar -13
#define RetNone -14
/*
* il_c describes a piece of C code.
*/
#define ILC_Ref 1 /* nonmodifying reference to var. in sym. tab. */
#define ILC_Mod 2 /* modifying reference to var. in sym. tab */
#define ILC_Tend 3 /* tended var. local to inline block */
#define ILC_SBuf 4 /* string buffer */
#define ILC_CBuf 5 /* cset buffer */
#define ILC_Ret 6 /* return statement */
#define ILC_Susp 7 /* suspend statement */
#define ILC_Fail 8 /* fail statement */
#define ILC_Goto 9 /* goto */
#define ILC_CGto 10 /* conditional goto */
#define ILC_Lbl 11 /* label */
#define ILC_LBrc 12 /* '{' */
#define ILC_RBrc 13 /* '}' */
#define ILC_Str 14 /* arbitrary string of code */
#define ILC_EFail 15 /* errorfail statement */
#define RsltIndx -1 /* symbol table index for "result" */
struct il_c {
int il_c_type;
struct il_c *code[3];
word n;
char *s;
struct il_c *next;
};
/*
* The parameter value of a run-time operation may be in one of several
* different locations depending on what conversions have been done to it.
* These codes are shared by rtt and iconc.
*/
#define PrmTend 1 /* in tended location */
#define PrmCStr 3 /* converted to C string: tended location */
#define PrmInt 4 /* converted to C int: non-tended location */
#define PrmDbl 8 /* converted to C double: non-tended location */
/*
* Kind of RLT return statement supported.
*/
#define TRetNone 0 /* does not support an RTL return statement */
#define TRetBlkP 1 /* block pointer */
#define TRetDescP 2 /* descriptor pointer */
#define TRetCharP 3 /* character pointer */
#define TRetCInt 4 /* C integer */
#define TRetSpcl 5 /* RLT return statement has special form & semenatics */
/*
* Codes for dereferencing needs.
*/
#define DrfNone 0 /* not a variable type */
#define DrfGlbl 1 /* treat as a global variable */
#define DrfCnst 2 /* type of values in variable doesn't change */
#define DrfSpcl 3 /* special dereferencing: trapped variable */
/*
* Information about an Icon type.
*/
struct icon_type {
char *id; /* name of type */
int support_new; /* supports RTL "new" construct */
int deref; /* dereferencing needs */
int rtl_ret; /* kind of RTL return supported if any */
char *typ; /* for variable: initial type */
int num_comps; /* for aggregate: number of type components */
int compnts; /* for aggregate: index of first component */
char *abrv; /* abreviation used for type tracing */
char *cap_id; /* name of type with first character capitalized */
};
/*
* Information about a component of an aggregate type.
*/
struct typ_compnt {
char *id; /* name of component */
int n; /* position of component within type aggragate */
int var; /* flag: this component is an Icon-level variable */
int aggregate; /* index of type that owns the component */
char *abrv; /* abreviation used for type tracing */
};
extern int num_typs; /* number of types in table */
extern struct icon_type icontypes[]; /* table of icon types */
/*
* Type inference needs to know where most of the standard types
* reside. Some have special uses outside operations written in
* RTL code, such as the null type for initializing variables, and
* others have special semantics, such as trapped variables.
*/
extern int str_typ; /* index of string type */
extern int int_typ; /* index of integer type */
extern int rec_typ; /* index of record type */
extern int proc_typ; /* index of procedure type */
extern int coexp_typ; /* index of co-expression type */
extern int stv_typ; /* index of sub-string trapped var type */
extern int ttv_typ; /* index of table-elem trapped var type */
extern int null_typ; /* index of null type */
extern int cset_typ; /* index of cset type */
extern int real_typ; /* index of real type */
extern int list_typ; /* index of list type */
extern int tbl_typ; /* index of table type */
extern int num_cmpnts; /* number of aggregate components */
extern struct typ_compnt typecompnt[]; /* table of aggregate components */
extern int str_var; /* index of trapped string variable */
extern int trpd_tbl; /* index of trapped table */
extern int lst_elem; /* index of list element */
extern int tbl_val; /* index of table element value */
extern int tbl_dflt; /* index of table default */
/*
* minimum number of unsigned ints needed to hold the bits of a cset - only
* used in translators, not in the run-time system.
*/
#define BVectSize 16
|