Subversion Repositories tendra.SVN

Rev

Rev 2 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 7u83 1
/*
7 7u83 2
 * Copyright (c) 2002-2005 The TenDRA Project <http://www.tendra.org/>.
3
 * All rights reserved.
4
 *
5
 * Redistribution and use in source and binary forms, with or without
6
 * modification, are permitted provided that the following conditions are met:
7
 *
8
 * 1. Redistributions of source code must retain the above copyright notice,
9
 *    this list of conditions and the following disclaimer.
10
 * 2. Redistributions in binary form must reproduce the above copyright notice,
11
 *    this list of conditions and the following disclaimer in the documentation
12
 *    and/or other materials provided with the distribution.
13
 * 3. Neither the name of The TenDRA Project nor the names of its contributors
14
 *    may be used to endorse or promote products derived from this software
15
 *    without specific, prior written permission.
16
 *
17
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS
18
 * IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
19
 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
20
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR
21
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
22
 * EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
23
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
24
 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
25
 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
26
 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
27
 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28
 *
29
 * $Id$
30
 */
31
/*
2 7u83 32
    		 Crown Copyright (c) 1997
7 7u83 33
 
2 7u83 34
    This TenDRA(r) Computer Program is subject to Copyright
35
    owned by the United Kingdom Secretary of State for Defence
36
    acting through the Defence Evaluation and Research Agency
37
    (DERA).  It is made available to Recipients with a
38
    royalty-free licence for its use, reproduction, transfer
39
    to other parties and amendment for any purpose not excluding
40
    product development provided that any such use et cetera
41
    shall be deemed to be acceptance of the following conditions:-
7 7u83 42
 
2 7u83 43
        (1) Its Recipients shall ensure that this Notice is
44
        reproduced upon any copies or amended versions of it;
7 7u83 45
 
2 7u83 46
        (2) Any amended version of it shall be clearly marked to
47
        show both the nature of and the organisation responsible
48
        for the relevant amendment or amendments;
7 7u83 49
 
2 7u83 50
        (3) Its onward transfer from a recipient to another
51
        party shall be deemed to be that party's acceptance of
52
        these conditions;
7 7u83 53
 
2 7u83 54
        (4) DERA gives no warranty or assurance as to its
55
        quality or suitability for any purpose and DERA accepts
56
        no liability whatsoever in relation to any use to which
57
        it may be put.
58
*/
59
 
60
 
61
#include "config.h"
62
#include "calculus.h"
63
#include "code.h"
64
#include "error.h"
65
#include "common.h"
66
#include "lex.h"
67
#include "output.h"
68
#include "suffix.h"
69
#include "token.h"
70
#include "type_ops.h"
71
 
72
 
73
/*
7 7u83 74
 * PRINT SIMPLE TOKENS
75
 *
76
 * This routine prints the simple tokens for a type named nm with short
77
 * name ns.  e is true for simply dereferenced types.
78
 */
2 7u83 79
 
7 7u83 80
static void
81
print_simple_tok(char *nm, char *ns, int e, int lst)
2 7u83 82
{
83
    /* SIZE token */
7 7u83 84
    output("%pt %xc : SIZE(%e) : SIZE_%e #\n\n", nm, ns);
2 7u83 85
 
86
    /* Assign token */
7 7u83 87
    output("%pt PROC(\\\n");
88
    output("\t%xr : PTR(%e) :,\\\n\t%xr : %e :\\\n    ) ", nm, nm);
89
    output(e ? "%xr : void :" : "STATEMENT");
90
    output(" COPY_%e #\n\n", ns);
2 7u83 91
 
92
    /* Dereference token */
7 7u83 93
    output("%pt PROC(\\\n");
94
    output("\t%xr : PTR(%e) :", nm);
95
    if (e) {
96
	output("\\\n    ) %xr : %e :", nm);
2 7u83 97
    } else {
7 7u83 98
	output(",\\\n\t%xl : %e :\\\n    ) STATEMENT", nm);
2 7u83 99
    }
7 7u83 100
    output(" DEREF_%e #\n\n", ns);
2 7u83 101
 
7 7u83 102
    if (lst) {
2 7u83 103
	/* CONS token */
7 7u83 104
	output("%pt PROC(\\\n");
105
	output("\t%xr : %e :,\\\n\t%xr : LIST(%e) :,\\\n", nm, nm);
106
	output("\t%xl : LIST(%e) :\\\n", nm);
107
	output("    ) STATEMENT CONS_%e #\n\n", ns);
2 7u83 108
 
109
	/* UN_CONS token */
7 7u83 110
	output("%pt PROC(\\\n");
111
	output("\t%xl : %e :,\\\n", nm);
112
	output("\t%xl : LIST(%e) :,\\\n", nm);
113
	output("\t%xr : LIST(%e) :\\\n", nm);
114
	output("    ) STATEMENT UN_CONS_%e #\n\n", ns);
2 7u83 115
 
116
	/* DESTROY_CONS token */
7 7u83 117
	output("%pt PROC(\\\n");
118
	output("\t%xr : DESTROYER :,\\\n\t%xl : %e :,\\\n", nm);
119
	output("\t%xl : LIST(%e) :,\\\n", nm);
120
	output("\t%xr : LIST(%e) :\\\n", nm);
121
	output("    ) STATEMENT DESTROY_CONS_%e #\n\n", ns);
2 7u83 122
 
7 7u83 123
	if (allow_stack) {
2 7u83 124
	    /* PUSH token */
7 7u83 125
	    output("%pt PROC(\\\n");
126
	    output("\t%xr : %e :,\\\n", nm);
127
	    output("\t%xl : STACK(%e) :\\\n", nm);
128
	    output("    ) STATEMENT PUSH_%e #\n\n", ns);
2 7u83 129
 
130
	    /* POP token */
7 7u83 131
	    output("%pt PROC(\\\n");
132
	    output("\t%xl : %e :,\\\n", nm);
133
	    output("\t%xl : STACK(%e) :\\\n", nm);
134
	    output("    ) STATEMENT POP_%e #\n\n", ns);
2 7u83 135
	}
136
    }
137
 
138
    /* Interface commands */
7 7u83 139
    output("%pi SIZE_%e COPY_%e DEREF_%e\n", ns, ns, ns);
140
    if (lst) {
141
	output("%pi CONS_%e UN_CONS_%e DESTROY_CONS_%e\n", ns, ns, ns);
142
	if (allow_stack) {
143
		output("%pi PUSH_%e POP_%e\n", ns, ns);
144
	}
2 7u83 145
    }
7 7u83 146
    output("\n\n");
147
    return;
2 7u83 148
}
149
 
150
 
151
/*
7 7u83 152
 * PRINT SIMPLE TOKENS FOR TYPE OPERATIONS
153
 *
154
 * This routine prints the simple tokens for the type operation op.
155
 * The tokens are named using nm.  e is true for simply dereferenced types.
156
 */
2 7u83 157
 
7 7u83 158
static void
159
print_type_ops_tok(char *op, char *nm, int e)
2 7u83 160
{
161
    /* Size token */
7 7u83 162
    output("%pt PROC(\\\n\tTYPE t\\\n");
163
    output("    ) %xc : SIZE(%s(t)) : SIZE_%s #\n\n", op, nm);
2 7u83 164
 
165
    /* Assign token */
7 7u83 166
    output("%pt PROC {\\\n");
167
    output("\tTYPE t, %xr : PTR(%s(t)) : e1,\\\n", op);
168
    output("\t%xr : %s(t) : e2 |\\\n", op);
169
    output("\tEXP e1, EXP e2\\\n    } ");
170
    output(e ? "%xr : void :" : "STATEMENT");
171
    output(" COPY_%s #\n\n", nm);
2 7u83 172
 
173
    /* Dereference token */
7 7u83 174
    output("%pt PROC {\\\n");
175
    output("\tTYPE t, %xr : PTR(%s(t)) : e", op);
176
    if (e) {
177
	output(" |\\\n\tEXP e\\\n");
178
	output("    } %xr : %s(t) : ", op);
2 7u83 179
    } else {
7 7u83 180
	output("1,\\\n\t%xl : %s(t) : e2 |\\\n", op);
181
	output("\tEXP e1, EXP e2\\\n");
182
	output("    } STATEMENT ");
2 7u83 183
    }
7 7u83 184
    output("DEREF_%s #\n\n", nm);
2 7u83 185
 
186
    /* CONS token */
7 7u83 187
    output("%pt PROC {\\\n");
188
    output("\tTYPE t, %xr : %s(t) : e2,\\\n", op);
189
    output("\t%xr : LIST(%s(t)) : e3,\\\n", op);
190
    output("\t%xl : LIST(%s(t)) : e4 |\\\n", op);
191
    output("\tEXP e2, EXP e3, EXP e4\\\n");
192
    output("    } STATEMENT CONS_%s #\n\n", nm);
2 7u83 193
 
194
    /* UN_CONS token */
7 7u83 195
    output("%pt PROC {\\\n");
196
    output("\tTYPE t, %xl : %s(t) : e2,\\\n", op);
197
    output("\t%xl : LIST(%s(t)) : e3,\\\n", op);
198
    output("\t%xr : LIST(%s(t)) : e4 |\\\n", op);
199
    output("\tEXP e2, EXP e3, EXP e4\\\n");
200
    output("    } STATEMENT UN_CONS_%s #\n\n", nm);
2 7u83 201
 
202
    /* DESTROY_CONS token */
7 7u83 203
    output("%pt PROC {\\\n");
204
    output("\tTYPE t, %xr : DESTROYER : e1,\\\n");
205
    output("\t%xl : %s(t) : e2,\\\n", op);
206
    output("\t%xl : LIST(%s(t)) : e3,\\\n", op);
207
    output("\t%xr : LIST(%s(t)) : e4 |\\\n", op);
208
    output("\tEXP e1, EXP e2, EXP e3, EXP e4\\\n");
209
    output("    } STATEMENT DESTROY_CONS_%s #\n\n", nm);
2 7u83 210
 
7 7u83 211
    if (allow_stack) {
2 7u83 212
	/* PUSH token */
7 7u83 213
	output("%pt PROC {\\\n");
214
	output("\tTYPE t, %xr : %s(t) : e2,\\\n", op);
215
	output("\t%xl : STACK(%s(t)) : e3 |\\\n", op);
216
	output("\tEXP e2, EXP e3\\\n");
217
	output("    } STATEMENT PUSH_%s #\n\n", nm);
2 7u83 218
 
219
	/* POP token */
7 7u83 220
	output("%pt PROC {\\\n");
221
	output("\tTYPE t, %xl : %s(t) : e2,\\\n", op);
222
	output("\t%xl : STACK(%s(t)) : e3 |\\\n", op);
223
	output("\tEXP e2, EXP e3\\\n");
224
	output("    } STATEMENT POP_%s #\n\n", nm);
2 7u83 225
    }
226
 
227
    /* Interface commands */
7 7u83 228
    output("%pi SIZE_%s COPY_%s DEREF_%s\n", nm, nm, nm);
229
    output("%pi CONS_%s UN_CONS_%s DESTROY_CONS_%s\n", nm, nm, nm);
230
    if (allow_stack) {
231
	    output("%pi PUSH_%s POP_%s\n", nm, nm);
232
    }
233
    output("\n\n");
234
    return;
2 7u83 235
}
236
 
237
 
238
/*
7 7u83 239
 * PRINT BASIC TYPES (TOKEN VERSION)
240
 *
241
 * This routine prints the token versions of the basic type definitions.
242
 */
2 7u83 243
 
7 7u83 244
static void
245
print_types_tok(void)
2 7u83 246
{
7 7u83 247
    comment("Primitive types");
2 7u83 248
    LOOP_PRIMITIVE {
7 7u83 249
	CLASS_ID_P c = DEREF_ptr(prim_id(CRT_PRIMITIVE));
250
	char *pn = DEREF_string(cid_name(c));
251
	char *pd = DEREF_string(prim_defn(CRT_PRIMITIVE));
252
	if (!streq(pn, pd)) {
253
		output("typedef %PD %PN;\n");
254
	}
2 7u83 255
    }
7 7u83 256
    output("\n\n");
2 7u83 257
 
7 7u83 258
    comment("Basic types");
259
    output("#ifndef %X_DESTR_DEFINED\n");
260
    output("#define %X_DESTR_DEFINED\n");
261
    output("typedef void (*DESTROYER)();\n");
262
    output("#endif\n\n");
263
    output("%pt PROC(TYPE) TYPE PTR #\n");
264
    output("%pt PROC(TYPE) TYPE LIST #\n");
265
    if (allow_stack) {
266
	output("%pt PROC(TYPE) TYPE STACK #\n");
2 7u83 267
    }
7 7u83 268
    if (allow_vec) {
269
	output("%pt VARIETY %X_dim #\n");
270
	output("%pt PROC(TYPE) TYPE VEC #\n");
271
	output("%pt PROC(TYPE) TYPE VEC_PTR #\n");
2 7u83 272
    }
7 7u83 273
    output("%pt PROC(TYPE) TYPE SIZE #\n\n");
274
    output("%pi PTR LIST ");
275
    if (allow_stack) {
276
	    output("STACK ");
277
    }
278
    if (allow_vec) {
279
	    output("%X_dim VEC VEC_PTR ");
280
    }
281
    output("SIZE\n\n\n");
2 7u83 282
 
7 7u83 283
    comment("Enumeration type definitions");
2 7u83 284
    LOOP_ENUM {
7 7u83 285
	output("%pt VARIETY %EN #\n");
286
	output("%pi %EN\n");
2 7u83 287
    }
7 7u83 288
    output("\n\n");
2 7u83 289
 
7 7u83 290
    comment("Union type definitions");
2 7u83 291
    LOOP_UNION {
7 7u83 292
	output("%pt TYPE %UN #\n");
293
	output("%pi %UN\n");
2 7u83 294
    }
7 7u83 295
    output("\n\n");
2 7u83 296
 
7 7u83 297
    print_struct_defn();
2 7u83 298
 
7 7u83 299
    comment("Function declarations");
300
    output("extern void destroy_%X();\n");
301
    output("extern void dummy_destroy_%X();\n");
302
    output("#ifdef %X_IO_ROUTINES\n");
303
    output("extern unsigned crt_%X_alias;\n");
304
    output("extern void clear_%X_alias(void);\n");
305
    output("#endif\n");
306
    output("\n\n");
307
    return;
2 7u83 308
}
309
 
310
 
311
/*
7 7u83 312
 * PRINT POINTER CONSTRUCTS (TOKEN VERSION)
313
 *
314
 * This routine prints the token versions of the pointer constructs.
315
 */
2 7u83 316
 
7 7u83 317
static void
318
print_ptr_tok(void)
2 7u83 319
{
7 7u83 320
    comment("Pointer token specifications");
321
    output("%pt PROC {\\\n");
322
    output("\tTYPE t, %xr : PTR(t) : e1, %xr : SIZE(t) : e2 |\\\n");
323
    output("\tEXP e1, EXP e2\\\n");
324
    output("    } %xr : PTR(t) : STEP_ptr #\n\n");
2 7u83 325
 
7 7u83 326
    output("%pt PROC(\\\n\tTYPE t\\\n");
327
    output("    ) %xc : PTR(t) : NULL_ptr #\n\n");
2 7u83 328
 
7 7u83 329
    output("%pt PROC {\\\n");
330
    output("\tTYPE t, %xr : PTR(t) : e |\\\n");
331
    output("\tEXP e\\\n");
332
    output("    } %xr : int : IS_NULL_ptr #\n\n");
2 7u83 333
 
7 7u83 334
    output("%pt PROC {\\\n");
335
    output("\tTYPE t, %xr : PTR(t) : e1, %xr : PTR(t) : e2 |\\\n");
336
    output("\tEXP e1, EXP e2\\\n");
337
    output("    } %xr : int : EQ_ptr #\n\n");
2 7u83 338
 
7 7u83 339
    output("%pt PROC {\\\n");
340
    output("\tTYPE t, %xr : SIZE(t) : e |\\\n");
341
    output("\tEXP e\\\n");
342
    output("    } %xr : PTR(t) : MAKE_ptr #\n\n");
2 7u83 343
 
7 7u83 344
    output("%pt PROC {\\\n");
345
    output("\tTYPE t, %xr : PTR(t) : e1, %xr : SIZE(t) : e2 |\\\n");
346
    output("\tEXP e1, EXP e2\\\n");
347
    output("    } %xr : void : DESTROY_ptr #\n\n");
2 7u83 348
 
7 7u83 349
    output("%pt PROC(\\\n\tTYPE t\\\n");
350
    output("    ) %xr : PTR(t) : UNIQ_ptr #\n\n");
2 7u83 351
 
7 7u83 352
    output("%pt PROC {\\\n");
353
    output("\tTYPE t, %xr : PTR(t) : e |\\\n");
354
    output("\tEXP e\\\n");
355
    output("    } %xr : void : DESTROY_UNIQ_ptr #\n\n");
2 7u83 356
 
7 7u83 357
    output("%pi STEP_ptr NULL_ptr IS_NULL_ptr EQ_ptr\n");
358
    output("%pi MAKE_ptr DESTROY_ptr\n\n");
2 7u83 359
 
7 7u83 360
    output("#ifdef %X_IO_ROUTINES\n");
361
    output("%pt PROC {\\\n");
362
    output("\tTYPE t, %xr : PTR(t) : e |\\\n");
363
    output("\tEXP e\\\n");
364
    output("    } %xr : void * : VOIDSTAR_ptr #\n");
365
    output("%pi VOIDSTAR_ptr\n");
366
    output("#endif\n\n");
2 7u83 367
 
7 7u83 368
    print_type_ops_tok("PTR", "ptr", 1);
369
    return;
2 7u83 370
}
371
 
372
 
373
/*
7 7u83 374
 * PRINT LIST CONSTRUCTS (TOKEN VERSION)
375
 *
376
 * This routine prints the token versions of the list constructs.
377
 */
2 7u83 378
 
7 7u83 379
static void
380
print_list_tok(void)
2 7u83 381
{
7 7u83 382
    comment("List token specifications");
383
    output("%pt PROC {\\\n");
384
    output("\tTYPE t, %xr : LIST(t) : e |\\\n");
385
    output("\tEXP e\\\n");
386
    output("    } %xr : PTR(t) : HEAD_list #\n\n");
2 7u83 387
 
7 7u83 388
    output("%pt PROC {\\\n");
389
    output("\tTYPE t, %xr : LIST(t) : e |\\\n");
390
    output("\tEXP e\\\n");
391
    output("    } %xr : PTR(LIST(t)) : PTR_TAIL_list #\n\n");
2 7u83 392
 
7 7u83 393
    output("%pt PROC {\\\n");
394
    output("\tTYPE t, %xr : LIST(t) : e |\\\n");
395
    output("\tEXP e\\\n");
396
    output("    } %xr : LIST(t) : TAIL_list #\n\n");
2 7u83 397
 
7 7u83 398
    output("%pt PROC {\\\n");
399
    output("\tTYPE t, %xr : LIST(t) : e1 |\\\n");
400
    output("\tEXP e1\\\n");
401
    output("    } %xr : unsigned : LENGTH_list #\n\n");
2 7u83 402
 
7 7u83 403
    output("%pt PROC {\\\n");
404
    output("\tTYPE t, %xr : LIST(t) : e1 |\\\n");
405
    output("\tEXP e1\\\n");
406
    output("    } %xr : LIST(t) : END_list #\n\n");
2 7u83 407
 
7 7u83 408
    output("%pt PROC {\\\n");
409
    output("\tTYPE t, %xr : LIST(t) : e1 |\\\n");
410
    output("\tEXP e1\\\n");
411
    output("    } %xr : LIST(t) : REVERSE_list #\n\n");
2 7u83 412
 
7 7u83 413
    output("%pt PROC {\\\n");
414
    output("\tTYPE t, %xr : LIST(t) : e1, %xr : LIST(t) : e2 |\\\n");
415
    output("\tEXP e1, EXP e2\\\n");
416
    output("    } %xr : LIST(t) : APPEND_list #\n\n");
2 7u83 417
 
7 7u83 418
    output("%pt PROC(\\\n\tTYPE t\\\n");
419
    output("    ) %xc : LIST(t) : NULL_list #\n\n");
2 7u83 420
 
7 7u83 421
    output("%pt PROC {\\\n");
422
    output("\tTYPE t, %xr : LIST(t) : e |\\\n");
423
    output("\tEXP e\\\n");
424
    output("    } %xr : int : IS_NULL_list #\n\n");
2 7u83 425
 
7 7u83 426
    output("%pt PROC {\\\n");
427
    output("\tTYPE t, %xr : LIST(t) : e1, %xr : LIST(t) : e2 |\\\n");
428
    output("\tEXP e1, EXP e2\\\n");
429
    output("    } %xr : int : EQ_list #\n\n");
2 7u83 430
 
7 7u83 431
    output("%pt PROC(\\\n\tTYPE t\\\n");
432
    output("    ) %xr : LIST(t) : UNIQ_list #\n\n");
2 7u83 433
 
7 7u83 434
    output("%pt PROC {\\\n");
435
    output("\tTYPE t, %xr : LIST(t) : e |\\\n");
436
    output("\tEXP e\\\n");
437
    output("    } %xr : void : DESTROY_UNIQ_list #\n\n");
2 7u83 438
 
7 7u83 439
    output("%pt PROC {\\\n");
440
    output("\tTYPE t, %xr : LIST(t) : e1, %xr : SIZE(t) : e2 |\\\n");
441
    output("\tEXP e1, EXP e2\\\n");
442
    output("    } STATEMENT DESTROY_list #\n\n");
2 7u83 443
 
7 7u83 444
    output("%pi HEAD_list PTR_TAIL_list TAIL_list\n");
445
    output("%pi LENGTH_list END_list REVERSE_list APPEND_list\n");
446
    output("%pi NULL_list IS_NULL_list EQ_list\n");
447
    output("%pi UNIQ_list DESTROY_UNIQ_list DESTROY_list\n\n");
2 7u83 448
 
7 7u83 449
    output("#ifdef %X_IO_ROUTINES\n");
450
    output("%pt PROC {\\\n");
451
    output("\tTYPE t, %xr : LIST(t) : e |\\\n");
452
    output("\tEXP e\\\n");
453
    output("    } %xr : void * : VOIDSTAR_list #\n");
454
    output("%pi VOIDSTAR_list\n");
455
    output("#endif\n\n");
2 7u83 456
 
7 7u83 457
    print_type_ops_tok("LIST", "list", 1);
458
    return;
2 7u83 459
}
460
 
461
 
462
/*
7 7u83 463
 * PRINT STACK CONSTRUCTS (TOKEN VERSION)
464
 *
465
 * This routine prints the token versions of the stack constructs.
466
 */
2 7u83 467
 
7 7u83 468
static void
469
print_stack_tok(void)
2 7u83 470
{
7 7u83 471
    comment("Stack token specifications");
472
    output("%pt PROC(\\\n\tTYPE t\\\n");
473
    output("    ) %xc : STACK(t) : NULL_stack #\n\n");
2 7u83 474
 
7 7u83 475
    output("%pt PROC {\\\n");
476
    output("\tTYPE t, %xr : STACK(t) : e |\\\n");
477
    output("\tEXP e\\\n");
478
    output("    } %xr : int : IS_NULL_stack #\n\n");
2 7u83 479
 
7 7u83 480
    output("%pt PROC {\\\n");
481
    output("\tTYPE t, %xr : STACK(t) : e1 |\\\n");
482
    output("\tEXP e1\\\n");
483
    output("    } %xr : LIST(t) : LIST_stack #\n\n");
2 7u83 484
 
7 7u83 485
    output("%pt PROC {\\\n");
486
    output("\tTYPE t, %xr : LIST(t) : e1 |\\\n");
487
    output("\tEXP e1\\\n");
488
    output("    } %xr : STACK(t) : STACK_list #\n\n");
2 7u83 489
 
7 7u83 490
    output("%pi NULL_stack IS_NULL_stack LIST_stack STACK_list\n\n");
2 7u83 491
 
7 7u83 492
    print_type_ops_tok("STACK", "stack", 1);
493
    return;
2 7u83 494
}
495
 
496
 
497
/*
7 7u83 498
 * PRINT VECTOR CONSTRUCTS (TOKEN VERSION)
499
 *
500
 * This routine prints the token versions of the vector constructs.
501
 */
2 7u83 502
 
7 7u83 503
static void
504
print_vec_tok(void)
2 7u83 505
{
7 7u83 506
    comment("Vector token specifications");
507
    output("%pt PROC {\\\n");
508
    output("\tTYPE t, %xr : VEC(t) : e |\\\n");
509
    output("\tEXP e\\\n");
510
    output("    } %xr : %X_dim : DIM_vec #\n\n");
2 7u83 511
 
7 7u83 512
    output("%pt PROC {\\\n");
513
    output("\tTYPE t, %xr : PTR(VEC(t)) : e |\\\n");
514
    output("\tEXP e\\\n");
515
    output("    } %xr : PTR(t) : PTR_ptr_vec #\n\n");
2 7u83 516
 
7 7u83 517
    output("%pt PROC {\\\n");
518
    output("\tTYPE t, %xr : PTR(VEC(t)) : e |\\\n");
519
    output("\tEXP e\\\n");
520
    output("    } %xr : %X_dim : DIM_ptr_vec #\n\n");
2 7u83 521
 
7 7u83 522
    output("%pt PROC(\\\n\tTYPE t\\\n");
523
    output("    ) %xr : VEC(t) : NULL_vec #\n\n");
2 7u83 524
 
7 7u83 525
    output("%pt PROC {\\\n");
526
    output("\tTYPE t, %xr : SIZE(t) : e1,\\\n");
527
    output("\t%xr : %X_dim : e2,\\\n");
528
    output("\t%xl : VEC(t) : e3 |\\\n");
529
    output("\tEXP e1, EXP e2, EXP e3\\\n");
530
    output("    } STATEMENT MAKE_vec #\n\n");
2 7u83 531
 
7 7u83 532
    output("%pt PROC {\\\n");
533
    output("\tTYPE t, %xr : VEC(t) : e1, %xr : SIZE(t) : e2 |\\\n");
534
    output("\tEXP e1, EXP e2\\\n");
535
    output("    } STATEMENT DESTROY_vec #\n\n");
2 7u83 536
 
7 7u83 537
    output("%pt PROC {\\\n");
538
    output("\tTYPE t, %xr : VEC(t) : e1,\\\n");
539
    output("\t%xr : SIZE(t) : e2, %xr : int : e3,\\\n");
540
    output("\t%xr : int : e4, %xl : VEC(t) : e5 |\\\n");
541
    output("\tEXP e1, EXP e2, EXP e3, EXP e4, EXP e5\\\n");
542
    output("    } STATEMENT TRIM_vec #\n\n");
2 7u83 543
 
7 7u83 544
    output("%pi DIM_vec PTR_ptr_vec DIM_ptr_vec\n");
545
    output("%pi NULL_vec MAKE_vec DESTROY_vec TRIM_vec\n\n");
546
    print_type_ops_tok("VEC", "vec", 0);
547
    return;
2 7u83 548
}
549
 
550
 
551
/*
7 7u83 552
 * PRINT VECTOR POINTER CONSTRUCTS (TOKEN VERSION)
553
 *
554
 * This routine prints the token versions of the vector pointer
555
 * constructs.
556
 */
2 7u83 557
 
7 7u83 558
static void
559
print_vec_ptr_tok(void)
2 7u83 560
{
7 7u83 561
    comment("Vector pointer token specifications");
562
    output("%pt PROC {\\\n");
563
    output("\tTYPE t, %xr : VEC(t) : e |\\\n");
564
    output("\tEXP e\\\n");
565
    output("    } %xr : VEC_PTR(t) : VEC_PTR_vec #\n\n");
2 7u83 566
 
7 7u83 567
    output("%pt PROC {\\\n");
568
    output("\tTYPE t, %xr : VEC_PTR(t) : e |\\\n");
569
    output("\tEXP e\\\n");
570
    output("    } %xr : PTR(t) : PTR_vec_ptr #\n\n");
2 7u83 571
 
7 7u83 572
    output("%pi VEC_PTR_vec PTR_vec_ptr\n\n");
573
    print_type_ops_tok("VEC_PTR", "vec_ptr", 0);
574
    return;
2 7u83 575
}
576
 
577
 
578
/*
7 7u83 579
 * PRINT SIZE CONSTRUCTS (TOKEN VERSION)
580
 *
581
 * This routine prints the token versions of the size constructs.
582
 */
2 7u83 583
 
7 7u83 584
static void
585
print_size_tok(void)
2 7u83 586
{
7 7u83 587
    comment("Size token specifications");
588
    output("%pt PROC {\\\n");
589
    output("\tTYPE t, VARIETY v,\\\n");
590
    output("\t%xr : SIZE(t) : e1, %xr : v : e2 |\\\n");
591
    output("\tEXP e1, EXP e2\\\n");
592
    output("    } %xr : SIZE(t) : SCALE #\n\n");
593
    output("%pi SCALE\n\n\n");
594
    return;
2 7u83 595
}
596
 
597
 
598
/*
7 7u83 599
 * PRINT PRIMITIVE CONSTRUCTS (TOKEN VERSION)
600
 *
601
 * This routine prints the token versions of the primitive constructs.
602
 */
2 7u83 603
 
7 7u83 604
static void
605
print_prim_tok(void)
2 7u83 606
{
7 7u83 607
    comment("Definitions for primitive %PN");
608
    print_simple_tok("%PN", "%PM", 1, 1);
609
    return;
2 7u83 610
}
611
 
612
 
613
/*
7 7u83 614
 * PRINT ENUMERATION CONSTRUCTS (TOKEN VERSION)
615
 *
616
 * This routine prints the token versions of the enumeration constructs.
617
 */
2 7u83 618
 
7 7u83 619
static void
620
print_enum_tok(void)
2 7u83 621
{
7 7u83 622
    int lst = DEREF_int(en_lists(CRT_ENUM));
623
    comment("Definitions for enumeration %EN");
624
    print_enum_consts();
625
    print_simple_tok("%EN", "%EM", 1, lst);
626
    return;
2 7u83 627
}
628
 
629
 
630
/*
7 7u83 631
 * PRINT STRUCTURE CONSTRUCTS (TOKEN VERSION)
632
 *
633
 * This routine prints the token versions of the structure constructs.
634
 */
2 7u83 635
 
7 7u83 636
static void
637
print_struct_tok(void)
2 7u83 638
{
7 7u83 639
    STRUCTURE_P base = DEREF_ptr(str_base(CRT_STRUCTURE));
2 7u83 640
 
7 7u83 641
    comment("Definitions for structure %SN");
2 7u83 642
    LOOP_STRUCTURE_COMPONENT {
7 7u83 643
	output("%pt PROC(%xr : PTR(%SN) :) ");
644
	output("%xr : PTR(%CT) : %SM_%CN #\n");
645
	output("%pi %SM_%CN\n\n");
2 7u83 646
    }
7 7u83 647
    output("%pt PROC(\\\n");
2 7u83 648
    LOOP_STRUCTURE_COMPONENT {
7 7u83 649
	string v = DEREF_string(cmp_value(CRT_COMPONENT));
650
	if (v == NULL) {
651
		output("\t%xr : %CT :,\\\n");
652
	}
2 7u83 653
    }
7 7u83 654
    output("\t%xr : PTR(%SN) :\\\n");
655
    output("    ) STATEMENT MAKE_%SM #\n");
656
    output("%pi MAKE_%SM\n\n");
2 7u83 657
 
7 7u83 658
    if (!IS_NULL_ptr(base)) {
659
	CLASS_ID_P id = DEREF_ptr(str_id(base));
660
	char *nt = DEREF_string(cid_name(id));
661
	char *nm = DEREF_string(cid_name_aux(id));
662
	output("%pt PROC(\\\n");
663
	output("\t%xr : PTR(%SN) :\\\n");
664
	output("    ) %xr : PTR(%s) : CONVERT_%SM_%s #\n", nt, nm);
665
	output("%pi CONVERT_%SM_%s\n\n", nm);
2 7u83 666
    }
667
 
7 7u83 668
    print_simple_tok("%SN", "%SM", 0, 1);
669
    return;
2 7u83 670
}
671
 
672
 
673
/*
7 7u83 674
 * PRINT UNION CONSTRUCTS (TOKEN VERSION)
675
 *
676
 * This routine prints the token versions of the union constructs.
677
 */
2 7u83 678
 
7 7u83 679
static void
680
print_union_tok(void)
2 7u83 681
{
7 7u83 682
    UNION_P base = DEREF_ptr(un_base(CRT_UNION));
2 7u83 683
 
7 7u83 684
    comment("Definitions for union %UN");
685
    output("#define ORDER_%UM ((unsigned)%UO)\n");
686
    output("%pt %xc : %UN : NULL_%UM #\n");
687
    output("%pt PROC(%xr : %UN :) %xr : int : IS_NULL_%UM #\n");
688
    output("%pt PROC(%xr : %UN :, %xr : %UN :) ");
689
    output("%xr : int : EQ_%UM #\n");
690
    output("%pi NULL_%UM IS_NULL_%UM EQ_%UM\n\n");
2 7u83 691
 
7 7u83 692
    if (!IS_NULL_ptr(base)) {
693
	CLASS_ID_P id = DEREF_ptr(un_id(base));
694
	char *nt = DEREF_string(cid_name(id));
695
	char *nm = DEREF_string(cid_name_aux(id));
696
	output("%pt PROC(%xr : %UN :) %xr : %s : CONVERT_%UM_%s #\n",
697
		 nt, nm);
698
	output("%pi CONVERT_%UM_%s\n\n", nm);
2 7u83 699
    }
700
 
7 7u83 701
    print_simple_tok("%UN", "%UM", 1, 1);
702
    return;
2 7u83 703
}
704
 
705
 
706
/*
7 7u83 707
 * PRINT THE MAIN TOKEN OUTPUT FILE
708
 *
709
 * This routine prints the token specifications for the objects above.
710
 */
2 7u83 711
 
7 7u83 712
static void
713
print_main_tok(char *dir)
2 7u83 714
{
7 7u83 715
    open_file(dir, MAIN_PREFIX, MAIN_SUFFIX);
716
    if (extra_headers) {
717
	output("#include \"%s_bscs.h\"\n\n", MAIN_PREFIX);
2 7u83 718
    }
7 7u83 719
    output("#ifndef %X_NAME\n");
720
    output("#define %X_NAME%t40\"%X\"\n");
721
    output("#define %X_VERSION%t40\"%V\"\n");
722
    output("#define %X_SPECIFICATION%t40%d\n", 1);
723
    output("#define %X_IMPLEMENTATION%t40%d\n", 0);
724
    output("#endif\n\n\n");
2 7u83 725
 
7 7u83 726
    print_proto();
727
    print_types_tok();
728
    print_ptr_tok();
729
    print_list_tok();
730
    if (allow_stack) {
731
	print_stack_tok();
2 7u83 732
    }
7 7u83 733
    if (allow_vec) {
734
	print_vec_tok();
735
	print_vec_ptr_tok();
2 7u83 736
    }
7 7u83 737
    print_size_tok();
2 7u83 738
 
7 7u83 739
    LOOP_PRIMITIVE print_prim_tok();
740
    LOOP_ENUM print_enum_tok();
741
    LOOP_STRUCTURE print_struct_tok();
742
    LOOP_UNION print_union_tok();
2 7u83 743
 
7 7u83 744
    if (extra_headers) {
745
	output("#include \"%s_term.h\"\n\n", MAIN_PREFIX);
2 7u83 746
    }
7 7u83 747
    close_file();
748
    return;
2 7u83 749
}
750
 
751
 
752
 
753
/*
7 7u83 754
 * PRINT ARGUMENTS FOR A TOKENISED UNION CONSTRUCTOR
755
 *
756
 * This routine prints the list of arguments for a tokenised union
757
 * constructor and similar functions.  lv is true if all the arguments
758
 * are lvalues.
759
 */
2 7u83 760
 
7 7u83 761
static void
762
print_cons_tok_args(int lv, int d)
2 7u83 763
{
7 7u83 764
    char *a = "%xr";
765
    char *b = "%xl";
766
    if (lv) {
767
	char *c = a;
768
	a = b;
769
	b = c;
2 7u83 770
    }
771
    LOOP_UNION_COMPONENT {
7 7u83 772
	string v = DEREF_string(cmp_value(CRT_COMPONENT));
773
	if (v == NULL || d == 0) {
774
		output("\\\n\t%e : %CT :,", a);
775
	}
2 7u83 776
    }
777
    LOOP_FIELD_COMPONENT {
7 7u83 778
	string v = DEREF_string(cmp_value(CRT_COMPONENT));
779
	if (v == NULL || d == 0) {
780
		output("\\\n\t%e : %CT :,", a);
781
	}
2 7u83 782
    }
7 7u83 783
    output("\\\n\t%e : %UN :", b);
784
    return;
2 7u83 785
}
786
 
787
 
788
/*
7 7u83 789
 * PRINT FIELD SELECTOR OPERATIONS
790
 *
791
 * This routine prints the operations on field selectors (token version).
792
 * rng gives the number of elements in the field set (if appropriate).
793
 * al is true if the field is aliased.
794
 */
2 7u83 795
 
7 7u83 796
static void
797
print_field_tok(int rng, int al)
2 7u83 798
{
7 7u83 799
    char *f = (rng ? "%FN_etc" : "%FN");
2 7u83 800
 
801
    LOOP_FIELD_COMPONENT {
7 7u83 802
	output("%pt PROC(%xr : %UN :)\\\n");
803
	output("    %xr : PTR(%CT) : ");
804
	output("%UM_%e_%CN #\n", f);
805
	output("%pi %UM_%e_%CN\n\n", f);
2 7u83 806
    }
807
 
808
    /* Component constructor */
7 7u83 809
    output("%pt PROC(");
810
    if (rng) {
811
	    output("\\\n\t%xr : unsigned :,");
812
    }
813
    print_cons_tok_args(0, 1);
814
    output("\\\n    ) STATEMENT MAKE_%UM_%e #\n", f);
815
    output("%pi MAKE_%UM_%e\n\n", f);
2 7u83 816
 
817
    /* Tag modifier */
7 7u83 818
    if (rng) {
819
	output("%pt PROC(");
820
	output("\\\n\t%xr : unsigned :,");
821
	output("\\\n\t%xr : %UN :");
822
	output("\\\n    ) STATEMENT MODIFY_%UM_%e #\n", f);
823
	output("%pi MODIFY_%UM_%e\n\n", f);
2 7u83 824
    }
825
 
826
    /* Component deconstructor */
7 7u83 827
    if (field_not_empty()) {
828
	output("%pt PROC(");
829
	print_cons_tok_args(1, 0);
830
	output("\\\n    ) STATEMENT DECONS_%UM_%e #\n", f);
831
	output("%pi DECONS_%UM_%e\n\n", f);
2 7u83 832
    }
833
 
834
    /* Component destructor */
7 7u83 835
    output("%pt PROC(");
836
    output("\\\n\t%xr : DESTROYER :,");
837
    print_cons_tok_args(1, 0);
838
    output("\\\n    ) STATEMENT DESTROY_%UM_%e #\n", f);
839
    output("%pi DESTROY_%UM_%e\n\n", f);
2 7u83 840
 
841
    /* Aliasing tokens */
7 7u83 842
    if (al && !rng) {
843
	output("#ifdef %X_IO_ROUTINES\n\n");
844
	output("%pt PROC(\\\n");
845
	output("\t%xl : %UN :,\\\n");
846
	output("\t%xr : unsigned :\\\n");
847
	output("    ) STATEMENT NEW_ALIAS_%UM_%FN #\n");
848
	output("%pi NEW_ALIAS_%UM_%FN\n\n");
2 7u83 849
 
7 7u83 850
	output("%pt PROC(%xr : %UN :)\\\n    ");
851
	output("%xr : unsigned : GET_ALIAS_%UM_%FN #\n");
852
	output("%pt PROC(%xr : %UN :, %xr : unsigned :)\\\n    ");
853
	output("%xr : void : SET_ALIAS_%UM_%FN #\n");
854
	output("%pt PROC(%xr : unsigned :)\\\n    ");
855
	output("%xr : %UN : FIND_ALIAS_%UM_%FN #\n\n");
856
	output("%pi GET_ALIAS_%UM_%FN SET_ALIAS_%UM_%FN ");
857
	output("FIND_ALIAS_%UM_%FN\n\n");
858
	output("#endif\n\n");
2 7u83 859
    }
7 7u83 860
    output("\n");
861
    return;
2 7u83 862
}
863
 
864
 
865
/*
7 7u83 866
 * PRINT THE UNION OPERATIONS OUTPUT FILE
867
 *
868
 * For each union in the calculus there is an operations file.
869
 */
2 7u83 870
 
7 7u83 871
static void
872
print_union_ops_tok(char *dir, char *un)
2 7u83 873
{
7 7u83 874
    open_file(dir, un, OPS_SUFFIX);
875
    if (extra_headers) {
876
	output("#include \"%s%s\"\n", MAIN_PREFIX, MAIN_SUFFIX);
877
	output("#include <%s_ops.h>\n\n", MAIN_PREFIX);
2 7u83 878
    }
879
 
7 7u83 880
    comment("Operations for union %UN");
881
    output("%pt PROC(%xr : %UN :) %xr : unsigned : TAG_%UM #\n");
882
    output("%pi TAG_%UM\n\n\n");
2 7u83 883
 
884
    /* Operations on common components */
885
    LOOP_UNION_COMPONENT {
7 7u83 886
	comment("Operations for component %CN of union %UN");
887
	output("%pt PROC(%xr : %UN :)\\\n");
888
	output("    %xr : PTR(%CT) : %UM_%CN #\n");
889
	output("%pi %UM_%CN\n\n");
2 7u83 890
    }
891
 
892
    /* Operations on field components */
893
    LOOP_UNION_FIELD {
7 7u83 894
	int rng = DEREF_int(fld_set(CRT_FIELD));
895
	int hash = DEREF_int(fld_flag(CRT_FIELD));
896
	int al = (hash ? 1 : 0);
897
	if (rng) {
898
	    comment("Operations for field set %FN_etc of union %UN");
899
	    output("%pt %xc : unsigned : %UM_%FN_etc_tag #\n");
900
	    output("%pt PROC(%xr : %UN :) ");
901
	    output("%xr : int : IS_%UM_%FN_etc #\n");
902
	    output("%pi %UM_%FN_etc_tag IS_%UM_%FN_etc\n\n");
903
	    print_field_tok(rng, al);
2 7u83 904
	}
905
 
7 7u83 906
	comment("Operations for field %FN of union %UN");
907
	output("%pt %xc : unsigned : %UM_%FN_tag #\n");
908
	output("%pt PROC(%xr : %UN :) %xr : int : IS_%UM_%FN #\n");
909
	output("%pi %UM_%FN_tag IS_%UM_%FN\n\n");
910
	print_field_tok(0, al);
2 7u83 911
    }
912
 
913
    /* Map tables */
914
    LOOP_UNION_MAP {
7 7u83 915
	int hash = DEREF_int(map_flag(CRT_MAP));
916
	comment("Map %MN on union %UN");
917
	output("%pt PROC(\\\n");
918
	output("\t%xr : %UN :");
919
	if (hash) {
920
		output(",\\\n\t%xr : DESTROYER :");
921
	}
922
	LOOP_MAP_ARGUMENT output(",\\\n\t%xr : %AT :");
923
	output("\\\n    ) %xr : %MR : %MN_%UM #\n ");
924
	output("%pi %MN_%UM\n\n\n");
2 7u83 925
    }
926
 
927
    /* End of file */
7 7u83 928
    close_file();
929
    return;
2 7u83 930
}
931
 
932
 
933
/*
7 7u83 934
 * MAIN ACTION (TOKEN VERSION)
935
 *
936
 * This routine prints all the output files for the calculus (token
937
 * version).
938
 */
2 7u83 939
 
7 7u83 940
void
941
main_action_tok(char *dir)
2 7u83 942
{
7 7u83 943
    int ign = 0;
944
    output_c_code = 2;
945
    print_main_tok(dir);
2 7u83 946
 
947
    LOOP_UNION {
7 7u83 948
	LIST(MAP_P)maps;
949
	CLASS_ID_P cid = DEREF_ptr(un_id(CRT_UNION));
950
	char *un = DEREF_string(cid_name_aux(cid));
951
	print_union_ops_tok(dir, un);
952
	maps = DEREF_list(un_map(CRT_UNION));
953
	if (!IS_NULL_list(maps)) {
954
	    print_union_map_c(dir, un);
955
	    print_union_hdr_c(dir, un);
956
	    ign = 1;
2 7u83 957
        }
958
    }
959
 
7 7u83 960
    if (ign) {
961
	open_file(dir, IGNORE_PREFIX, DEF_SUFFIX);
962
	comment("Map ignore macros");
2 7u83 963
	LOOP_UNION {
7 7u83 964
	    LOOP_UNION_MAP output("#define IGNORE_%MN_%UM%t40%d\n", 1);
2 7u83 965
	}
7 7u83 966
	output("\n");
967
	close_file();
2 7u83 968
    }
969
 
7 7u83 970
    if (extra_asserts) {
971
	open_file(dir, ASSERT_PREFIX, DEF_SUFFIX);
972
	comment("Dummy assertion function definitions");
973
	close_file();
2 7u83 974
    }
7 7u83 975
    return;
2 7u83 976
}