Subversion Repositories tendra.SVN

Rev

Rev 5 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 5 Rev 6
Line -... Line 1...
-
 
1
/*
-
 
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
 */
1
/*
31
/*
2
    		 Crown Copyright (c) 1997
32
    		 Crown Copyright (c) 1997
3
    
33
 
4
    This TenDRA(r) Computer Program is subject to Copyright
34
    This TenDRA(r) Computer Program is subject to Copyright
5
    owned by the United Kingdom Secretary of State for Defence
35
    owned by the United Kingdom Secretary of State for Defence
6
    acting through the Defence Evaluation and Research Agency
36
    acting through the Defence Evaluation and Research Agency
7
    (DERA).  It is made available to Recipients with a
37
    (DERA).  It is made available to Recipients with a
8
    royalty-free licence for its use, reproduction, transfer
38
    royalty-free licence for its use, reproduction, transfer
9
    to other parties and amendment for any purpose not excluding
39
    to other parties and amendment for any purpose not excluding
10
    product development provided that any such use et cetera
40
    product development provided that any such use et cetera
11
    shall be deemed to be acceptance of the following conditions:-
41
    shall be deemed to be acceptance of the following conditions:-
12
    
42
 
13
        (1) Its Recipients shall ensure that this Notice is
43
        (1) Its Recipients shall ensure that this Notice is
14
        reproduced upon any copies or amended versions of it;
44
        reproduced upon any copies or amended versions of it;
15
    
45
 
16
        (2) Any amended version of it shall be clearly marked to
46
        (2) Any amended version of it shall be clearly marked to
17
        show both the nature of and the organisation responsible
47
        show both the nature of and the organisation responsible
18
        for the relevant amendment or amendments;
48
        for the relevant amendment or amendments;
19
    
49
 
20
        (3) Its onward transfer from a recipient to another
50
        (3) Its onward transfer from a recipient to another
21
        party shall be deemed to be that party's acceptance of
51
        party shall be deemed to be that party's acceptance of
22
        these conditions;
52
        these conditions;
23
    
53
 
24
        (4) DERA gives no warranty or assurance as to its
54
        (4) DERA gives no warranty or assurance as to its
25
        quality or suitability for any purpose and DERA accepts
55
        quality or suitability for any purpose and DERA accepts
26
        no liability whatsoever in relation to any use to which
56
        no liability whatsoever in relation to any use to which
27
        it may be put.
57
        it may be put.
28
*/
58
*/
Line 72... Line 102...
72
} DFSClosureT, *DFSClosureP;
102
} DFSClosureT, *DFSClosureP;
73
 
103
 
74
/*--------------------------------------------------------------------------*/
104
/*--------------------------------------------------------------------------*/
75
 
105
 
76
static void
106
static void
77
rule_compute_minimal_dataflow_1 PROTO_N ((rule, alt, all_used))
107
rule_compute_minimal_dataflow_1(RuleP rule, AltP alt, TypeTupleP all_used)
78
				PROTO_T (RuleP      rule X
-
 
79
					 AltP       alt X
-
 
80
					 TypeTupleP all_used)
-
 
81
{
108
{
82
    TypeTupleT used;
109
    TypeTupleT used;
83
 
110
 
84
    types_copy (&used, rule_result (rule));
111
    types_copy(&used, rule_result(rule));
85
    item_compute_minimal_dataflow (alt_item_head (alt), &used);
112
    item_compute_minimal_dataflow(alt_item_head(alt), &used);
86
    types_add_new_names (all_used, &used, NIL (EntryP));
113
    types_add_new_names(all_used, &used, NIL(EntryP));
87
    types_destroy (&used);
114
    types_destroy(&used);
88
}
115
}
89
 
116
 
90
static void
117
static void
91
rule_compute_reverse_list_1 PROTO_N ((alt, entry, type))
118
rule_compute_reverse_list_1(AltP alt, EntryP entry, CycleTypeT type)
92
			    PROTO_T (AltP       alt X
-
 
93
				     EntryP     entry X
-
 
94
				     CycleTypeT type)
-
 
95
{
119
{
96
    ItemP item    = alt_item_head (alt);
120
    ItemP item    = alt_item_head(alt);
97
    ItemP initial = item;
121
    ItemP initial = item;
98
    ItemP next;
122
    ItemP next;
99
 
123
 
100
    while (item) {
124
    while (item) {
101
	next = item_next (item);
125
	next = item_next(item);
102
	if (item_is_rule (item)) {
126
	if (item_is_rule(item)) {
103
	    RuleP item_rule = entry_get_rule (item_entry (item));
127
	    RuleP item_rule = entry_get_rule(item_entry(item));
104
 
128
 
105
	    if (((type == CT_LEFT) && (item == initial)) ||
129
	    if (((type == CT_LEFT) && (item == initial)) ||
106
		((type == CT_TAIL) && (next == NIL (ItemP))) ||
130
		((type == CT_TAIL) && (next == NIL(ItemP))) ||
107
		((type == CT_ALL) && (item_is_inlinable (item)) &&
131
		((type == CT_ALL) && (item_is_inlinable(item)) &&
108
		 (rule_get_call_count (item_rule) <= 1) &&
132
		 (rule_get_call_count(item_rule) <= 1) &&
109
		 (!item_is_tail_call (item))) ||
133
		 (!item_is_tail_call(item))) || (type == CT_MUTATE)) {
110
		(type == CT_MUTATE)) {
-
 
111
		entry_list_add_if_missing (rule_reverse_list (item_rule),
134
		entry_list_add_if_missing(rule_reverse_list(item_rule), entry);
112
					   entry);
-
 
113
	    }
135
	    }
114
	}
136
	}
115
	item = next;
137
	item = next;
116
    }
138
    }
117
}
139
}
118
 
140
 
119
static void
141
static void
120
rule_compute_dfs_1 PROTO_N ((alt, type, list))
142
rule_compute_dfs_1(AltP alt, CycleTypeT type, RuleP *list)
121
		   PROTO_T (AltP       alt X
-
 
122
			    CycleTypeT type X
-
 
123
			    RuleP     *list)
-
 
124
{
143
{
125
    ItemP item    = alt_item_head (alt);
144
    ItemP item    = alt_item_head(alt);
126
    ItemP initial = item;
145
    ItemP initial = item;
127
    ItemP next;
146
    ItemP next;
128
 
147
 
129
    ASSERT (type != CT_MUTATE);
148
    ASSERT(type != CT_MUTATE);
130
    while (item) {
149
    while (item) {
131
	next = item_next (item);
150
	next = item_next(item);
132
	if (item_is_rule (item)) {
151
	if (item_is_rule(item)) {
133
	    RuleP item_rule = entry_get_rule (item_entry (item));
152
	    RuleP item_rule = entry_get_rule(item_entry(item));
134
 
153
 
135
	    if (((type == CT_LEFT) && (item == initial)) ||
154
	    if (((type == CT_LEFT) && (item == initial)) ||
136
		((type == CT_TAIL) && (next == NIL (ItemP))) ||
155
		((type == CT_TAIL) && (next == NIL(ItemP))) ||
137
		((type == CT_ALL) && (item_is_inlinable (item)) &&
156
		((type == CT_ALL) && (item_is_inlinable(item)) &&
138
		 (rule_get_call_count (item_rule) <= 1) &&
157
		(rule_get_call_count(item_rule) <= 1) &&
139
		 (!item_is_tail_call (item)))) {
158
		(!item_is_tail_call(item)))) {
140
		rule_compute_dfs (item_rule, type, list);
159
		rule_compute_dfs(item_rule, type, list);
141
	    }
160
	    }
142
	}
161
	}
143
	item = next;
162
	item = next;
144
    }
163
    }
145
}
164
}
146
 
165
 
147
static void
166
static void
148
rule_compute_reverse_dfs_1 PROTO_N ((entry, gclosure))
167
rule_compute_reverse_dfs_1(EntryP entry, GenericP gclosure)
149
			   PROTO_T (EntryP   entry X
-
 
150
				    GenericP gclosure)
-
 
151
{
168
{
152
    DFSClosureP closure = (DFSClosureP) gclosure;
169
    DFSClosureP closure = (DFSClosureP)gclosure;
153
    RuleP       rule    = entry_get_rule (entry);
170
    RuleP       rule    = entry_get_rule(entry);
154
 
171
 
155
    rule_compute_reverse_dfs (rule, closure->root, closure->list);
172
    rule_compute_reverse_dfs(rule, closure->root, closure->list);
156
}
173
}
157
 
174
 
158
static void
175
static void
159
rule_renumber_1 PROTO_N ((alt, translator, state))
176
rule_renumber_1(AltP alt, TypeNTransP translator, SaveNTransP state)
160
		PROTO_T (AltP        alt X
-
 
161
			 TypeNTransP translator X
-
 
162
			 SaveNTransP state)
-
 
163
{
177
{
164
    ItemP item;
178
    ItemP item;
165
 
179
 
166
    for (item = alt_item_head (alt); item; item = item_next (item)) {
180
    for (item = alt_item_head(alt); item; item = item_next(item)) {
167
	types_renumber (item_param (item), translator);
181
	types_renumber(item_param(item), translator);
168
	types_renumber (item_result (item), translator);
182
	types_renumber(item_result(item), translator);
169
    }
183
    }
170
    ntrans_restore_state (translator, state);
184
    ntrans_restore_state(translator, state);
171
}
185
}
172
 
186
 
173
#ifdef FS_FAST
187
#ifdef FS_FAST
174
#undef rule_get_dfs_state
188
#undef rule_get_dfs_state
175
#endif /* defined (FS_FAST) */
189
#endif /* defined (FS_FAST) */
176
static DFSStateT
190
static DFSStateT
177
rule_get_dfs_state PROTO_N ((rule))
191
rule_get_dfs_state(RuleP rule)
178
		   PROTO_T (RuleP rule)
-
 
179
{
192
{
180
    return (rule->dfs_state);
193
    return(rule->dfs_state);
181
}
194
}
182
#ifdef FS_FAST
195
#ifdef FS_FAST
183
#define rule_get_dfs_state(r) ((r)->dfs_state)
196
#define rule_get_dfs_state(r)	((r)->dfs_state)
184
#endif /* defined (FS_FAST) */
197
#endif /* defined (FS_FAST) */
185
 
198
 
186
#ifdef FS_FAST
199
#ifdef FS_FAST
187
#undef rule_next_in_root_list_ref
200
#undef rule_next_in_root_list_ref
188
#endif /* defined (FS_FAST) */
201
#endif /* defined (FS_FAST) */
189
static RuleP *
202
static RuleP *
190
rule_next_in_root_list_ref PROTO_N ((rule))
203
rule_next_in_root_list_ref(RuleP rule)
191
			   PROTO_T (RuleP rule)
-
 
192
{
204
{
193
    return (&(rule->next_in_root_list));
205
    return(&(rule->next_in_root_list));
194
}
206
}
195
#ifdef FS_FAST
207
#ifdef FS_FAST
196
#define rule_next_in_root_list_ref(r) (&((r)->next_in_root_list))
208
#define rule_next_in_root_list_ref(r)	(&((r)->next_in_root_list))
197
#endif /* defined (FS_FAST) */
209
#endif /* defined (FS_FAST) */
198
 
210
 
199
#ifdef FS_FAST
211
#ifdef FS_FAST
200
#undef rule_set_next_in_dfs
212
#undef rule_set_next_in_dfs
201
#endif /* defined (FS_FAST) */
213
#endif /* defined (FS_FAST) */
202
static void
214
static void
203
rule_set_next_in_dfs PROTO_N ((rule1, rule2))
215
rule_set_next_in_dfs(RuleP rule1, RuleP rule2)
204
		     PROTO_T (RuleP rule1 X
-
 
205
			      RuleP rule2)
-
 
206
{
216
{
207
    rule1->next_in_dfs = rule2;
217
    rule1->next_in_dfs = rule2;
208
}
218
}
209
#ifdef FS_FAST
219
#ifdef FS_FAST
210
#define rule_set_next_in_dfs(r1, r2) ((r1)->next_in_dfs = (r2))
220
#define rule_set_next_in_dfs(r1, r2)	((r1)->next_in_dfs = (r2))
211
#endif /* defined (FS_FAST) */
221
#endif /* defined (FS_FAST) */
212
 
222
 
213
#ifdef FS_FAST
223
#ifdef FS_FAST
214
#undef rule_set_next_in_reverse_dfs
224
#undef rule_set_next_in_reverse_dfs
215
#endif /* defined (FS_FAST) */
225
#endif /* defined (FS_FAST) */
216
static void
226
static void
217
rule_set_next_in_reverse_dfs PROTO_N ((rule1, rule2))
227
rule_set_next_in_reverse_dfs(RuleP rule1,				      RuleP rule2)
218
			     PROTO_T (RuleP rule1 X
-
 
219
				      RuleP rule2)
-
 
220
{
228
{
221
    rule1->next_in_reverse_dfs = rule2;
229
    rule1->next_in_reverse_dfs = rule2;
222
}
230
}
223
#ifdef FS_FAST
231
#ifdef FS_FAST
224
#define rule_set_next_in_reverse_dfs(r1, r2) ((r1)->next_in_reverse_dfs = (r2))
232
#define rule_set_next_in_reverse_dfs(r1, r2) \
-
 
233
	((r1)->next_in_reverse_dfs = (r2))
225
#endif /* defined (FS_FAST) */
234
#endif /* defined (FS_FAST) */
226
 
235
 
227
/*--------------------------------------------------------------------------*/
236
/*--------------------------------------------------------------------------*/
228
 
237
 
229
RuleP
238
RuleP
230
rule_create PROTO_N ((entry))
239
rule_create(EntryP entry)
231
	    PROTO_T (EntryP entry)
-
 
232
{
240
{
233
    RuleP rule = ALLOCATE (RuleT);
241
    RuleP rule = ALLOCATE(RuleT);
234
 
242
 
235
    rule->entry                 = entry;
243
    rule->entry                 = entry;
236
    types_init (rule_param (rule));
244
    types_init(rule_param(rule));
237
    types_init (rule_result (rule));
245
    types_init(rule_result(rule));
238
    non_local_list_init (rule_non_locals (rule));
246
    non_local_list_init(rule_non_locals(rule));
239
    nstring_init (rule_maximum_scope (rule));
247
    nstring_init(rule_maximum_scope(rule));
240
    rule->defined               = FALSE;
248
    rule->defined               = FALSE;
241
    rule->has_empty_alt         = FALSE;
249
    rule->has_empty_alt         = FALSE;
242
    rule->required              = FALSE;
250
    rule->required              = FALSE;
243
    entry_list_init (rule_reverse_list (rule));
251
    entry_list_init(rule_reverse_list(rule));
244
    rule->dfs_state             = DFS_UNTRACED;
252
    rule->dfs_state             = DFS_UNTRACED;
245
    rule->next_in_reverse_dfs   = NIL (RuleP);
253
    rule->next_in_reverse_dfs   = NIL(RuleP);
246
    rule->no_cycles             = FALSE;
254
    rule->no_cycles             = FALSE;
247
    rule->computed_first_set    = FALSE;
255
    rule->computed_first_set    = FALSE;
248
    rule->computing_first_set   = FALSE;
256
    rule->computing_first_set   = FALSE;
249
    bitvec_init (rule_first_set (rule));
257
    bitvec_init(rule_first_set(rule));
250
    entry_list_init (rule_predicate_first (rule));
258
    entry_list_init(rule_predicate_first(rule));
251
    rule->see_through           = FALSE;
259
    rule->see_through           = FALSE;
252
    rule->priority              = 0;
260
    rule->priority              = 0;
253
    rule->factored              = FALSE;
261
    rule->factored              = FALSE;
254
    rule->tail_group		= NIL (RuleP);
262
    rule->tail_group		= NIL(RuleP);
255
    rule->being_inlined		= FALSE;
263
    rule->being_inlined		= FALSE;
256
    rule->checked_for_inlining	= FALSE;
264
    rule->checked_for_inlining	= FALSE;
257
    entry_list_init (rule_call_list (rule));
265
    entry_list_init(rule_call_list(rule));
258
    bitvec_init (rule_follow_set (rule));
266
    bitvec_init(rule_follow_set(rule));
259
    entry_list_init (rule_predicate_follow (rule));
267
    entry_list_init(rule_predicate_follow(rule));
260
    rule->see_through_alt       = NIL (AltP);
268
    rule->see_through_alt       = NIL(AltP);
261
    rule->needs_function	= FALSE;
269
    rule->needs_function	= FALSE;
262
    rule->all_basics            = FALSE;
270
    rule->all_basics            = FALSE;
263
    rule->being_output		= FALSE;
271
    rule->being_output		= FALSE;
264
    rule->handler		= NIL (AltP);
272
    rule->handler		= NIL(AltP);
265
    rule->alt_head              = NIL (AltP);
273
    rule->alt_head              = NIL(AltP);
266
    rule->alt_tail              = &(rule->alt_head);
274
    rule->alt_tail              = &(rule->alt_head);
267
    return (rule);
275
    return(rule);
268
}
276
}
269
 
277
 
270
void
278
void
271
rule_reinit PROTO_N ((rule))
279
rule_reinit(RuleP rule)
272
	    PROTO_T (RuleP rule)
-
 
273
{
280
{
274
    rule->has_empty_alt         = FALSE;
281
    rule->has_empty_alt         = FALSE;
275
    rule->alt_head              = NIL (AltP);
282
    rule->alt_head              = NIL(AltP);
276
    rule->alt_tail              = &(rule->alt_head);
283
    rule->alt_tail              = &(rule->alt_head);
277
}
284
}
278
 
285
 
279
#ifdef FS_FAST
286
#ifdef FS_FAST
280
#undef rule_table_entry
287
#undef rule_table_entry
281
#endif /* defined (FS_FAST) */
288
#endif /* defined (FS_FAST) */
282
EntryP
289
EntryP
283
rule_entry PROTO_N ((rule))
290
rule_entry(RuleP rule)
284
	   PROTO_T (RuleP rule)
-
 
285
{
291
{
286
    return (rule->entry);
292
    return(rule->entry);
287
}
293
}
288
#ifdef FS_FAST
294
#ifdef FS_FAST
289
#define rule_entry(r) ((r)->entry)
295
#define rule_entry(r)	((r)->entry)
290
#endif /* defined (FS_FAST) */
296
#endif /* defined (FS_FAST) */
291
 
297
 
292
#ifdef FS_FAST
298
#ifdef FS_FAST
293
#undef rule_param
299
#undef rule_param
294
#endif /* defined (FS_FAST) */
300
#endif /* defined (FS_FAST) */
295
TypeTupleP
301
TypeTupleP
296
rule_param PROTO_N ((rule))
302
rule_param(RuleP rule)
297
	   PROTO_T (RuleP rule)
-
 
298
{
303
{
299
    return (&(rule->param));
304
    return(&(rule->param));
300
}
305
}
301
#ifdef FS_FAST
306
#ifdef FS_FAST
302
#define rule_param(r) (&((r)->param))
307
#define rule_param(r)	(&((r)->param))
303
#endif /* defined (FS_FAST) */
308
#endif /* defined (FS_FAST) */
304
 
309
 
305
#ifdef FS_FAST
310
#ifdef FS_FAST
306
#undef rule_result
311
#undef rule_result
307
#endif /* defined (FS_FAST) */
312
#endif /* defined (FS_FAST) */
308
TypeTupleP
313
TypeTupleP
309
rule_result PROTO_N ((rule))
314
rule_result(RuleP rule)
310
	    PROTO_T (RuleP rule)
-
 
311
{
315
{
312
    return (&(rule->result));
316
    return(&(rule->result));
313
}
317
}
314
#ifdef FS_FAST
318
#ifdef FS_FAST
315
#define rule_result(r) (&((r)->result))
319
#define rule_result(r)	(&((r)->result))
316
#endif /* defined (FS_FAST) */
320
#endif /* defined (FS_FAST) */
317
 
321
 
318
#ifdef FS_FAST
322
#ifdef FS_FAST
319
#undef rule_non_locals
323
#undef rule_non_locals
320
#endif /* defined (FS_FAST) */
324
#endif /* defined (FS_FAST) */
321
NonLocalListP
325
NonLocalListP
322
rule_non_locals PROTO_N ((rule))
326
rule_non_locals(RuleP rule)
323
		PROTO_T (RuleP rule)
-
 
324
{
327
{
325
    return (&(rule->non_locals));
328
    return(&(rule->non_locals));
326
}
329
}
327
#ifdef FS_FAST
330
#ifdef FS_FAST
328
#define rule_non_locals(r) (&((r)->non_locals))
331
#define rule_non_locals(r)	(&((r)->non_locals))
329
#endif /* defined (FS_FAST) */
332
#endif /* defined (FS_FAST) */
330
 
333
 
331
#ifdef FS_FAST
334
#ifdef FS_FAST
332
#undef rule_maximum_scope
335
#undef rule_maximum_scope
333
#endif /* defined (FS_FAST) */
336
#endif /* defined (FS_FAST) */
334
NStringP
337
NStringP
335
rule_maximum_scope PROTO_N ((rule))
338
rule_maximum_scope(RuleP rule)
336
		   PROTO_T (RuleP rule)
-
 
337
{
339
{
338
    return (&(rule->maximum_scope));
340
    return(&(rule->maximum_scope));
339
}
341
}
340
#ifdef FS_FAST
342
#ifdef FS_FAST
341
#define rule_maximum_scope(r) (&((r)->maximum_scope))
343
#define rule_maximum_scope(r)	(&((r)->maximum_scope))
342
#endif /* defined (FS_FAST) */
344
#endif /* defined (FS_FAST) */
343
 
345
 
344
#ifdef FS_FAST
346
#ifdef FS_FAST
345
#undef rule_is_defined
347
#undef rule_is_defined
346
#endif /* defined (FS_FAST) */
348
#endif /* defined (FS_FAST) */
347
BoolT
349
BoolT
348
rule_is_defined PROTO_N ((rule))
350
rule_is_defined(RuleP rule)
349
		PROTO_T (RuleP rule)
-
 
350
{
351
{
351
    return (rule->defined);
352
    return(rule->defined);
352
}
353
}
353
#ifdef FS_FAST
354
#ifdef FS_FAST
354
#define rule_is_defined(r) ((r)->defined)
355
#define rule_is_defined(r)	((r)->defined)
355
#endif /* defined (FS_FAST) */
356
#endif /* defined (FS_FAST) */
356
 
357
 
357
#ifdef FS_FAST
358
#ifdef FS_FAST
358
#undef rule_defined
359
#undef rule_defined
359
#endif /* defined (FS_FAST) */
360
#endif /* defined (FS_FAST) */
360
void
361
void
361
rule_defined PROTO_N ((rule))
362
rule_defined(RuleP rule)
362
	     PROTO_T (RuleP rule)
-
 
363
{
363
{
364
    rule->defined = TRUE;
364
    rule->defined = TRUE;
365
}
365
}
366
#ifdef FS_FAST
366
#ifdef FS_FAST
367
#define rule_defined(r) ((r)->defined = TRUE)
367
#define rule_defined(r)	((r)->defined = TRUE)
368
#endif /* defined (FS_FAST) */
368
#endif /* defined (FS_FAST) */
369
 
369
 
370
#ifdef FS_FAST
370
#ifdef FS_FAST
371
#undef rule_is_required
371
#undef rule_is_required
372
#endif /* defined (FS_FAST) */
372
#endif /* defined (FS_FAST) */
373
BoolT
373
BoolT
374
rule_is_required PROTO_N ((rule))
374
rule_is_required(RuleP rule)
375
		 PROTO_T (RuleP rule)
-
 
376
{
375
{
377
    return (rule->required);
376
    return(rule->required);
378
}
377
}
379
#ifdef FS_FAST
378
#ifdef FS_FAST
380
#define rule_is_required(r) ((r)->required)
379
#define rule_is_required(r)	((r)->required)
381
#endif /* defined (FS_FAST) */
380
#endif /* defined (FS_FAST) */
382
 
381
 
383
#ifdef FS_FAST
382
#ifdef FS_FAST
384
#undef rule_required
383
#undef rule_required
385
#endif /* defined (FS_FAST) */
384
#endif /* defined (FS_FAST) */
386
void
385
void
387
rule_required PROTO_N ((rule))
386
rule_required(RuleP rule)
388
	      PROTO_T (RuleP rule)
-
 
389
{
387
{
390
    rule->required = TRUE;
388
    rule->required = TRUE;
391
}
389
}
392
#ifdef FS_FAST
390
#ifdef FS_FAST
393
#define rule_required(r) ((r)->required = TRUE)
391
#define rule_required(r)	((r)->required = TRUE)
394
#endif /* defined (FS_FAST) */
392
#endif /* defined (FS_FAST) */
395
 
393
 
396
void
394
void
397
rule_add_alt PROTO_N ((rule, alt))
395
rule_add_alt(RuleP rule, AltP alt)
398
	     PROTO_T (RuleP rule X
-
 
399
		      AltP  alt)
-
 
400
{
396
{
401
    *(rule->alt_tail) = alt;
397
    *(rule->alt_tail) = alt;
402
    rule->alt_tail    = alt_next_ref (alt);
398
    rule->alt_tail    = alt_next_ref(alt);
403
}
399
}
404
 
400
 
405
#ifdef FS_FAST
401
#ifdef FS_FAST
406
#undef rule_has_empty_alt
402
#undef rule_has_empty_alt
407
#endif /* defined (FS_FAST) */
403
#endif /* defined (FS_FAST) */
408
BoolT
404
BoolT
409
rule_has_empty_alt PROTO_N ((rule))
405
rule_has_empty_alt(RuleP rule)
410
		   PROTO_T (RuleP rule)
-
 
411
{
406
{
412
    return (rule->has_empty_alt);
407
    return(rule->has_empty_alt);
413
}
408
}
414
#ifdef FS_FAST
409
#ifdef FS_FAST
415
#define rule_has_empty_alt(r) ((r)->has_empty_alt)
410
#define rule_has_empty_alt(r)	((r)->has_empty_alt)
416
#endif /* defined (FS_FAST) */
411
#endif /* defined (FS_FAST) */
417
 
412
 
418
#ifdef FS_FAST
413
#ifdef FS_FAST
419
#undef rule_add_empty_alt
414
#undef rule_add_empty_alt
420
#endif /* defined (FS_FAST) */
415
#endif /* defined (FS_FAST) */
421
void
416
void
422
rule_add_empty_alt PROTO_N ((rule))
417
rule_add_empty_alt(RuleP rule)
423
		   PROTO_T (RuleP rule)
-
 
424
{
418
{
425
    rule->has_empty_alt = TRUE;
419
    rule->has_empty_alt = TRUE;
426
}
420
}
427
#ifdef FS_FAST
421
#ifdef FS_FAST
428
#define rule_add_empty_alt(r) ((r)->has_empty_alt = TRUE)
422
#define rule_add_empty_alt(r)	((r)->has_empty_alt = TRUE)
429
#endif /* defined (FS_FAST) */
423
#endif /* defined (FS_FAST) */
430
 
424
 
431
BoolT
425
BoolT
432
rule_has_one_alt PROTO_N ((rule))
426
rule_has_one_alt(RuleP rule)
433
		 PROTO_T (RuleP rule)
-
 
434
{
427
{
435
    return (((rule_has_empty_alt (rule)) && (rule->alt_head == NIL (AltP))) ||
428
    return(((rule_has_empty_alt(rule)) && (rule->alt_head == NIL(AltP))) ||
436
	    ((!rule_has_empty_alt (rule)) && (rule->alt_head) &&
429
	   ((!rule_has_empty_alt(rule)) && (rule->alt_head) &&
437
	     (alt_next (rule->alt_head) == NIL (AltP))));
430
	    (alt_next(rule->alt_head) == NIL(AltP))));
438
}
431
}
439
 
432
 
440
void
433
void
441
rule_compute_result_intersect PROTO_N ((rule))
434
rule_compute_result_intersect(RuleP rule)
442
			      PROTO_T (RuleP rule)
-
 
443
{
435
{
444
    TypeTupleP result = rule_result (rule);
436
    TypeTupleP result = rule_result(rule);
445
    BoolT      inited = FALSE;
437
    BoolT      inited = FALSE;
446
    AltP       alt;
438
    AltP       alt;
447
 
439
 
448
    if (rule_has_empty_alt (rule)) {
440
    if (rule_has_empty_alt(rule)) {
449
	types_init (result);
441
	types_init(result);
450
    } else {
442
    } else {
451
	if ((alt = rule_get_handler (rule)) != NIL (AltP)) {
443
	if ((alt = rule_get_handler(rule)) != NIL(AltP)) {
452
	    types_copy (result, alt_names (alt));
444
	    types_copy(result, alt_names(alt));
453
	    inited = TRUE;
445
	    inited = TRUE;
454
	}
446
	}
455
	for (alt = rule_alt_head (rule); alt; alt = alt_next (alt)) {
447
	for (alt = rule_alt_head(rule); alt; alt = alt_next(alt)) {
456
	    if (inited) {
448
	    if (inited) {
457
		types_inplace_intersection (result, alt_names (alt));
449
		types_inplace_intersection(result, alt_names(alt));
458
	    } else {
450
	    } else {
459
		types_copy (result, alt_names (alt));
451
		types_copy(result, alt_names(alt));
460
		inited = TRUE;
452
		inited = TRUE;
461
	    }
453
	    }
462
	}
454
	}
463
	types_unlink_used (result, rule_param (rule));
455
	types_unlink_used(result, rule_param(rule));
464
    }
456
    }
465
}
457
}
466
 
458
 
467
void
459
void
468
rule_compute_minimal_dataflow PROTO_N ((rule, param))
460
rule_compute_minimal_dataflow(RuleP rule, TypeTupleP param)
469
			      PROTO_T (RuleP      rule X
-
 
470
				       TypeTupleP param)
-
 
471
{
461
{
472
    TypeTupleT all_used;
462
    TypeTupleT all_used;
473
    AltP       alt;
463
    AltP       alt;
474
 
464
 
475
    types_init (&all_used);
465
    types_init(&all_used);
476
    if ((alt = rule_get_handler (rule)) != NIL (AltP)) {
466
    if ((alt = rule_get_handler(rule)) != NIL(AltP)) {
477
	rule_compute_minimal_dataflow_1 (rule, alt, &all_used);
467
	rule_compute_minimal_dataflow_1(rule, alt, &all_used);
478
    }
468
    }
479
    for (alt = rule_alt_head (rule); alt; alt = alt_next (alt)) {
469
    for (alt = rule_alt_head(rule); alt; alt = alt_next(alt)) {
480
	rule_compute_minimal_dataflow_1 (rule, alt, &all_used);
470
	rule_compute_minimal_dataflow_1(rule, alt, &all_used);
481
    }
471
    }
482
    types_inplace_intersection (rule_param (rule), &all_used);
472
    types_inplace_intersection(rule_param(rule), &all_used);
483
    types_inplace_intersection (param, &all_used);
473
    types_inplace_intersection(param, &all_used);
484
    types_destroy (&all_used);
474
    types_destroy(&all_used);
485
}
475
}
486
 
476
 
487
void
477
void
488
rule_compute_reverse_list PROTO_N ((rule, type))
478
rule_compute_reverse_list(RuleP rule, CycleTypeT type)
489
			  PROTO_T (RuleP      rule X
-
 
490
				   CycleTypeT type)
-
 
491
{
479
{
492
    EntryP entry = rule_entry (rule);
480
    EntryP entry = rule_entry(rule);
493
    AltP   alt;
481
    AltP   alt;
494
 
482
 
495
    if ((type != CT_LEFT) && (alt = rule_get_handler (rule))) {
483
    if ((type != CT_LEFT) && (alt = rule_get_handler(rule))) {
496
	rule_compute_reverse_list_1 (alt, entry, type);
484
	rule_compute_reverse_list_1(alt, entry, type);
497
    }
485
    }
498
    for (alt = rule_alt_head (rule); alt; alt = alt_next (alt)) {
486
    for (alt = rule_alt_head(rule); alt; alt = alt_next(alt)) {
499
	rule_compute_reverse_list_1 (alt, entry, type);
487
	rule_compute_reverse_list_1(alt, entry, type);
500
    }
488
    }
501
}
489
}
502
 
490
 
503
void
491
void
504
rule_reinit_reverse_list PROTO_N ((rule))
492
rule_reinit_reverse_list(RuleP rule)
505
			 PROTO_T (RuleP rule)
-
 
506
{
493
{
507
    entry_list_destroy (rule_reverse_list (rule));
494
    entry_list_destroy(rule_reverse_list(rule));
508
    entry_list_init (rule_reverse_list (rule));
495
    entry_list_init(rule_reverse_list(rule));
509
    rule_set_dfs_state (rule, DFS_UNTRACED);
496
    rule_set_dfs_state(rule, DFS_UNTRACED);
510
    rule->next_in_reverse_dfs = NIL (RuleP);
497
    rule->next_in_reverse_dfs = NIL(RuleP);
511
    rule->no_cycles           = FALSE;
498
    rule->no_cycles           = FALSE;
512
}
499
}
513
 
500
 
514
#ifdef FS_FAST
501
#ifdef FS_FAST
515
#undef rule_reverse_list
502
#undef rule_reverse_list
516
#endif /* defined (FS_FAST) */
503
#endif /* defined (FS_FAST) */
517
EntryListP
504
EntryListP
518
rule_reverse_list PROTO_N ((rule))
505
rule_reverse_list(RuleP rule)
519
		  PROTO_T (RuleP rule)
-
 
520
{
506
{
521
    return (&(rule->reverse_list));
507
    return(&(rule->reverse_list));
522
}
508
}
523
#ifdef FS_FAST
509
#ifdef FS_FAST
524
#define rule_reverse_list(r) ((r)->reverse_list)
510
#define rule_reverse_list(r)	((r)->reverse_list)
525
#endif /* defined (FS_FAST) */
511
#endif /* defined (FS_FAST) */
526
 
512
 
527
#ifdef FS_FAST
513
#ifdef FS_FAST
528
#undef rule_set_dfs_state
514
#undef rule_set_dfs_state
529
#endif /* defined (FS_FAST) */
515
#endif /* defined (FS_FAST) */
530
void
516
void
531
rule_set_dfs_state PROTO_N ((rule, state))
517
rule_set_dfs_state(RuleP rule, DFSStateT state)
532
		   PROTO_T (RuleP     rule X
-
 
533
			    DFSStateT state)
-
 
534
{
518
{
535
    rule->dfs_state = state;
519
    rule->dfs_state = state;
536
}
520
}
537
#ifdef FS_FAST
521
#ifdef FS_FAST
538
#define rule_set_dfs_state(r, s) ((r)->dfs_state = (s))
522
#define rule_set_dfs_state(r, s)	((r)->dfs_state = (s))
539
#endif /* defined (FS_FAST) */
523
#endif /* defined (FS_FAST) */
540
 
524
 
541
#ifdef FS_FAST
525
#ifdef FS_FAST
542
#undef rule_next_in_root_list
526
#undef rule_next_in_root_list
543
#endif /* defined (FS_FAST) */
527
#endif /* defined (FS_FAST) */
544
RuleP
528
RuleP
545
rule_next_in_root_list PROTO_N ((rule))
529
rule_next_in_root_list(RuleP rule)
546
		       PROTO_T (RuleP rule)
-
 
547
{
530
{
548
    return (rule->next_in_root_list);
531
    return(rule->next_in_root_list);
549
}
532
}
550
#ifdef FS_FAST
533
#ifdef FS_FAST
551
#define rule_next_in_root_list(r) ((r)->next_in_root_list)
534
#define rule_next_in_root_list(r)	((r)->next_in_root_list)
552
#endif /* defined (FS_FAST) */
535
#endif /* defined (FS_FAST) */
553
 
536
 
554
void
537
void
555
rule_build_root_list PROTO_N ((entry, gclosure))
538
rule_build_root_list(EntryP entry, GenericP gclosure)
556
		     PROTO_T (EntryP   entry X
-
 
557
			      GenericP gclosure)
-
 
558
{
539
{
559
    if (entry_is_rule (entry)) {
540
    if (entry_is_rule(entry)) {
560
	RuleListP list = (RuleListP) gclosure;
541
	RuleListP list = (RuleListP)gclosure;
561
	RuleP     rule = entry_get_rule (entry);
542
	RuleP     rule = entry_get_rule(entry);
562
 
543
 
563
	rule_list_append (list, rule, rule_next_in_root_list_ref (rule));
544
	rule_list_append(list, rule, rule_next_in_root_list_ref(rule));
564
    }
545
    }
565
}
546
}
566
 
547
 
567
#ifdef FS_FAST
548
#ifdef FS_FAST
568
#undef rule_get_next_in_dfs
549
#undef rule_get_next_in_dfs
569
#endif /* defined (FS_FAST) */
550
#endif /* defined (FS_FAST) */
570
RuleP
551
RuleP
571
rule_get_next_in_dfs PROTO_N ((rule))
552
rule_get_next_in_dfs(RuleP rule)
572
		     PROTO_T (RuleP rule)
-
 
573
{
553
{
574
    return (rule->next_in_dfs);
554
    return(rule->next_in_dfs);
575
}
555
}
576
#ifdef FS_FAST
556
#ifdef FS_FAST
577
#define rule_get_next_in_dfs(r) ((r)->next_in_dfs)
557
#define rule_get_next_in_dfs(r)	((r)->next_in_dfs)
578
#endif /* defined (FS_FAST) */
558
#endif /* defined (FS_FAST) */
579
 
559
 
580
void
560
void
581
rule_compute_dfs PROTO_N ((rule, type, list))
561
rule_compute_dfs(RuleP rule, CycleTypeT type, RuleP *list)
582
		 PROTO_T (RuleP      rule X
-
 
583
			  CycleTypeT type X
-
 
584
			  RuleP     *list)
-
 
585
{
562
{
586
    AltP      alt;
563
    AltP      alt;
587
 
564
 
588
    switch (rule_get_dfs_state (rule)) EXHAUSTIVE {
565
    switch (rule_get_dfs_state(rule))EXHAUSTIVE {
589
      case DFS_UNTRACED:
566
      case DFS_UNTRACED:
590
	rule_set_dfs_state (rule, DFS_TRACING);
567
	rule_set_dfs_state(rule, DFS_TRACING);
591
	if ((type != CT_LEFT) && (alt = rule_get_handler (rule))) {
568
	if ((type != CT_LEFT) && (alt = rule_get_handler(rule))) {
592
	    rule_compute_dfs_1 (alt, type, list);
569
	    rule_compute_dfs_1(alt, type, list);
593
	}
570
	}
594
	for (alt = rule_alt_head (rule); alt; alt = alt_next (alt)) {
571
	for (alt = rule_alt_head(rule); alt; alt = alt_next(alt)) {
595
	    rule_compute_dfs_1 (alt, type, list);
572
	    rule_compute_dfs_1(alt, type, list);
596
	}
573
	}
597
	rule_set_dfs_state (rule, DFS_TRACED);
574
	rule_set_dfs_state(rule, DFS_TRACED);
598
	rule_set_next_in_dfs (rule, *list);
575
	rule_set_next_in_dfs(rule, *list);
599
	*list = rule;
576
	*list = rule;
600
	break;
577
	break;
601
      case DFS_TRACING:
578
      case DFS_TRACING:
602
      case DFS_TRACED:
579
      case DFS_TRACED:
603
	break;
580
	break;
Line 608... Line 585...
608
 
585
 
609
#ifdef FS_FAST
586
#ifdef FS_FAST
610
#undef rule_get_next_in_reverse_dfs
587
#undef rule_get_next_in_reverse_dfs
611
#endif /* defined (FS_FAST) */
588
#endif /* defined (FS_FAST) */
612
RuleP
589
RuleP
613
rule_get_next_in_reverse_dfs PROTO_N ((rule))
590
rule_get_next_in_reverse_dfs(RuleP rule)
614
			     PROTO_T (RuleP rule)
-
 
615
{
591
{
616
    return (rule->next_in_reverse_dfs);
592
    return(rule->next_in_reverse_dfs);
617
}
593
}
618
#ifdef FS_FAST
594
#ifdef FS_FAST
619
#define rule_get_next_in_reverse_dfs(r) ((r)->next_in_reverse_dfs)
595
#define rule_get_next_in_reverse_dfs(r)	((r)->next_in_reverse_dfs)
620
#endif /* defined (FS_FAST) */
596
#endif /* defined (FS_FAST) */
621
 
597
 
622
#ifdef FS_FAST
598
#ifdef FS_FAST
623
#undef rule_next_in_reverse_dfs_ref
599
#undef rule_next_in_reverse_dfs_ref
624
#endif /* defined (FS_FAST) */
600
#endif /* defined (FS_FAST) */
625
RuleP *
601
RuleP *
626
rule_next_in_reverse_dfs_ref PROTO_N ((rule))
602
rule_next_in_reverse_dfs_ref(RuleP rule)
627
			     PROTO_T (RuleP rule)
-
 
628
{
603
{
629
    return (&(rule->next_in_reverse_dfs));
604
    return(&(rule->next_in_reverse_dfs));
630
}
605
}
631
#ifdef FS_FAST
606
#ifdef FS_FAST
632
#define rule_next_in_reverse_dfs_ref(r) (&((r)->next_in_reverse_dfs))
607
#define rule_next_in_reverse_dfs_ref(r)	(&((r)->next_in_reverse_dfs))
633
#endif /* defined (FS_FAST) */
608
#endif /* defined (FS_FAST) */
634
 
609
 
635
void
610
void
636
rule_compute_reverse_dfs PROTO_N ((rule, root, list))
611
rule_compute_reverse_dfs(RuleP rule, RuleP root, RuleP *list)
637
			 PROTO_T (RuleP  rule X
-
 
638
				  RuleP  root X
-
 
639
				  RuleP *list)
-
 
640
{
612
{
641
    DFSClosureT closure;
613
    DFSClosureT closure;
642
 
614
 
643
    switch (rule_get_dfs_state (rule)) EXHAUSTIVE {
615
    switch (rule_get_dfs_state(rule))EXHAUSTIVE {
644
      case DFS_UNTRACED:
616
      case DFS_UNTRACED:
645
	closure.root = root;
617
	closure.root = root;
646
	closure.list = list;
618
	closure.list = list;
647
	rule_set_dfs_state (rule, DFS_TRACING);
619
	rule_set_dfs_state(rule, DFS_TRACING);
648
	entry_list_iter (rule_reverse_list (rule),
620
	entry_list_iter(rule_reverse_list(rule), rule_compute_reverse_dfs_1,
649
			 rule_compute_reverse_dfs_1, (GenericP) &closure);
621
			(GenericP)&closure);
650
	if (((rule == root) && (rule_get_dfs_state (rule) == DFS_CYCLING)) ||
622
	if (((rule == root) && (rule_get_dfs_state(rule) == DFS_CYCLING)) ||
651
	    (rule != root)) {
623
	    (rule != root)) {
652
	    rule_set_next_in_reverse_dfs (rule, *list);
624
	    rule_set_next_in_reverse_dfs(rule, *list);
653
	    *list = rule;
625
	    *list = rule;
654
	}
626
	}
655
	rule_set_dfs_state (rule, DFS_TRACED);
627
	rule_set_dfs_state(rule, DFS_TRACED);
656
	break;
628
	break;
657
      case DFS_CYCLING:
629
      case DFS_CYCLING:
658
      case DFS_TRACED:
630
      case DFS_TRACED:
659
	break;
631
	break;
660
      case DFS_TRACING:
632
      case DFS_TRACING:
661
	rule_set_dfs_state (rule, DFS_CYCLING);
633
	rule_set_dfs_state(rule, DFS_CYCLING);
662
	break;
634
	break;
663
    }
635
    }
664
}
636
}
665
 
637
 
666
#ifdef FS_FAST
638
#ifdef FS_FAST
667
#undef rule_has_no_cycles
639
#undef rule_has_no_cycles
668
#endif /* defined (FS_FAST) */
640
#endif /* defined (FS_FAST) */
669
BoolT
641
BoolT
670
rule_has_no_cycles PROTO_N ((rule))
642
rule_has_no_cycles(RuleP rule)
671
		   PROTO_T (RuleP rule)
-
 
672
{
643
{
673
    return (rule->no_cycles);
644
    return(rule->no_cycles);
674
}
645
}
675
#ifdef FS_FAST
646
#ifdef FS_FAST
676
#define rule_has_no_cycles(r) ((r)->no_cycles)
647
#define rule_has_no_cycles(r)	((r)->no_cycles)
677
#endif /* defined (FS_FAST) */
648
#endif /* defined (FS_FAST) */
678
 
649
 
679
#ifdef FS_FAST
650
#ifdef FS_FAST
680
#undef rule_no_cycles
651
#undef rule_no_cycles
681
#endif /* defined (FS_FAST) */
652
#endif /* defined (FS_FAST) */
682
void
653
void
683
rule_no_cycles PROTO_N ((rule))
654
rule_no_cycles(RuleP rule)
684
	       PROTO_T (RuleP rule)
-
 
685
{
655
{
686
    rule->no_cycles = TRUE;
656
    rule->no_cycles = TRUE;
687
}
657
}
688
#ifdef FS_FAST
658
#ifdef FS_FAST
689
#define rule_no_cycles(r) ((r)->no_cycles = TRUE)
659
#define rule_no_cycles(r)	((r)->no_cycles = TRUE)
690
#endif /* defined (FS_FAST) */
660
#endif /* defined (FS_FAST) */
691
 
661
 
692
#ifdef FS_FAST
662
#ifdef FS_FAST
693
#undef rule_get_cycle_index
663
#undef rule_get_cycle_index
694
#endif /* defined (FS_FAST) */
664
#endif /* defined (FS_FAST) */
695
unsigned
665
unsigned
696
rule_get_cycle_index PROTO_N ((rule))
666
rule_get_cycle_index(RuleP rule)
697
		     PROTO_T (RuleP rule)
-
 
698
{
667
{
699
    return (rule->cycle_index);
668
    return(rule->cycle_index);
700
}
669
}
701
#ifdef FS_FAST
670
#ifdef FS_FAST
702
#define rule_get_cycle_index(r) ((r)->cycle_index)
671
#define rule_get_cycle_index(r)	((r)->cycle_index)
703
#endif /* defined (FS_FAST) */
672
#endif /* defined (FS_FAST) */
704
 
673
 
705
#ifdef FS_FAST
674
#ifdef FS_FAST
706
#undef rule_set_cycle_index
675
#undef rule_set_cycle_index
707
#endif /* defined (FS_FAST) */
676
#endif /* defined (FS_FAST) */
708
void
677
void
709
rule_set_cycle_index PROTO_N ((rule, cycle_index))
678
rule_set_cycle_index(RuleP rule, unsigned cycle_index)
710
		     PROTO_T (RuleP    rule X
-
 
711
			      unsigned cycle_index)
-
 
712
{
679
{
713
    rule->cycle_index = cycle_index;
680
    rule->cycle_index = cycle_index;
714
}
681
}
715
#ifdef FS_FAST
682
#ifdef FS_FAST
716
#define rule_set_cycle_index(r, i) ((r)->cycle_index = (i))
683
#define rule_set_cycle_index(r, i)	((r)->cycle_index = (i))
717
#endif /* defined (FS_FAST) */
684
#endif /* defined (FS_FAST) */
718
 
685
 
719
#ifdef FS_FAST
686
#ifdef FS_FAST
720
#undef rule_reset_cycle_index
687
#undef rule_reset_cycle_index
721
#endif /* defined (FS_FAST) */
688
#endif /* defined (FS_FAST) */
722
void
689
void
723
rule_reset_cycle_index PROTO_N ((rule))
690
rule_reset_cycle_index(RuleP rule)
724
		       PROTO_T (RuleP rule)
-
 
725
{
691
{
726
    rule->cycle_index = 0;
692
    rule->cycle_index = 0;
727
}
693
}
728
#ifdef FS_FAST
694
#ifdef FS_FAST
729
#define rule_reset_cycle_index(r) ((r)->cycle_index = 0)
695
#define rule_reset_cycle_index(r)	((r)->cycle_index = 0)
730
#endif /* defined (FS_FAST) */
696
#endif /* defined (FS_FAST) */
731
 
697
 
732
#ifdef FS_FAST
698
#ifdef FS_FAST
733
#undef rule_has_computed_first_set
699
#undef rule_has_computed_first_set
734
#endif /* defined (FS_FAST) */
700
#endif /* defined (FS_FAST) */
735
BoolT
701
BoolT
736
rule_has_computed_first_set PROTO_N ((rule))
702
rule_has_computed_first_set(RuleP rule)
737
			    PROTO_T (RuleP rule)
-
 
738
{
703
{
739
    return (rule->computed_first_set);
704
    return(rule->computed_first_set);
740
}
705
}
741
#ifdef FS_FAST
706
#ifdef FS_FAST
742
#define rule_has_computed_first_set(r) ((r)->computed_first_set)
707
#define rule_has_computed_first_set(r)	((r)->computed_first_set)
743
#endif /* defined (FS_FAST) */
708
#endif /* defined (FS_FAST) */
744
 
709
 
745
#ifdef FS_FAST
710
#ifdef FS_FAST
746
#undef rule_computed_first_set
711
#undef rule_computed_first_set
747
#endif /* defined (FS_FAST) */
712
#endif /* defined (FS_FAST) */
748
void
713
void
749
rule_computed_first_set PROTO_N ((rule))
714
rule_computed_first_set(RuleP rule)
750
			PROTO_T (RuleP rule)
-
 
751
{
715
{
752
    rule->computed_first_set = TRUE;
716
    rule->computed_first_set = TRUE;
753
}
717
}
754
#ifdef FS_FAST
718
#ifdef FS_FAST
755
#define rule_computed_first_set(r) ((r)->computed_first_set)
719
#define rule_computed_first_set(r)	((r)->computed_first_set)
756
#endif /* defined (FS_FAST) */
720
#endif /* defined (FS_FAST) */
757
 
721
 
758
#ifdef FS_FAST
722
#ifdef FS_FAST
759
#undef rule_is_computing_first_set
723
#undef rule_is_computing_first_set
760
#endif /* defined (FS_FAST) */
724
#endif /* defined (FS_FAST) */
761
BoolT
725
BoolT
762
rule_is_computing_first_set PROTO_N ((rule))
726
rule_is_computing_first_set(RuleP rule)
763
			    PROTO_T (RuleP rule)
-
 
764
{
727
{
765
    return (rule->computing_first_set);
728
    return(rule->computing_first_set);
766
}
729
}
767
#ifdef FS_FAST
730
#ifdef FS_FAST
768
#define rule_is_computing_first_set(r) ((r)->computing_first_set)
731
#define rule_is_computing_first_set(r)	((r)->computing_first_set)
769
#endif /* defined (FS_FAST) */
732
#endif /* defined (FS_FAST) */
770
 
733
 
771
#ifdef FS_FAST
734
#ifdef FS_FAST
772
#undef rule_computing_first_set
735
#undef rule_computing_first_set
773
#endif /* defined (FS_FAST) */
736
#endif /* defined (FS_FAST) */
774
void
737
void
775
rule_computing_first_set PROTO_N ((rule))
738
rule_computing_first_set(RuleP rule)
776
			 PROTO_T (RuleP rule)
-
 
777
{
739
{
778
    rule->computing_first_set = TRUE;
740
    rule->computing_first_set = TRUE;
779
}
741
}
780
#ifdef FS_FAST
742
#ifdef FS_FAST
781
#define rule_computing_first_set(r) ((r)->computing_first_set = TRUE)
743
#define rule_computing_first_set(r)	((r)->computing_first_set = TRUE)
782
#endif /* defined (FS_FAST) */
744
#endif /* defined (FS_FAST) */
783
 
745
 
784
#ifdef FS_FAST
746
#ifdef FS_FAST
785
#undef rule_first_set
747
#undef rule_first_set
786
#endif /* defined (FS_FAST) */
748
#endif /* defined (FS_FAST) */
787
BitVecP
749
BitVecP
788
rule_first_set PROTO_N ((rule))
750
rule_first_set(RuleP rule)
789
	       PROTO_T (RuleP rule)
-
 
790
{
751
{
791
    return (&(rule->first_set));
752
    return(&(rule->first_set));
792
}
753
}
793
#ifdef FS_FAST
754
#ifdef FS_FAST
794
#define rule_first_set(r) (&((r)->first_set))
755
#define rule_first_set(r)	(&((r)->first_set))
795
#endif /* defined (FS_FAST) */
756
#endif /* defined (FS_FAST) */
796
 
757
 
797
#ifdef FS_FAST
758
#ifdef FS_FAST
798
#undef rule_predicate_first
759
#undef rule_predicate_first
799
#endif /* defined (FS_FAST) */
760
#endif /* defined (FS_FAST) */
800
EntryListP
761
EntryListP
801
rule_predicate_first PROTO_N ((rule))
762
rule_predicate_first(RuleP rule)
802
		     PROTO_T (RuleP rule)
-
 
803
{
763
{
804
    return (&(rule->predicate_first));
764
    return(&(rule->predicate_first));
805
}
765
}
806
#ifdef FS_FAST
766
#ifdef FS_FAST
807
#define rule_predicate_first(r) (&((r)->predicate_first))
767
#define rule_predicate_first(r)	(&((r)->predicate_first))
808
#endif /* defined (FS_FAST) */
768
#endif /* defined (FS_FAST) */
809
 
769
 
810
#ifdef FS_FAST
770
#ifdef FS_FAST
811
#undef rule_is_see_through
771
#undef rule_is_see_through
812
#endif /* defined (FS_FAST) */
772
#endif /* defined (FS_FAST) */
813
BoolT
773
BoolT
814
rule_is_see_through PROTO_N ((rule))
774
rule_is_see_through(RuleP rule)
815
		    PROTO_T (RuleP rule)
-
 
816
{
775
{
817
    return (rule->see_through);
776
    return(rule->see_through);
818
}
777
}
819
#ifdef FS_FAST
778
#ifdef FS_FAST
820
#define rule_is_see_through(r) ((r)->see_through)
779
#define rule_is_see_through(r)	((r)->see_through)
821
#endif /* defined (FS_FAST) */
780
#endif /* defined (FS_FAST) */
822
 
781
 
823
#ifdef FS_FAST
782
#ifdef FS_FAST
824
#undef rule_see_through
783
#undef rule_see_through
825
#endif /* defined (FS_FAST) */
784
#endif /* defined (FS_FAST) */
826
void
785
void
827
rule_see_through PROTO_N ((rule))
786
rule_see_through(RuleP rule)
828
		 PROTO_T (RuleP rule)
-
 
829
{
787
{
830
    rule->see_through = TRUE;
788
    rule->see_through = TRUE;
831
}
789
}
832
#ifdef FS_FAST
790
#ifdef FS_FAST
833
#define rule_see_through(r) ((r)->see_through = TRUE)
791
#define rule_see_through(r)	((r)->see_through = TRUE)
834
#endif /* defined (FS_FAST) */
792
#endif /* defined (FS_FAST) */
835
 
793
 
836
#ifdef FS_FAST
794
#ifdef FS_FAST
837
#undef rule_get_priority
795
#undef rule_get_priority
838
#endif /* defined (FS_FAST) */
796
#endif /* defined (FS_FAST) */
839
unsigned
797
unsigned
840
rule_get_priority PROTO_N ((rule))
798
rule_get_priority(RuleP rule)
841
		  PROTO_T (RuleP rule)
-
 
842
{
799
{
843
    return (rule->priority);
800
    return(rule->priority);
844
}
801
}
845
#ifdef FS_FAST
802
#ifdef FS_FAST
846
#define rule_get_priority(r) ((r)->priority)
803
#define rule_get_priority(r)	((r)->priority)
847
#endif /* defined (FS_FAST) */
804
#endif /* defined (FS_FAST) */
848
 
805
 
849
#ifdef FS_FAST
806
#ifdef FS_FAST
850
#undef rule_set_priority
807
#undef rule_set_priority
851
#endif /* defined (FS_FAST) */
808
#endif /* defined (FS_FAST) */
852
void
809
void
853
rule_set_priority PROTO_N ((rule, priority))
810
rule_set_priority(RuleP rule, unsigned priority)
854
		  PROTO_T (RuleP    rule X
-
 
855
			   unsigned priority)
-
 
856
{
811
{
857
    ASSERT (priority > 0);
812
    ASSERT(priority > 0);
858
    rule->priority = priority;
813
    rule->priority = priority;
859
}
814
}
860
#ifdef FS_FAST
815
#ifdef FS_FAST
861
#define rule_set_priority(r, p) ((r)->priority = (p))
816
#define rule_set_priority(r, p)	((r)->priority = (p))
862
#endif /* defined (FS_FAST) */
817
#endif /* defined (FS_FAST) */
863
 
818
 
864
#ifdef FS_FAST
819
#ifdef FS_FAST
865
#undef rule_is_factored
820
#undef rule_is_factored
866
#endif /* defined (FS_FAST) */
821
#endif /* defined (FS_FAST) */
867
BoolT
822
BoolT
868
rule_is_factored PROTO_N ((rule))
823
rule_is_factored(RuleP rule)
869
		 PROTO_T (RuleP rule)
-
 
870
{
824
{
871
    return (rule->factored);
825
    return(rule->factored);
872
}
826
}
873
#ifdef FS_FAST
827
#ifdef FS_FAST
874
#define rule_is_factored(r) ((r)->factored)
828
#define rule_is_factored(r)	((r)->factored)
875
#endif /* defined (FS_FAST) */
829
#endif /* defined (FS_FAST) */
876
 
830
 
877
#ifdef FS_FAST
831
#ifdef FS_FAST
878
#undef rule_factored
832
#undef rule_factored
879
#endif /* defined (FS_FAST) */
833
#endif /* defined (FS_FAST) */
880
void
834
void
881
rule_factored PROTO_N ((rule))
835
rule_factored(RuleP rule)
882
	      PROTO_T (RuleP rule)
-
 
883
{
836
{
884
    rule->factored = TRUE;
837
    rule->factored = TRUE;
885
}
838
}
886
#ifdef FS_FAST
839
#ifdef FS_FAST
887
#define rule_factored(r) ((r)->factored = TRUE)
840
#define rule_factored(r)	((r)->factored = TRUE)
888
#endif /* defined (FS_FAST) */
841
#endif /* defined (FS_FAST) */
889
 
842
 
890
#ifdef FS_FAST
843
#ifdef FS_FAST
891
#undef rule_get_tail_group
844
#undef rule_get_tail_group
892
#endif /* defined (FS_FAST) */
845
#endif /* defined (FS_FAST) */
893
RuleP
846
RuleP
894
rule_get_tail_group PROTO_N ((rule))
847
rule_get_tail_group(RuleP rule)
895
		    PROTO_T (RuleP rule)
-
 
896
{
848
{
897
    return (rule->tail_group);
849
    return(rule->tail_group);
898
}
850
}
899
#ifdef FS_FAST
851
#ifdef FS_FAST
900
#define rule_get_tail_group(r) ((r)->tail_group)
852
#define rule_get_tail_group(r)	((r)->tail_group)
901
#endif /* defined (FS_FAST) */
853
#endif /* defined (FS_FAST) */
902
 
854
 
903
#ifdef FS_FAST
855
#ifdef FS_FAST
904
#undef rule_set_tail_group
856
#undef rule_set_tail_group
905
#endif /* defined (FS_FAST) */
857
#endif /* defined (FS_FAST) */
906
void
858
void
907
rule_set_tail_group PROTO_N ((rule1, rule2))
859
rule_set_tail_group(RuleP rule1, RuleP rule2)
908
		    PROTO_T (RuleP rule1 X
-
 
909
			     RuleP rule2)
-
 
910
{
860
{
911
    rule1->tail_group = rule2;
861
    rule1->tail_group = rule2;
912
}
862
}
913
#ifdef FS_FAST
863
#ifdef FS_FAST
914
#define rule_set_tail_group(r1, r2) ((r1)->tail_group = (r2))
864
#define rule_set_tail_group(r1, r2)	((r1)->tail_group = (r2))
915
#endif /* defined (FS_FAST) */
865
#endif /* defined (FS_FAST) */
916
 
866
 
917
#ifdef FS_FAST
867
#ifdef FS_FAST
918
#undef rule_is_being_inlined
868
#undef rule_is_being_inlined
919
#endif /* defined (FS_FAST) */
869
#endif /* defined (FS_FAST) */
920
BoolT
870
BoolT
921
rule_is_being_inlined PROTO_N ((rule))
871
rule_is_being_inlined(RuleP rule)
922
		      PROTO_T (RuleP rule)
-
 
923
{
872
{
924
    return (rule->being_inlined);
873
    return(rule->being_inlined);
925
}
874
}
926
#ifdef FS_FAST
875
#ifdef FS_FAST
927
#define rule_is_being_inlined(r) ((r)->being_inlined)
876
#define rule_is_being_inlined(r)	((r)->being_inlined)
928
#endif /* defined (FS_FAST) */
877
#endif /* defined (FS_FAST) */
929
 
878
 
930
#ifdef FS_FAST
879
#ifdef FS_FAST
931
#undef rule_being_inlined
880
#undef rule_being_inlined
932
#endif /* defined (FS_FAST) */
881
#endif /* defined (FS_FAST) */
933
void
882
void
934
rule_being_inlined PROTO_N ((rule))
883
rule_being_inlined(RuleP rule)
935
		   PROTO_T (RuleP rule)
-
 
936
{
884
{
937
    rule->being_inlined = TRUE;
885
    rule->being_inlined = TRUE;
938
}
886
}
939
#ifdef FS_FAST
887
#ifdef FS_FAST
940
#define rule_being_inlined(r) ((r)->being_inlined = TRUE)
888
#define rule_being_inlined(r)	((r)->being_inlined = TRUE)
941
#endif /* defined (FS_FAST) */
889
#endif /* defined (FS_FAST) */
942
 
890
 
943
#ifdef FS_FAST
891
#ifdef FS_FAST
944
#undef rule_is_checked_for_inlining
892
#undef rule_is_checked_for_inlining
945
#endif /* defined (FS_FAST) */
893
#endif /* defined (FS_FAST) */
946
BoolT
894
BoolT
947
rule_is_checked_for_inlining PROTO_N ((rule))
895
rule_is_checked_for_inlining(RuleP rule)
948
			     PROTO_T (RuleP rule)
-
 
949
{
896
{
950
    return (rule->checked_for_inlining);
897
    return(rule->checked_for_inlining);
951
}
898
}
952
#ifdef FS_FAST
899
#ifdef FS_FAST
953
#define rule_is_checked_for_inlining(r) ((r)->checked_for_inlining)
900
#define rule_is_checked_for_inlining(r)	((r)->checked_for_inlining)
954
#endif /* defined (FS_FAST) */
901
#endif /* defined (FS_FAST) */
955
 
902
 
956
#ifdef FS_FAST
903
#ifdef FS_FAST
957
#undef rule_checked_for_inlining
904
#undef rule_checked_for_inlining
958
#endif /* defined (FS_FAST) */
905
#endif /* defined (FS_FAST) */
959
void
906
void
960
rule_checked_for_inlining PROTO_N ((rule))
907
rule_checked_for_inlining(RuleP rule)
961
			  PROTO_T (RuleP rule)
-
 
962
{
908
{
963
    rule->checked_for_inlining = TRUE;
909
    rule->checked_for_inlining = TRUE;
964
}
910
}
965
#ifdef FS_FAST
911
#ifdef FS_FAST
966
#define rule_checked_for_inlining(r) ((r)->checked_for_inlining = TRUE)
912
#define rule_checked_for_inlining(r)	((r)->checked_for_inlining = TRUE)
967
#endif /* defined (FS_FAST) */
913
#endif /* defined (FS_FAST) */
968
 
914
 
969
#ifdef FS_FAST
915
#ifdef FS_FAST
970
#undef rule_call_list
916
#undef rule_call_list
971
#endif /* defined (FS_FAST) */
917
#endif /* defined (FS_FAST) */
972
EntryListP
918
EntryListP
973
rule_call_list PROTO_N ((rule))
919
rule_call_list(RuleP rule)
974
	       PROTO_T (RuleP rule)
-
 
975
{
920
{
976
    return (&(rule->call_list));
921
    return(&(rule->call_list));
977
}
922
}
978
#ifdef FS_FAST
923
#ifdef FS_FAST
979
#define rule_call_list(r) (&((r)->call_list))
924
#define rule_call_list(r)	(&((r)->call_list))
980
#endif /* defined (FS_FAST) */
925
#endif /* defined (FS_FAST) */
981
 
926
 
982
#ifdef FS_FAST
927
#ifdef FS_FAST
983
#undef rule_get_next_in_table
928
#undef rule_get_next_in_table
984
#endif /* defined (FS_FAST) */
929
#endif /* defined (FS_FAST) */
985
RuleP
930
RuleP
986
rule_get_next_in_table PROTO_N ((rule))
931
rule_get_next_in_table(RuleP rule)
987
		       PROTO_T (RuleP rule)
-
 
988
{
932
{
989
    return (rule->next_in_table);
933
    return(rule->next_in_table);
990
}
934
}
991
#ifdef FS_FAST
935
#ifdef FS_FAST
992
#define rule_get_next_in_table(r) ((r)->next_in_table)
936
#define rule_get_next_in_table(r)	((r)->next_in_table)
993
#endif /* defined (FS_FAST) */
937
#endif /* defined (FS_FAST) */
994
 
938
 
995
#ifdef FS_FAST
939
#ifdef FS_FAST
996
#undef rule_get_next_in_table_ref
940
#undef rule_get_next_in_table_ref
997
#endif /* defined (FS_FAST) */
941
#endif /* defined (FS_FAST) */
998
RuleP *
942
RuleP *
999
rule_get_next_in_table_ref PROTO_N ((rule))
943
rule_get_next_in_table_ref(RuleP rule)
1000
			   PROTO_T (RuleP rule)
-
 
1001
{
944
{
1002
    return (&(rule->next_in_table));
945
    return(&(rule->next_in_table));
1003
}
946
}
1004
#ifdef FS_FAST
947
#ifdef FS_FAST
1005
#define rule_get_next_in_table_ref(r) (&((r)->next_in_table))
948
#define rule_get_next_in_table_ref(r)	(&((r)->next_in_table))
1006
#endif /* defined (FS_FAST) */
949
#endif /* defined (FS_FAST) */
1007
 
950
 
1008
#ifdef FS_FAST
951
#ifdef FS_FAST
1009
#undef rule_set_next_in_table
952
#undef rule_set_next_in_table
1010
#endif /* defined (FS_FAST) */
953
#endif /* defined (FS_FAST) */
1011
void
954
void
1012
rule_set_next_in_table PROTO_N ((rule1, rule2))
955
rule_set_next_in_table(RuleP rule1, RuleP rule2)
1013
		       PROTO_T (RuleP rule1 X
-
 
1014
				RuleP rule2)
-
 
1015
{
956
{
1016
    rule1->next_in_table = rule2;
957
    rule1->next_in_table = rule2;
1017
}
958
}
1018
#ifdef FS_FAST
959
#ifdef FS_FAST
1019
#define rule_set_next_in_table(r1, r2) ((r1)->next_in_table = (r2))
960
#define rule_set_next_in_table(r1, r2)	((r1)->next_in_table = (r2))
1020
#endif /* defined (FS_FAST) */
961
#endif /* defined (FS_FAST) */
1021
 
962
 
1022
#ifdef FS_FAST
963
#ifdef FS_FAST
1023
#undef rule_follow_set
964
#undef rule_follow_set
1024
#endif /* defined (FS_FAST) */
965
#endif /* defined (FS_FAST) */
1025
BitVecP
966
BitVecP
1026
rule_follow_set PROTO_N ((rule))
967
rule_follow_set(RuleP rule)
1027
		PROTO_T (RuleP rule)
-
 
1028
{
968
{
1029
    return (&(rule->follow_set));
969
    return(&(rule->follow_set));
1030
}
970
}
1031
#ifdef FS_FAST
971
#ifdef FS_FAST
1032
#define rule_follow_set(r) (&((r)->follow_set))
972
#define rule_follow_set(r)	(&((r)->follow_set))
1033
#endif /* defined (FS_FAST) */
973
#endif /* defined (FS_FAST) */
1034
 
974
 
1035
#ifdef FS_FAST
975
#ifdef FS_FAST
1036
#undef rule_predicate_follow
976
#undef rule_predicate_follow
1037
#endif /* defined (FS_FAST) */
977
#endif /* defined (FS_FAST) */
1038
EntryListP
978
EntryListP
1039
rule_predicate_follow PROTO_N ((rule))
979
rule_predicate_follow(RuleP rule)
1040
		      PROTO_T (RuleP rule)
-
 
1041
{
980
{
1042
    return (&(rule->predicate_follow));
981
    return(&(rule->predicate_follow));
1043
}
982
}
1044
#ifdef FS_FAST
983
#ifdef FS_FAST
1045
#define rule_predicate_follow(r) (&((r)->predicate_follow))
984
#define rule_predicate_follow(r)	(&((r)->predicate_follow))
1046
#endif /* defined (FS_FAST) */
985
#endif /* defined (FS_FAST) */
1047
 
986
 
1048
#ifdef FS_FAST
987
#ifdef FS_FAST
1049
#undef rule_has_started_follows
988
#undef rule_has_started_follows
1050
#endif /* defined (FS_FAST) */
989
#endif /* defined (FS_FAST) */
1051
BoolT
990
BoolT
1052
rule_has_started_follows PROTO_N ((rule))
991
rule_has_started_follows(RuleP rule)
1053
			 PROTO_T (RuleP rule)
-
 
1054
{
992
{
1055
    return (rule->started_follows);
993
    return(rule->started_follows);
1056
}
994
}
1057
#ifdef FS_FAST
995
#ifdef FS_FAST
1058
#define rule_has_started_follows(r) ((r)->started_follows)
996
#define rule_has_started_follows(r)	((r)->started_follows)
1059
#endif /* defined (FS_FAST) */
997
#endif /* defined (FS_FAST) */
1060
 
998
 
1061
#ifdef FS_FAST
999
#ifdef FS_FAST
1062
#undef rule_started_follows
1000
#undef rule_started_follows
1063
#endif /* defined (FS_FAST) */
1001
#endif /* defined (FS_FAST) */
1064
void
1002
void
1065
rule_started_follows PROTO_N ((rule))
1003
rule_started_follows(RuleP rule)
1066
		     PROTO_T (RuleP rule)
-
 
1067
{
1004
{
1068
    rule->started_follows = TRUE;
1005
    rule->started_follows = TRUE;
1069
}
1006
}
1070
#ifdef FS_FAST
1007
#ifdef FS_FAST
1071
#define rule_started_follows(r) ((r)->started_follows = TRUE)
1008
#define rule_started_follows(r)	((r)->started_follows = TRUE)
1072
#endif /* defined (FS_FAST) */
1009
#endif /* defined (FS_FAST) */
1073
 
1010
 
1074
#ifdef FS_FAST
1011
#ifdef FS_FAST
1075
#undef rule_set_see_through_alt
1012
#undef rule_set_see_through_alt
1076
#endif /* defined (FS_FAST) */
1013
#endif /* defined (FS_FAST) */
1077
void
1014
void
1078
rule_set_see_through_alt PROTO_N ((rule, alt))
1015
rule_set_see_through_alt(RuleP rule, AltP alt)
1079
			 PROTO_T (RuleP rule X
-
 
1080
				  AltP  alt)
-
 
1081
{
1016
{
1082
    rule->see_through_alt = alt;
1017
    rule->see_through_alt = alt;
1083
}
1018
}
1084
#ifdef FS_FAST
1019
#ifdef FS_FAST
1085
#define rule_set_see_through_alt(r, a) ((r)->see_through_alt = (a))
1020
#define rule_set_see_through_alt(r, a)	((r)->see_through_alt = (a))
1086
#endif /* defined (FS_FAST) */
1021
#endif /* defined (FS_FAST) */
1087
 
1022
 
1088
#ifdef FS_FAST
1023
#ifdef FS_FAST
1089
#undef rule_see_through_alt
1024
#undef rule_see_through_alt
1090
#endif /* defined (FS_FAST) */
1025
#endif /* defined (FS_FAST) */
1091
AltP
1026
AltP
1092
rule_see_through_alt PROTO_N ((rule))
1027
rule_see_through_alt(RuleP rule)
1093
		     PROTO_T (RuleP rule)
-
 
1094
{
1028
{
1095
    return (rule->see_through_alt);
1029
    return(rule->see_through_alt);
1096
}
1030
}
1097
#ifdef FS_FAST
1031
#ifdef FS_FAST
1098
#define rule_see_through_alt(r) ((r)->see_through_alt)
1032
#define rule_see_through_alt(r)	((r)->see_through_alt)
1099
#endif /* defined (FS_FAST) */
1033
#endif /* defined (FS_FAST) */
1100
 
1034
 
1101
#ifdef FS_FAST
1035
#ifdef FS_FAST
1102
#undef rule_needs_function
1036
#undef rule_needs_function
1103
#endif /* defined (FS_FAST) */
1037
#endif /* defined (FS_FAST) */
1104
BoolT
1038
BoolT
1105
rule_needs_function PROTO_N ((rule))
1039
rule_needs_function(RuleP rule)
1106
		    PROTO_T (RuleP rule)
-
 
1107
{
1040
{
1108
    return (rule->needs_function);
1041
    return(rule->needs_function);
1109
}
1042
}
1110
#ifdef FS_FAST
1043
#ifdef FS_FAST
1111
#define rule_needs_function(r) ((r)->needs_function)
1044
#define rule_needs_function(r)	((r)->needs_function)
1112
#endif /* defined (FS_FAST) */
1045
#endif /* defined (FS_FAST) */
1113
 
1046
 
1114
#ifdef FS_FAST
1047
#ifdef FS_FAST
1115
#undef rule_will_need_function
1048
#undef rule_will_need_function
1116
#endif /* defined (FS_FAST) */
1049
#endif /* defined (FS_FAST) */
1117
void
1050
void
1118
rule_will_need_function PROTO_N ((rule))
1051
rule_will_need_function(RuleP rule)
1119
			PROTO_T (RuleP rule)
-
 
1120
{
1052
{
1121
    rule->needs_function = TRUE;
1053
    rule->needs_function = TRUE;
1122
}
1054
}
1123
#ifdef FS_FAST
1055
#ifdef FS_FAST
1124
#define rule_will_need_function(r) ((r)->needs_function = TRUE)
1056
#define rule_will_need_function(r)	((r)->needs_function = TRUE)
1125
#endif /* defined (FS_FAST) */
1057
#endif /* defined (FS_FAST) */
1126
 
1058
 
1127
#ifdef FS_FAST
1059
#ifdef FS_FAST
1128
#undef rule_is_all_basics
1060
#undef rule_is_all_basics
1129
#endif /* defined (FS_FAST) */
1061
#endif /* defined (FS_FAST) */
1130
BoolT
1062
BoolT
1131
rule_is_all_basics PROTO_N ((rule))
1063
rule_is_all_basics(RuleP rule)
1132
		   PROTO_T (RuleP rule)
-
 
1133
{
1064
{
1134
    return (rule->all_basics);
1065
    return(rule->all_basics);
1135
}
1066
}
1136
#ifdef FS_FAST
1067
#ifdef FS_FAST
1137
#define rule_is_all_basics(r) ((r)->all_basics)
1068
#define rule_is_all_basics(r)	((r)->all_basics)
1138
#endif /* defined (FS_FAST) */
1069
#endif /* defined (FS_FAST) */
1139
 
1070
 
1140
#ifdef FS_FAST
1071
#ifdef FS_FAST
1141
#undef rule_all_basics
1072
#undef rule_all_basics
1142
#endif /* defined (FS_FAST) */
1073
#endif /* defined (FS_FAST) */
1143
void
1074
void
1144
rule_all_basics PROTO_N ((rule))
1075
rule_all_basics(RuleP rule)
1145
		PROTO_T (RuleP rule)
-
 
1146
{
1076
{
1147
    rule->all_basics = TRUE;
1077
    rule->all_basics = TRUE;
1148
}
1078
}
1149
#ifdef FS_FAST
1079
#ifdef FS_FAST
1150
#define rule_all_basics(r) ((r)->all_basics = TRUE)
1080
#define rule_all_basics(r)	((r)->all_basics = TRUE)
1151
#endif /* defined (FS_FAST) */
1081
#endif /* defined (FS_FAST) */
1152
 
1082
 
1153
#ifdef FS_FAST
1083
#ifdef FS_FAST
1154
#undef rule_rstack_state
1084
#undef rule_rstack_state
1155
#endif /* defined (FS_FAST) */
1085
#endif /* defined (FS_FAST) */
1156
SaveRStackP
1086
SaveRStackP
1157
rule_rstack_state PROTO_N ((rule))
1087
rule_rstack_state(RuleP rule)
1158
		  PROTO_T (RuleP rule)
-
 
1159
{
1088
{
1160
    return (&(rule->rstack_state));
1089
    return(&(rule->rstack_state));
1161
}
1090
}
1162
#ifdef FS_FAST
1091
#ifdef FS_FAST
1163
#define rule_rstack_state(r) (&((r)->rstack_state))
1092
#define rule_rstack_state(r)	(&((r)->rstack_state))
1164
#endif /* defined (FS_FAST) */
1093
#endif /* defined (FS_FAST) */
1165
 
1094
 
1166
#ifdef FS_FAST
1095
#ifdef FS_FAST
1167
#undef rule_non_local_state
1096
#undef rule_non_local_state
1168
#endif /* defined (FS_FAST) */
1097
#endif /* defined (FS_FAST) */
1169
SaveRStackP
1098
SaveRStackP
1170
rule_non_local_state PROTO_N ((rule))
1099
rule_non_local_state(RuleP rule)
1171
		     PROTO_T (RuleP rule)
-
 
1172
{
1100
{
1173
    return (&(rule->non_local_state));
1101
    return(&(rule->non_local_state));
1174
}
1102
}
1175
#ifdef FS_FAST
1103
#ifdef FS_FAST
1176
#define rule_non_local_state(r) (&((r)->non_local_state))
1104
#define rule_non_local_state(r)	(&((r)->non_local_state))
1177
#endif /* defined (FS_FAST) */
1105
#endif /* defined (FS_FAST) */
1178
 
1106
 
1179
#ifdef FS_FAST
1107
#ifdef FS_FAST
1180
#undef rule_is_being_output
1108
#undef rule_is_being_output
1181
#endif /* defined (FS_FAST) */
1109
#endif /* defined (FS_FAST) */
1182
BoolT
1110
BoolT
1183
rule_is_being_output PROTO_N ((rule))
1111
rule_is_being_output(RuleP rule)
1184
		     PROTO_T (RuleP rule)
-
 
1185
{
1112
{
1186
    return (rule->being_output);
1113
    return(rule->being_output);
1187
}
1114
}
1188
#ifdef FS_FAST
1115
#ifdef FS_FAST
1189
#define rule_is_being_output(r) ((r)->being_output)
1116
#define rule_is_being_output(r)	((r)->being_output)
1190
#endif /* defined (FS_FAST) */
1117
#endif /* defined (FS_FAST) */
1191
 
1118
 
1192
#ifdef FS_FAST
1119
#ifdef FS_FAST
1193
#undef rule_being_output
1120
#undef rule_being_output
1194
#endif /* defined (FS_FAST) */
1121
#endif /* defined (FS_FAST) */
1195
void
1122
void
1196
rule_being_output PROTO_N ((rule))
1123
rule_being_output(RuleP rule)
1197
		  PROTO_T (RuleP rule)
-
 
1198
{
1124
{
1199
    rule->being_output = TRUE;
1125
    rule->being_output = TRUE;
1200
}
1126
}
1201
#ifdef FS_FAST
1127
#ifdef FS_FAST
1202
#define rule_being_output(r) ((r)->being_output = TRUE)
1128
#define rule_being_output(r)	((r)->being_output = TRUE)
1203
#endif /* defined (FS_FAST) */
1129
#endif /* defined (FS_FAST) */
1204
 
1130
 
1205
#ifdef FS_FAST
1131
#ifdef FS_FAST
1206
#undef rule_not_being_output
1132
#undef rule_not_being_output
1207
#endif /* defined (FS_FAST) */
1133
#endif /* defined (FS_FAST) */
1208
void
1134
void
1209
rule_not_being_output PROTO_N ((rule))
1135
rule_not_being_output(RuleP rule)
1210
		      PROTO_T (RuleP rule)
-
 
1211
{
1136
{
1212
    rule->being_output = FALSE;
1137
    rule->being_output = FALSE;
1213
}
1138
}
1214
#ifdef FS_FAST
1139
#ifdef FS_FAST
1215
#define rule_not_being_output(r) ((r)->being_output = FALSE)
1140
#define rule_not_being_output(r)	((r)->being_output = FALSE)
1216
#endif /* defined (FS_FAST) */
1141
#endif /* defined (FS_FAST) */
1217
 
1142
 
1218
#ifdef FS_FAST
1143
#ifdef FS_FAST
1219
#undef rule_get_start_label
1144
#undef rule_get_start_label
1220
#endif /* defined (FS_FAST) */
1145
#endif /* defined (FS_FAST) */
1221
unsigned
1146
unsigned
1222
rule_get_start_label PROTO_N ((rule))
1147
rule_get_start_label(RuleP rule)
1223
		     PROTO_T (RuleP rule)
-
 
1224
{
1148
{
1225
    return (rule->start_label);
1149
    return(rule->start_label);
1226
}
1150
}
1227
#ifdef FS_FAST
1151
#ifdef FS_FAST
1228
#define rule_get_start_label(r) ((r)->start_label)
1152
#define rule_get_start_label(r)	((r)->start_label)
1229
#endif /* defined (FS_FAST) */
1153
#endif /* defined (FS_FAST) */
1230
 
1154
 
1231
#ifdef FS_FAST
1155
#ifdef FS_FAST
1232
#undef rule_set_start_label
1156
#undef rule_set_start_label
1233
#endif /* defined (FS_FAST) */
1157
#endif /* defined (FS_FAST) */
1234
void
1158
void
1235
rule_set_start_label PROTO_N ((rule, label))
1159
rule_set_start_label(RuleP rule, unsigned label)
1236
		     PROTO_T (RuleP    rule X
-
 
1237
			      unsigned label)
-
 
1238
{
1160
{
1239
    rule->start_label = label;
1161
    rule->start_label = label;
1240
}
1162
}
1241
#ifdef FS_FAST
1163
#ifdef FS_FAST
1242
#define rule_set_start_label(r, l) ((r)->start_label = (l))
1164
#define rule_set_start_label(r, l)	((r)->start_label = (l))
1243
#endif /* defined (FS_FAST) */
1165
#endif /* defined (FS_FAST) */
1244
 
1166
 
1245
#ifdef FS_FAST
1167
#ifdef FS_FAST
1246
#undef rule_get_call_count
1168
#undef rule_get_call_count
1247
#endif /* defined (FS_FAST) */
1169
#endif /* defined (FS_FAST) */
1248
unsigned
1170
unsigned
1249
rule_get_call_count PROTO_N ((rule))
1171
rule_get_call_count(RuleP rule)
1250
		    PROTO_T (RuleP rule)
-
 
1251
{
1172
{
1252
    return (rule->call_count);
1173
    return(rule->call_count);
1253
}
1174
}
1254
#ifdef FS_FAST
1175
#ifdef FS_FAST
1255
#define rule_get_call_count(r) ((r)->call_count)
1176
#define rule_get_call_count(r)	((r)->call_count)
1256
#endif /* defined (FS_FAST) */
1177
#endif /* defined (FS_FAST) */
1257
 
1178
 
1258
#ifdef FS_FAST
1179
#ifdef FS_FAST
1259
#undef rule_inc_call_count
1180
#undef rule_inc_call_count
1260
#endif /* defined (FS_FAST) */
1181
#endif /* defined (FS_FAST) */
1261
void
1182
void
1262
rule_inc_call_count PROTO_N ((rule))
1183
rule_inc_call_count(RuleP rule)
1263
		    PROTO_T (RuleP rule)
-
 
1264
{
1184
{
1265
    rule->call_count ++;
1185
    rule->call_count++;
1266
}
1186
}
1267
#ifdef FS_FAST
1187
#ifdef FS_FAST
1268
#define rule_inc_call_count(r) ((r)->call_count ++)
1188
#define rule_inc_call_count(r)	((r)->call_count++)
1269
#endif /* defined (FS_FAST) */
1189
#endif /* defined (FS_FAST) */
1270
 
1190
 
1271
unsigned
1191
unsigned
1272
rule_get_end_label PROTO_N ((rule))
1192
rule_get_end_label(RuleP rule)
1273
		   PROTO_T (RuleP rule)
-
 
1274
{
1193
{
1275
    rule->used_end_label = TRUE;
1194
    rule->used_end_label = TRUE;
1276
    return (rule->end_label);
1195
    return(rule->end_label);
1277
}
1196
}
1278
 
1197
 
1279
void
1198
void
1280
rule_set_end_label PROTO_N ((rule, label))
1199
rule_set_end_label(RuleP rule, unsigned label)
1281
		   PROTO_T (RuleP    rule X
-
 
1282
			    unsigned label)
-
 
1283
{
1200
{
1284
    rule->used_end_label = FALSE;
1201
    rule->used_end_label = FALSE;
1285
    rule->end_label      = label;
1202
    rule->end_label      = label;
1286
}
1203
}
1287
 
1204
 
1288
#ifdef FS_FAST
1205
#ifdef FS_FAST
1289
#undef rule_used_end_label
1206
#undef rule_used_end_label
1290
#endif /* defined (FS_FAST) */
1207
#endif /* defined (FS_FAST) */
1291
BoolT
1208
BoolT
1292
rule_used_end_label PROTO_N ((rule))
1209
rule_used_end_label(RuleP rule)
1293
		    PROTO_T (RuleP rule)
-
 
1294
{
1210
{
1295
    return (rule->used_end_label);
1211
    return(rule->used_end_label);
1296
}
1212
}
1297
#ifdef FS_FAST
1213
#ifdef FS_FAST
1298
#define rule_used_end_label(r) ((r)->used_end_label)
1214
#define rule_used_end_label(r)	((r)->used_end_label)
1299
#endif /* defined (FS_FAST) */
1215
#endif /* defined (FS_FAST) */
1300
 
1216
 
1301
#ifdef FS_FAST
1217
#ifdef FS_FAST
1302
#undef rule_get_next_label
1218
#undef rule_get_next_label
1303
#endif /* defined (FS_FAST) */
1219
#endif /* defined (FS_FAST) */
1304
unsigned
1220
unsigned
1305
rule_get_next_label PROTO_N ((rule))
1221
rule_get_next_label(RuleP rule)
1306
		    PROTO_T (RuleP rule)
-
 
1307
{
1222
{
1308
    return (rule->next_label);
1223
    return(rule->next_label);
1309
}
1224
}
1310
#ifdef FS_FAST
1225
#ifdef FS_FAST
1311
#define rule_get_next_label(r) ((r)->next_label)
1226
#define rule_get_next_label(r)	((r)->next_label)
1312
#endif /* defined (FS_FAST) */
1227
#endif /* defined (FS_FAST) */
1313
 
1228
 
1314
#ifdef FS_FAST
1229
#ifdef FS_FAST
1315
#undef rule_set_next_label
1230
#undef rule_set_next_label
1316
#endif /* defined (FS_FAST) */
1231
#endif /* defined (FS_FAST) */
1317
void
1232
void
1318
rule_set_next_label PROTO_N ((rule, label))
1233
rule_set_next_label(RuleP rule, unsigned label)
1319
		    PROTO_T (RuleP    rule X
-
 
1320
			     unsigned label)
-
 
1321
{
1234
{
1322
    rule->next_label = label;
1235
    rule->next_label = label;
1323
}
1236
}
1324
#ifdef FS_FAST
1237
#ifdef FS_FAST
1325
#define rule_set_next_label(r, l) ((r)->next_label = (l))
1238
#define rule_set_next_label(r, l)	((r)->next_label = (l))
1326
#endif /* defined (FS_FAST) */
1239
#endif /* defined (FS_FAST) */
1327
 
1240
 
1328
unsigned
1241
unsigned
1329
rule_get_handler_label PROTO_N ((rule))
1242
rule_get_handler_label(RuleP rule)
1330
		       PROTO_T (RuleP rule)
-
 
1331
{
1243
{
1332
    rule->used_handler_label = TRUE;
1244
    rule->used_handler_label = TRUE;
1333
    return (rule->handler_label);
1245
    return(rule->handler_label);
1334
}
1246
}
1335
 
1247
 
1336
void
1248
void
1337
rule_set_handler_label PROTO_N ((rule, label))
1249
rule_set_handler_label(RuleP rule, unsigned label)
1338
		       PROTO_T (RuleP    rule X
-
 
1339
				unsigned label)
-
 
1340
{
1250
{
1341
    rule->used_handler_label = FALSE;
1251
    rule->used_handler_label = FALSE;
1342
    rule->handler_label      = label;
1252
    rule->handler_label      = label;
1343
}
1253
}
1344
 
1254
 
1345
#ifdef FS_FAST
1255
#ifdef FS_FAST
1346
#undef rule_used_handler_label
1256
#undef rule_used_handler_label
1347
#endif /* defined (FS_FAST) */
1257
#endif /* defined (FS_FAST) */
1348
BoolT
1258
BoolT
1349
rule_used_handler_label PROTO_N ((rule))
1259
rule_used_handler_label(RuleP rule)
1350
			PROTO_T (RuleP rule)
-
 
1351
{
1260
{
1352
    return (rule->used_handler_label);
1261
    return(rule->used_handler_label);
1353
}
1262
}
1354
#ifdef FS_FAST
1263
#ifdef FS_FAST
1355
#define rule_used_handler_label(r) ((r)->used_handler_label)
1264
#define rule_used_handler_label(r)	((r)->used_handler_label)
1356
#endif /* defined (FS_FAST) */
1265
#endif /* defined (FS_FAST) */
1357
 
1266
 
1358
#ifdef FS_FAST
1267
#ifdef FS_FAST
1359
#undef rule_get_handler
1268
#undef rule_get_handler
1360
#endif /* defined (FS_FAST) */
1269
#endif /* defined (FS_FAST) */
1361
AltP
1270
AltP
1362
rule_get_handler PROTO_N ((rule))
1271
rule_get_handler(RuleP rule)
1363
		 PROTO_T (RuleP rule)
-
 
1364
{
1272
{
1365
    return (rule->handler);
1273
    return(rule->handler);
1366
}
1274
}
1367
#ifdef FS_FAST
1275
#ifdef FS_FAST
1368
#define rule_get_handler(r) ((r)->handler)
1276
#define rule_get_handler(r)	((r)->handler)
1369
#endif /* defined (FS_FAST) */
1277
#endif /* defined (FS_FAST) */
1370
 
1278
 
1371
#ifdef FS_FAST
1279
#ifdef FS_FAST
1372
#undef rule_set_handler
1280
#undef rule_set_handler
1373
#endif /* defined (FS_FAST) */
1281
#endif /* defined (FS_FAST) */
1374
void
1282
void
1375
rule_set_handler PROTO_N ((rule, handler))
1283
rule_set_handler(RuleP rule, AltP handler)
1376
		 PROTO_T (RuleP rule X
-
 
1377
			  AltP  handler)
-
 
1378
{
1284
{
1379
    rule->handler = handler;
1285
    rule->handler = handler;
1380
}
1286
}
1381
#ifdef FS_FAST
1287
#ifdef FS_FAST
1382
#define rule_set_handler(r, a) ((r)->handler = (a))
1288
#define rule_set_handler(r, a)	((r)->handler = (a))
1383
#endif /* defined (FS_FAST) */
1289
#endif /* defined (FS_FAST) */
1384
 
1290
 
1385
#ifdef FS_FAST
1291
#ifdef FS_FAST
1386
#undef rule_alt_head
1292
#undef rule_alt_head
1387
#endif /* defined (FS_FAST) */
1293
#endif /* defined (FS_FAST) */
1388
AltP
1294
AltP
1389
rule_alt_head PROTO_N ((rule))
1295
rule_alt_head(RuleP rule)
1390
	      PROTO_T (RuleP rule)
-
 
1391
{
1296
{
1392
    return (rule->alt_head);
1297
    return(rule->alt_head);
1393
}
1298
}
1394
#ifdef FS_FAST
1299
#ifdef FS_FAST
1395
#define rule_alt_head(r) ((r)->alt_head)
1300
#define rule_alt_head(r)	((r)->alt_head)
1396
#endif /* defined (FS_FAST) */
1301
#endif /* defined (FS_FAST) */
1397
 
1302
 
1398
void
1303
void
1399
rule_renumber PROTO_N ((rule, do_result, predicate_id))
1304
rule_renumber(RuleP rule, BoolT do_result, EntryP predicate_id)
1400
	      PROTO_T (RuleP  rule X
-
 
1401
		       BoolT  do_result X
-
 
1402
		       EntryP predicate_id)
-
 
1403
{
1305
{
1404
    TypeNTransT translator;
1306
    TypeNTransT translator;
1405
    SaveNTransT state;
1307
    SaveNTransT state;
1406
    AltP        alt;
1308
    AltP        alt;
1407
 
1309
 
1408
    ntrans_init (&translator);
1310
    ntrans_init(&translator);
1409
    (void) ntrans_get_translation (&translator, predicate_id);
1311
    (void)ntrans_get_translation(&translator, predicate_id);
1410
    types_renumber (rule_param (rule), &translator);
1312
    types_renumber(rule_param(rule), &translator);
1411
    if (do_result) {
1313
    if (do_result) {
1412
	types_renumber (rule_result (rule), &translator);
1314
	types_renumber(rule_result(rule), &translator);
1413
    }
1315
    }
1414
    ntrans_save_state (&translator, &state);
1316
    ntrans_save_state(&translator, &state);
1415
    if ((alt = rule_get_handler (rule)) != NIL (AltP)) {
1317
    if ((alt = rule_get_handler(rule)) != NIL(AltP)) {
1416
	rule_renumber_1 (alt, &translator, &state);
1318
	rule_renumber_1(alt, &translator, &state);
1417
    }
1319
    }
1418
    for (alt = rule->alt_head; alt; alt = alt_next (alt)) {
1320
    for (alt = rule->alt_head; alt; alt = alt_next(alt)) {
1419
	rule_renumber_1 (alt, &translator, &state);
1321
	rule_renumber_1(alt, &translator, &state);
1420
    }
1322
    }
1421
    ntrans_destroy (&translator);
1323
    ntrans_destroy(&translator);
1422
}
1324
}
1423
 
1325
 
1424
void
1326
void
1425
rule_iter_for_table PROTO_N ((rule, full, proc, closure))
1327
rule_iter_for_table(RuleP rule, BoolT full, void (*proc)(EntryP, GenericP),
1426
		    PROTO_T (RuleP    rule X
-
 
1427
			     BoolT    full X
-
 
1428
			     void   (*proc) PROTO_S ((EntryP, GenericP)) X
-
 
1429
			     GenericP closure)
1328
		    GenericP closure)
1430
{
1329
{
1431
    AltP alt;
1330
    AltP alt;
1432
 
1331
 
1433
    if ((alt = rule_get_handler (rule)) != NIL (AltP)) {
1332
    if ((alt = rule_get_handler(rule)) != NIL(AltP)) {
1434
	ItemP item;
1333
	ItemP item;
1435
 
1334
 
1436
	for (item = alt_item_head (alt); item; item = item_next (item)) {
1335
	for (item = alt_item_head(alt); item; item = item_next(item)) {
1437
	    entry_iter (item_entry (item), full, proc, closure);
1336
	    entry_iter(item_entry(item), full, proc, closure);
1438
	    if (full) {
1337
	    if (full) {
1439
		types_iter_for_table (item_param (item), proc, closure);
1338
		types_iter_for_table(item_param(item), proc, closure);
1440
		types_iter_for_table (item_result (item), proc, closure);
1339
		types_iter_for_table(item_result(item), proc, closure);
1441
	    }
1340
	    }
1442
	}
1341
	}
1443
    }
1342
    }
1444
    for (alt = rule->alt_head; alt; alt = alt_next (alt)) {
1343
    for (alt = rule->alt_head; alt; alt = alt_next(alt)) {
1445
	ItemP item;
1344
	ItemP item;
1446
 
1345
 
1447
	for (item = alt_item_head (alt); item; item = item_next (item)) {
1346
	for (item = alt_item_head(alt); item; item = item_next(item)) {
1448
	    entry_iter (item_entry (item), full, proc, closure);
1347
	    entry_iter(item_entry(item), full, proc, closure);
1449
	    if (full) {
1348
	    if (full) {
1450
		types_iter_for_table (item_param (item), proc, closure);
1349
		types_iter_for_table(item_param(item), proc, closure);
1451
		types_iter_for_table (item_result (item), proc, closure);
1350
		types_iter_for_table(item_result(item), proc, closure);
1452
	    }
1351
	    }
1453
	}
1352
	}
1454
    }
1353
    }
1455
    if (full) {
1354
    if (full) {
1456
	non_local_list_iter_for_table (rule_non_locals (rule), proc, closure);
1355
	non_local_list_iter_for_table(rule_non_locals(rule), proc, closure);
1457
	types_iter_for_table (rule_param (rule), proc, closure);
1356
	types_iter_for_table(rule_param(rule), proc, closure);
1458
	types_iter_for_table (rule_result (rule), proc, closure);
1357
	types_iter_for_table(rule_result(rule), proc, closure);
1459
    }
1358
    }
1460
}
1359
}
1461
 
1360
 
1462
void
1361
void
1463
rule_deallocate PROTO_N ((rule))
1362
rule_deallocate(RuleP rule)
1464
		PROTO_T (RuleP rule)
-
 
1465
{
1363
{
1466
    AltP alt;
1364
    AltP alt;
1467
 
1365
 
1468
    types_destroy (rule_param (rule));
1366
    types_destroy(rule_param(rule));
1469
    types_destroy (rule_result (rule));
1367
    types_destroy(rule_result(rule));
1470
    non_local_list_destroy (rule_non_locals (rule));
1368
    non_local_list_destroy(rule_non_locals(rule));
1471
    nstring_destroy (rule_maximum_scope (rule));
1369
    nstring_destroy(rule_maximum_scope(rule));
1472
    entry_list_destroy (rule_reverse_list (rule));
1370
    entry_list_destroy(rule_reverse_list(rule));
1473
    bitvec_destroy (rule_first_set (rule));
1371
    bitvec_destroy(rule_first_set(rule));
1474
    entry_list_destroy (rule_predicate_first (rule));
1372
    entry_list_destroy(rule_predicate_first(rule));
1475
    bitvec_destroy (rule_follow_set (rule));
1373
    bitvec_destroy(rule_follow_set(rule));
1476
    entry_list_destroy (rule_predicate_follow (rule));
1374
    entry_list_destroy(rule_predicate_follow(rule));
1477
    entry_list_destroy (rule_call_list (rule));
1375
    entry_list_destroy(rule_call_list(rule));
1478
    if ((alt = rule_get_handler (rule)) != NIL (AltP)) {
1376
    if ((alt = rule_get_handler(rule)) != NIL(AltP)) {
1479
	(void) alt_deallocate (alt);
1377
	(void)alt_deallocate(alt);
1480
    }
1378
    }
1481
    for (alt = rule_alt_head (rule); alt; alt = alt_deallocate (alt)) {
1379
    for (alt = rule_alt_head(rule); alt; alt = alt_deallocate(alt)) {
1482
	/*NOTHING*/
1380
	/*NOTHING*/
1483
    }
1381
    }
1484
}
1382
}
1485
 
1383
 
1486
void
1384
void
1487
write_rule_lhs PROTO_N ((ostream, rule))
1385
write_rule_lhs(OStreamP ostream, RuleP rule)
1488
	       PROTO_T (OStreamP ostream X
-
 
1489
			RuleP    rule)
-
 
1490
{
1386
{
1491
    KeyP key = entry_key (rule_entry (rule));
1387
    KeyP key = entry_key(rule_entry(rule));
1492
 
1388
 
1493
    write_key (ostream, key);
1389
    write_key(ostream, key);
1494
    write_cstring (ostream, ": ");
1390
    write_cstring(ostream, ": ");
1495
    write_type_names (ostream, rule_param (rule), FALSE);
1391
    write_type_names(ostream, rule_param(rule), FALSE);
1496
    write_cstring (ostream, " -> ");
1392
    write_cstring(ostream, " -> ");
1497
    write_type_names (ostream, rule_result (rule), FALSE);
1393
    write_type_names(ostream, rule_result(rule), FALSE);
1498
    if (!non_local_list_is_empty (rule_non_locals (rule))) {
1394
    if (!non_local_list_is_empty(rule_non_locals(rule))) {
1499
	write_cstring (ostream, " [");
1395
	write_cstring(ostream, " [");
1500
	write_newline (ostream);
1396
	write_newline(ostream);
1501
	write_non_locals (ostream, rule_non_locals (rule));
1397
	write_non_locals(ostream, rule_non_locals(rule));
1502
	write_char (ostream, ']');
1398
	write_char(ostream, ']');
1503
    }
1399
    }
1504
    write_cstring (ostream, " = {");
1400
    write_cstring(ostream, " = {");
1505
    write_newline (ostream);
1401
    write_newline(ostream);
1506
}
1402
}
1507
 
1403
 
1508
void
1404
void
1509
write_rule PROTO_N ((ostream, rule))
1405
write_rule(OStreamP ostream, RuleP rule)
1510
	   PROTO_T (OStreamP ostream X
-
 
1511
		    RuleP    rule)
-
 
1512
{
1406
{
1513
    BoolT need_sep = FALSE;
1407
    BoolT need_sep = FALSE;
1514
    AltP  alt;
1408
    AltP  alt;
1515
 
1409
 
1516
    write_rule_lhs (ostream, rule);
1410
    write_rule_lhs(ostream, rule);
1517
    if (rule_has_empty_alt (rule)) {
1411
    if (rule_has_empty_alt(rule)) {
1518
	write_tab (ostream);
1412
	write_tab(ostream);
1519
	write_cstring (ostream, "$;");
1413
	write_cstring(ostream, "$;");
1520
	write_newline (ostream);
1414
	write_newline(ostream);
1521
	need_sep = TRUE;
1415
	need_sep = TRUE;
1522
    }
1416
    }
1523
    for (alt = rule->alt_head; alt; alt = alt_next (alt)) {
1417
    for (alt = rule->alt_head; alt; alt = alt_next(alt)) {
1524
	if (need_sep) {
1418
	if (need_sep) {
1525
	    write_cstring (ostream, "    ||");
1419
	    write_cstring(ostream, "    ||");
1526
	    write_newline (ostream);
1420
	    write_newline(ostream);
1527
	}
1421
	}
1528
	write_alt (ostream, alt);
1422
	write_alt(ostream, alt);
1529
	need_sep = TRUE;
1423
	need_sep = TRUE;
1530
    }
1424
    }
1531
    if ((alt = rule_get_handler (rule)) != NIL (AltP)) {
1425
    if ((alt = rule_get_handler(rule)) != NIL(AltP)) {
1532
	write_cstring (ostream, "    ##");
1426
	write_cstring(ostream, "    ##");
1533
	write_newline (ostream);
1427
	write_newline(ostream);
1534
	write_alt (ostream, alt);
1428
	write_alt(ostream, alt);
1535
    }
1429
    }
1536
    write_cstring (ostream, "};");
1430
    write_cstring(ostream, "};");
1537
    write_newline (ostream);
1431
    write_newline(ostream);
1538
}
1432
}
1539
 
1433
 
1540
/*--------------------------------------------------------------------------*/
1434
/*--------------------------------------------------------------------------*/
1541
 
1435
 
1542
void
1436
void
1543
rule_list_init PROTO_N ((list))
1437
rule_list_init(RuleListP list)
1544
	       PROTO_T (RuleListP list)
-
 
1545
{
1438
{
1546
    list->tail = &(list->head);
1439
    list->tail = &(list->head);
1547
}
1440
}
1548
 
1441
 
1549
void
1442
void
1550
rule_list_append PROTO_N ((list, next, tail))
1443
rule_list_append(RuleListP list, RuleP next, RuleP *tail)
1551
		 PROTO_T (RuleListP list X
-
 
1552
			  RuleP     next X
-
 
1553
			  RuleP    *tail)
-
 
1554
{
1444
{
1555
    *(list->tail) = next;
1445
    *(list->tail) = next;
1556
    list->tail    = tail;
1446
    list->tail    = tail;
1557
}
1447
}
1558
 
1448
 
1559
#ifdef FS_FAST
1449
#ifdef FS_FAST
1560
#undef rule_list_terminate
1450
#undef rule_list_terminate
1561
#endif /* defined (FS_FAST) */
1451
#endif /* defined (FS_FAST) */
1562
void
1452
void
1563
rule_list_terminate PROTO_N ((list))
1453
rule_list_terminate(RuleListP list)
1564
		    PROTO_T (RuleListP list)
-
 
1565
{
1454
{
1566
    *(list->tail) = NIL (RuleP);
1455
    *(list->tail) = NIL(RuleP);
1567
}
1456
}
1568
#ifdef FS_FAST
1457
#ifdef FS_FAST
1569
#define rule_list_terminate(r) ((*((r)->tail)) = NIL (RuleP))
1458
#define rule_list_terminate(r)	((*((r)->tail)) = NIL(RuleP))
1570
#endif /* defined (FS_FAST) */
1459
#endif /* defined (FS_FAST) */
1571
 
1460
 
1572
#ifdef FS_FAST
1461
#ifdef FS_FAST
1573
#undef rule_list_head
1462
#undef rule_list_head
1574
#endif /* defined (FS_FAST) */
1463
#endif /* defined (FS_FAST) */
1575
RuleP
1464
RuleP
1576
rule_list_head PROTO_N ((list))
1465
rule_list_head(RuleListP list)
1577
	       PROTO_T (RuleListP list)
-
 
1578
{
1466
{
1579
    return (list->head);
1467
    return(list->head);
1580
}
1468
}
1581
#ifdef FS_FAST
1469
#ifdef FS_FAST
1582
#define rule_list_head(r) ((r)->head)
1470
#define rule_list_head(r)	((r)->head)
1583
#endif /* defined (FS_FAST) */
1471
#endif /* defined (FS_FAST) */
1584

1472

1585
/*
1473
/*
1586
 * Local variables(smf):
1474
 * Local variables(smf):
1587
 * eval: (include::add-path-entry "../os-interface" "../library")
1475
 * eval: (include::add-path-entry "../os-interface" "../library")