Subversion Repositories tendra.SVN

Rev

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

Rev 2 Rev 7
Line -... Line 1...
-
 
1
/*
-
 
2
 * Copyright (c) 2002-2006 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 77... Line 107...
77
    the units of that type.  The entries correspond to the EQN macros
107
    the units of that type.  The entries correspond to the EQN macros
78
    defined in capsule.h.
108
    defined in capsule.h.
79
*/
109
*/
80
 
110
 
81
typedef struct {
111
typedef struct {
82
    CONST char *name ;
112
	CONST char *name;
83
    int labels ;
113
	int labels;
84
    int count ;
114
	int count;
85
    LIST ( BITSTREAM_P ) pres ;
115
	LIST(BITSTREAM_P)pres;
86
    LIST ( BITSTREAM_P ) units ;
116
	LIST(BITSTREAM_P)units;
87
} EQN_INFO ;
117
} EQN_INFO;
88
 
118
 
89
#define NO_EQNS		NULL_list ( BITSTREAM_P )
119
#define NO_EQNS		NULL_list(BITSTREAM_P)
90
 
120
 
91
static EQN_INFO eqns [ EQN_no ] = {
121
static EQN_INFO eqns[EQN_no] = {
92
    { LINK_tld_props, 0, 0, NO_EQNS, NO_EQNS },		/* EQN_tld */
122
    { LINK_tld_props, 0, 0, NO_EQNS, NO_EQNS },		/* EQN_tld */
93
    { LINK_version_props, 0, 1, NO_EQNS, NO_EQNS },	/* EQN_versions */
123
    { LINK_version_props, 0, 1, NO_EQNS, NO_EQNS },	/* EQN_versions */
94
    { LINK_tokdec_props, 0, 1, NO_EQNS, NO_EQNS },	/* EQN_tokdec */
124
    { LINK_tokdec_props, 0, 1, NO_EQNS, NO_EQNS },	/* EQN_tokdec */
95
    { LINK_tokdef_props, 1, 1, NO_EQNS, NO_EQNS },	/* EQN_tokdef */
125
    { LINK_tokdef_props, 1, 1, NO_EQNS, NO_EQNS },	/* EQN_tokdef */
96
    { LINK_al_tagdef_props, 1, 1, NO_EQNS, NO_EQNS },	/* EQN_aldef */
126
    { LINK_al_tagdef_props, 1, 1, NO_EQNS, NO_EQNS },	/* EQN_aldef */
Line 98... Line 128...
98
    { LINK_tagdec_props, 1, 1, NO_EQNS, NO_EQNS },	/* EQN_tagdec */
128
    { LINK_tagdec_props, 1, 1, NO_EQNS, NO_EQNS },	/* EQN_tagdec */
99
    { LINK_diag_unit, 1, 1, NO_EQNS, NO_EQNS },		/* EQN_diagdef */
129
    { LINK_diag_unit, 1, 1, NO_EQNS, NO_EQNS },		/* EQN_diagdef */
100
    { LINK_dg_comp_props, 1, 1, NO_EQNS, NO_EQNS },	/* EQN_dgcomp */
130
    { LINK_dg_comp_props, 1, 1, NO_EQNS, NO_EQNS },	/* EQN_dgcomp */
101
    { LINK_tagdef_props, 1, 1, NO_EQNS, NO_EQNS },	/* EQN_tagdef */
131
    { LINK_tagdef_props, 1, 1, NO_EQNS, NO_EQNS },	/* EQN_tagdef */
102
    { LINK_linkinfo_props, 1, 1, NO_EQNS, NO_EQNS }	/* EQN_linkinfo */
132
    { LINK_linkinfo_props, 1, 1, NO_EQNS, NO_EQNS }	/* EQN_linkinfo */
103
} ;
133
};
104
 
134
 
105
 
135
 
106
/*
136
/*
107
    TABLE OF LINKABLE TDF ENTITIES
137
    TABLE OF LINKABLE TDF ENTITIES
108
 
138
 
Line 112... Line 142...
112
    of that type (the label entry being a dummy).  The entries correspond
142
    of that type (the label entry being a dummy).  The entries correspond
113
    to the VAR macros defined in capsule.h.
143
    to the VAR macros defined in capsule.h.
114
*/
144
*/
115
 
145
 
116
typedef struct {
146
typedef struct {
117
    CONST char *name ;
147
	CONST char *name;
118
    ulong no ;
148
	ulong no;
119
    ulong sz ;
149
	ulong sz;
120
    int present ;
150
	int present;
121
    string *names ;
151
	string *names;
122
    unsigned char *uses ;
152
	unsigned char *uses;
123
    ulong *diags ;
153
	ulong *diags;
124
} VAR_INFO ;
154
} VAR_INFO;
125
 
155
 
126
static VAR_INFO vars [ VAR_total ] = {
156
static VAR_INFO vars[VAR_total] = {
127
    { LINK_tag, 0, 0, 0, NULL, NULL, NULL },		/* VAR_tag */
157
	{ LINK_tag, 0, 0, 0, NULL, NULL, NULL },	/* VAR_tag */
128
    { LINK_token, 0, 0, 0, NULL, NULL, NULL },		/* VAR_token */
158
	{ LINK_token, 0, 0, 0, NULL, NULL, NULL },	/* VAR_token */
129
    { LINK_al_tag, 0, 0, 0, NULL, NULL, NULL },		/* VAR_alignment */
159
	{ LINK_al_tag, 0, 0, 0, NULL, NULL, NULL },	/* VAR_alignment */
130
    { LINK_diag_tag, 0, 0, 0, NULL, NULL, NULL },	/* VAR_diagtag */
160
	{ LINK_diag_tag, 0, 0, 0, NULL, NULL, NULL },	/* VAR_diagtag */
131
    { LINK_dg_tag, 0, 0, 0, NULL, NULL, NULL },		/* VAR_dgtag */
161
	{ LINK_dg_tag, 0, 0, 0, NULL, NULL, NULL },	/* VAR_dgtag */
132
    { LINK_label, 0, 0, 0, NULL, NULL, NULL }		/* VAR_label */
162
	{ LINK_label, 0, 0, 0, NULL, NULL, NULL }	/* VAR_label */
133
} ;
163
};
134
 
164
 
135
 
165
 
136
/*
166
/*
137
    TYPE REPRESENTING A UNIT LINKAGE
167
    TYPE REPRESENTING A UNIT LINKAGE
138
 
168
 
Line 142... Line 172...
142
    for the number of items in the unit when this is an explicitly
172
    for the number of items in the unit when this is an explicitly
143
    created unit.
173
    created unit.
144
*/
174
*/
145
 
175
 
146
typedef struct link_tag {
176
typedef struct link_tag {
147
    ulong no [ VAR_total ] ;
177
	ulong no[VAR_total];
148
    ulong no_map [ VAR_no ] ;
178
	ulong no_map[VAR_no];
149
    ulong *map [ VAR_no ] ;
179
	ulong *map[VAR_no];
150
    ulong count ;
180
	ulong count;
151
    int create ;
181
	int create;
152
    struct link_tag *next ;
182
	struct link_tag *next;
153
} LINKAGE ;
183
} LINKAGE;
154
 
184
 
155
 
185
 
156
/*
186
/*
157
    LIST OF ALL UNIT LINKAGES
187
    LIST OF ALL UNIT LINKAGES
158
 
188
 
159
    A list of all unit linkages is maintained so that extending a list of
189
    A list of all unit linkages is maintained so that extending a list of
160
    external variables also extends all the unit linkage maps.
190
    external variables also extends all the unit linkage maps.
161
*/
191
*/
162
 
192
 
163
static LINKAGE *all_links = NULL ;
193
static LINKAGE *all_links = NULL;
164
 
194
 
165
 
195
 
166
/*
196
/*
167
    CREATE A NEW LINKAGE BITSTREAM
197
    CREATE A NEW LINKAGE BITSTREAM
168
 
198
 
169
    This routine starts a new bitstream ps and associates a linkage unit
199
    This routine starts a new bitstream ps and associates a linkage unit
170
    with it.
200
    with it.
171
*/
201
*/
172
 
202
 
173
static void start_linkage
203
static void
174
    PROTO_N ( ( ps, create ) )
-
 
175
    PROTO_T ( BITSTREAM **ps X int create )
204
start_linkage(BITSTREAM **ps, int create)
176
{
205
{
177
    /* Allocate a linkage unit */
206
	/* Allocate a linkage unit */
178
    int i ;
207
	int i;
179
    VAR_INFO *var = vars ;
208
	VAR_INFO *var = vars;
180
    LINKAGE *p = xmalloc_one ( LINKAGE ) ;
209
	LINKAGE *p = xmalloc_one(LINKAGE);
181
    for ( i = 0 ; i < VAR_no ; i++ ) {
210
	for (i = 0; i < VAR_no; i++) {
182
	ulong j, n = var->sz ;
211
		ulong j, n = var->sz;
183
	if ( n ) {
212
		if (n) {
184
	    ulong *q = xmalloc_nof ( ulong, n ) ;
213
			ulong *q = xmalloc_nof(ulong, n);
185
	    for ( j = 0 ; j < n ; j++ ) q [j] = LINK_NONE ;
214
			for (j = 0; j < n; j++) {
-
 
215
				q[j] = LINK_NONE;
-
 
216
			}
186
	    p->map [i] = q ;
217
			p->map[i] = q;
187
	} else {
218
		} else {
188
	    p->map [i] = NULL ;
219
			p->map[i] = NULL;
-
 
220
		}
-
 
221
		p->no[i] = 0;
-
 
222
		p->no_map[i] = 0;
-
 
223
		var++;
189
	}
224
	}
190
	p->no [i] = 0 ;
-
 
191
	p->no_map [i] = 0 ;
-
 
192
	var++ ;
-
 
193
    }
-
 
194
    p->no [ VAR_label ] = 0 ;
225
	p->no[VAR_label] = 0;
195
    p->count = 0 ;
226
	p->count = 0;
196
    p->create = create ;
227
	p->create = create;
197
    p->next = all_links ;
228
	p->next = all_links;
198
    all_links = p ;
229
	all_links = p;
199
 
230
 
200
    /* Start the bitstream */
231
	/* Start the bitstream */
201
    *ps = start_bitstream ( NIL ( FILE ), ( gen_ptr ) p ) ;
232
	*ps = start_bitstream(NIL(FILE), (gen_ptr)p);
202
    return ;
233
	return;
203
}
234
}
204
 
235
 
205
 
236
 
206
/*
237
/*
207
    EXTEND A VARIABLE LINKAGE TABLE
238
    EXTEND A VARIABLE LINKAGE TABLE
208
 
239
 
209
    This routine extends the variable linkage table for variable type v.
240
    This routine extends the variable linkage table for variable type v.
210
*/
241
*/
211
 
242
 
212
static void extend_linkage
243
static void
213
    PROTO_N ( ( v ) )
-
 
214
    PROTO_T ( int v )
244
extend_linkage(int v)
215
{
245
{
216
    ulong i ;
246
	ulong i;
217
    LINKAGE *q ;
247
	LINKAGE *q;
218
    VAR_INFO *var = vars + v ;
248
	VAR_INFO *var = vars + v;
219
    ulong m = var->sz ;
249
	ulong m = var->sz;
220
    ulong n = m + 100 ;
250
	ulong n = m + 100;
221
 
251
 
222
    /* Extend global linkage table */
252
	/* Extend global linkage table */
223
    string *s = var->names ;
253
	string *s = var->names;
224
    unsigned char *u = var->uses ;
254
	unsigned char *u = var->uses;
225
    ulong *d = var->diags ;
255
	ulong *d = var->diags;
226
    s = xrealloc_nof ( s, string, n ) ;
256
	s = xrealloc_nof(s, string, n);
227
    u = xrealloc_nof ( u, unsigned char, n ) ;
257
	u = xrealloc_nof(u, unsigned char, n);
228
    if ( output_diag && ( v == VAR_tag || v == VAR_token ) ) {
258
	if (output_diag && (v == VAR_tag || v == VAR_token)) {
229
	d = xrealloc_nof ( d, ulong, n ) ;
259
		d = xrealloc_nof(d, ulong, n);
230
    }
260
	}
231
    for ( i = m ; i < n ; i++ ) {
261
	for (i = m; i < n; i++) {
232
	s [i] = NULL ;
262
		s[i] = NULL;
233
	u [i] = USAGE_NONE ;
263
		u[i] = USAGE_NONE;
-
 
264
		if (d) {
234
	if ( d ) d [i] = LINK_NONE ;
265
			d[i] = LINK_NONE;
235
    }
266
		}
-
 
267
	}
236
    var->sz = n ;
268
	var->sz = n;
237
    var->names = s ;
269
	var->names = s;
238
    var->uses = u ;
270
	var->uses = u;
239
    var->diags = d ;
271
	var->diags = d;
240
 
272
 
241
    /* Extend each unit linkage table */
273
	/* Extend each unit linkage table */
242
    for ( q = all_links ; q != NULL ; q = q->next ) {
274
	for (q = all_links; q != NULL; q = q->next) {
243
	ulong *r = q->map [v] ;
275
		ulong *r = q->map[v];
244
	r = xrealloc_nof ( r, ulong, n ) ;
276
		r = xrealloc_nof(r, ulong, n);
245
	for ( i = m ; i < n ; i++ ) r [i] = LINK_NONE ;
277
		for (i = m; i < n; i++) {
-
 
278
			r[i] = LINK_NONE;
-
 
279
		}
246
	q->map [v] = r ;
280
		q->map[v] = r;
247
    }
281
	}
248
    return ;
282
	return;
249
}
283
}
250
 
284
 
251
 
285
 
252
/*
286
/*
253
    FIND AN EXTERNAL LINKAGE NUMBER
287
    FIND AN EXTERNAL LINKAGE NUMBER
254
 
288
 
255
    This routine allocates an external (capsule) linkage number for a
289
    This routine allocates an external (capsule) linkage number for a
256
    variable of type v with external name s, returning the result.
290
    variable of type v with external name s, returning the result.
257
*/
291
*/
258
 
292
 
259
ulong capsule_no
293
ulong
260
    PROTO_N ( ( s, v ) )
-
 
261
    PROTO_T ( string s X int v )
294
capsule_no(string s, int v)
262
{
295
{
263
    VAR_INFO *var = vars + v ;
296
	VAR_INFO *var = vars + v;
264
    ulong n = ( var->no )++ ;
297
	ulong n = (var->no) ++;
-
 
298
	if (n >= var->sz) {
265
    if ( n >= var->sz ) extend_linkage ( v ) ;
299
		extend_linkage(v);
-
 
300
	}
266
    var->uses [n] = USAGE_USE ;
301
	var->uses[n] = USAGE_USE;
267
    var->names [n] = s ;
302
	var->names[n] = s;
268
    var->present = 1 ;
303
	var->present = 1;
269
    return ( n | LINK_EXTERN ) ;
304
	return (n | LINK_EXTERN);
270
}
305
}
271
 
306
 
272
 
307
 
273
/*
308
/*
274
    SET AN EXTERNAL LINKAGE NAME
309
    SET AN EXTERNAL LINKAGE NAME
275
 
310
 
276
    This routine sets the external name for the variable of type v with
311
    This routine sets the external name for the variable of type v with
277
    external linkage number n to be the contents of ps, allocating a new
312
    external linkage number n to be the contents of ps, allocating a new
278
    variable if n is LINK_NONE.  It returns the value of n and assigns
313
    variable if n is LINK_NONE.  It returns the value of n and assigns
279
    the old variable name to ps.
314
    the old variable name to ps.
280
*/
315
*/
281
 
316
 
282
ulong capsule_name
317
ulong
283
    PROTO_N ( ( n, ps, v ) )
-
 
284
    PROTO_T ( ulong n X string *ps X int v )
318
capsule_name(ulong n, string *ps, int v)
285
{
319
{
286
    string s = *ps ;
320
	string s = *ps;
287
    if ( n == LINK_NONE ) {
321
	if (n == LINK_NONE) {
288
	n = capsule_no ( s, v ) ;
322
		n = capsule_no(s, v);
289
    } else {
323
	} else {
290
	VAR_INFO *var = vars + v ;
324
		VAR_INFO *var = vars + v;
291
	ulong m = ( n & ~LINK_EXTERN ) ;
325
		ulong m = (n & ~LINK_EXTERN);
292
	ASSERT ( n & LINK_EXTERN ) ;
326
		ASSERT(n & LINK_EXTERN);
293
	*ps = var->names [m] ;
327
		*ps = var->names[m];
294
	var->names [m] = s ;
328
		var->names[m] = s;
295
    }
329
	}
296
    return ( n ) ;
330
	return (n);
297
}
331
}
298
 
332
 
299
 
333
 
300
/*
334
/*
301
    ASSIGN AN EXTERNAL LINKAGE NUMBER
335
    ASSIGN AN EXTERNAL LINKAGE NUMBER
302
 
336
 
Line 304... Line 338...
304
    identifier id of variable type v.  It returns false if this number
338
    identifier id of variable type v.  It returns false if this number
305
    has already been allocated.  Note that id cannot be made external
339
    has already been allocated.  Note that id cannot be made external
306
    after it has been made internal.
340
    after it has been made internal.
307
*/
341
*/
308
 
342
 
309
int capsule_id
343
int
310
    PROTO_N ( ( id, v ) )
-
 
311
    PROTO_T ( IDENTIFIER id X int v )
344
capsule_id(IDENTIFIER id, int v)
312
{
345
{
313
    int r ;
346
	int r;
314
    IDENTIFIER lid = DEREF_id ( id_alias ( id ) ) ;
347
	IDENTIFIER lid = DEREF_id(id_alias(id));
315
    ulong n = DEREF_ulong ( id_no ( lid ) ) ;
348
	ulong n = DEREF_ulong(id_no(lid));
316
    if ( n == LINK_NONE ) {
349
	if (n == LINK_NONE) {
317
	/* Not yet given a number */
350
		/* Not yet given a number */
318
	string s = mangle_name ( lid, v, 0 ) ;
351
		string s = mangle_name(lid, v, 0);
319
	n = capsule_no ( s, v ) ;
352
		n = capsule_no(s, v);
320
	COPY_ulong ( id_no ( lid ), n ) ;
353
		COPY_ulong(id_no(lid), n);
321
	COPY_ulong ( id_no ( id ), n ) ;
354
		COPY_ulong(id_no(id), n);
322
	r = 1 ;
355
		r = 1;
323
    } else {
356
	} else {
324
	ASSERT ( n & LINK_EXTERN ) ;
357
		ASSERT(n & LINK_EXTERN);
325
	r = 0 ;
358
		r = 0;
326
    }
359
	}
327
    return ( r ) ;
360
	return (r);
328
}
361
}
329
 
362
 
330
 
363
 
331
/*
364
/*
332
    FIND AN INTERNAL LINKAGE NUMBER
365
    FIND AN INTERNAL LINKAGE NUMBER
Line 334... Line 367...
334
    This routine allocates an internal (unit) linkage number in the unit
367
    This routine allocates an internal (unit) linkage number in the unit
335
    corresponding to bs to the external (capsule) variable number n of
368
    corresponding to bs to the external (capsule) variable number n of
336
    type v.
369
    type v.
337
*/
370
*/
338
 
371
 
339
ulong link_no
372
ulong
340
    PROTO_N ( ( bs, n, v ) )
-
 
341
    PROTO_T ( BITSTREAM *bs X ulong n X int v )
373
link_no(BITSTREAM *bs, ulong n, int v)
342
{
374
{
343
    LINKAGE *lnk = ( LINKAGE * ) bs->link ;
375
	LINKAGE *lnk = (LINKAGE *)bs->link;
344
    ulong m = ( n & ~LINK_EXTERN ) ;
376
	ulong m = (n & ~LINK_EXTERN);
345
    n = lnk->map [v] [m] ;
377
	n = lnk->map[v][m];
346
    if ( n == LINK_NONE ) {
378
	if (n == LINK_NONE) {
347
	/* Does not have unit number */
379
		/* Does not have unit number */
348
	n = ( lnk->no [v] )++ ;
380
		n = (lnk->no[v]) ++;
349
	lnk->map [v] [m] = n ;
381
		lnk->map[v][m] = n;
350
	( lnk->no_map [v] )++ ;
382
		(lnk->no_map[v]) ++;
351
	vars [v].present = 1 ;
383
		vars[v].present = 1;
352
    }
384
	}
353
    return ( n ) ;
385
	return (n);
354
}
386
}
355
 
387
 
356
 
388
 
357
/*
389
/*
358
    ASSIGN AN INTERNAL LINKAGE NUMBER
390
    ASSIGN AN INTERNAL LINKAGE NUMBER
Line 360... Line 392...
360
    This routine allocates an internal (unit) linkage number to the
392
    This routine allocates an internal (unit) linkage number to the
361
    identifier id of variable type v within the unit corresponding to bs.
393
    identifier id of variable type v within the unit corresponding to bs.
362
    v can denote a label.  The corresponding number is returned.  Note
394
    v can denote a label.  The corresponding number is returned.  Note
363
    that unless id has previously been made external then it can be
395
    that unless id has previously been made external then it can be
364
    internal to at most one unit.
396
    internal to at most one unit.
365
*/
397
*/
366
 
398
 
367
ulong unit_no
399
ulong
368
    PROTO_N ( ( bs, id, v, def ) )
-
 
369
    PROTO_T ( BITSTREAM *bs X IDENTIFIER id X int v X int def )
400
unit_no(BITSTREAM *bs, IDENTIFIER id, int v, int def)
370
{
401
{
371
    ulong n ;
402
	ulong n;
372
    if ( IS_NULL_id ( id ) ) {
403
	if (IS_NULL_id(id)) {
373
	/* Allow anonymous identifiers */
404
		/* Allow anonymous identifiers */
374
	LINKAGE *lnk = ( LINKAGE * ) bs->link ;
405
		LINKAGE *lnk = (LINKAGE *)bs->link;
375
	n = ( lnk->no [v] )++ ;
406
		n = (lnk->no[v]) ++;
376
	vars [v].present = 1 ;
407
		vars[v].present = 1;
377
    } else {
408
	} else {
378
	IDENTIFIER lid = DEREF_id ( id_alias ( id ) ) ;
409
		IDENTIFIER lid = DEREF_id(id_alias(id));
379
	n = DEREF_ulong ( id_no ( lid ) ) ;
410
		n = DEREF_ulong(id_no(lid));
380
	if ( n == LINK_NONE ) {
411
		if (n == LINK_NONE) {
381
	    /* Not yet given a number */
412
			/* Not yet given a number */
382
	    LINKAGE *lnk = ( LINKAGE * ) bs->link ;
413
			LINKAGE *lnk = (LINKAGE *)bs->link;
383
	    n = ( lnk->no [v] )++ ;
414
			n = (lnk->no[v]) ++;
384
	    COPY_ulong ( id_no ( lid ), n ) ;
415
			COPY_ulong(id_no(lid), n);
385
	    COPY_ulong ( id_no ( id ), n ) ;
416
			COPY_ulong(id_no(id), n);
386
	    vars [v].present = 1 ;
417
			vars[v].present = 1;
387
	    if ( !def ) {
418
			if (!def) {
388
		/* Shouldn't happen */
419
				/* Shouldn't happen */
389
		LOCATION loc ;
420
				LOCATION loc;
390
		DEREF_loc ( id_loc ( id ), loc ) ;
421
				DEREF_loc(id_loc(id), loc);
391
		report ( loc, ERR_token_scope ( id ) ) ;
422
				report(loc, ERR_token_scope(id));
392
	    }
423
			}
393
	} else {
424
		} else {
394
	    if ( n == LINK_TOKDEF ) {
425
			if (n == LINK_TOKDEF) {
395
		/* Recursively defined token */
426
				/* Recursively defined token */
396
		LOCATION loc ;
427
				LOCATION loc;
397
		DEREF_loc ( id_loc ( id ), loc ) ;
428
				DEREF_loc(id_loc(id), loc);
398
		report ( loc, ERR_token_recursive ( id ) ) ;
429
				report(loc, ERR_token_recursive(id));
399
		n = last_params [ DUMMY_token ] ;
430
				n = last_params[DUMMY_token];
400
		COPY_ulong ( id_no ( id ), n ) ;
431
				COPY_ulong(id_no(id), n);
401
	    }
432
			}
402
	    if ( n & LINK_EXTERN ) {
433
			if (n & LINK_EXTERN) {
403
		/* Already has capsule number */
434
				/* Already has capsule number */
404
		n = link_no ( bs, n, v ) ;
435
				n = link_no(bs, n, v);
405
	    }
436
			}
406
	}
437
		}
407
    }
438
	}
408
    return ( n ) ;
439
	return (n);
409
}
440
}
410
 
441
 
411
 
442
 
412
/*
443
/*
413
    CLEAR AN IDENTIFIER LINKAGE
444
    CLEAR AN IDENTIFIER LINKAGE
414
 
445
 
415
    This routine clears the identifier linkage for id.
446
    This routine clears the identifier linkage for id.
416
*/
447
*/
417
 
448
 
418
void clear_no
449
void
419
    PROTO_N ( ( id ) )
-
 
420
    PROTO_T ( IDENTIFIER id )
450
clear_no(IDENTIFIER id)
421
{
451
{
422
    if ( !IS_NULL_id ( id ) ) {
452
	if (!IS_NULL_id(id)) {
423
	IDENTIFIER lid = DEREF_id ( id_alias ( id ) ) ;
453
		IDENTIFIER lid = DEREF_id(id_alias(id));
424
	DECL_SPEC ds = DEREF_dspec ( id_storage ( id ) ) ;
454
		DECL_SPEC ds = DEREF_dspec(id_storage(id));
425
	COPY_dspec ( id_storage ( id ), ( ds & ~dspec_done ) ) ;
455
		COPY_dspec(id_storage(id), (ds & ~dspec_done));
426
	COPY_ulong ( id_no ( id ), LINK_NONE ) ;
456
		COPY_ulong(id_no(id), LINK_NONE);
427
	if ( !EQ_id ( lid, id ) ) {
457
		if (!EQ_id(lid, id)) {
428
	    ds = DEREF_dspec ( id_storage ( lid ) ) ;
458
			ds = DEREF_dspec(id_storage(lid));
429
	    COPY_dspec ( id_storage ( lid ), ( ds & ~dspec_done ) ) ;
459
			COPY_dspec(id_storage(lid), (ds & ~dspec_done));
430
	    COPY_ulong ( id_no ( lid ), LINK_NONE ) ;
460
			COPY_ulong(id_no(lid), LINK_NONE);
431
	}
461
		}
432
    }
462
	}
433
    return ;
463
	return;
434
}
464
}
435
 
465
 
436
 
466
 
437
/*
467
/*
438
    SET A DIAGNOSTIC TAG NUMBER
468
    SET A DIAGNOSTIC TAG NUMBER
439
 
469
 
440
    This routine sets the diagnostic tag associated with external identifier
470
    This routine sets the diagnostic tag associated with external identifier
441
    id of type v to be m.
471
    id of type v to be m.
442
*/
472
*/
443
 
473
 
444
void set_diag_tag
474
void
445
    PROTO_N ( ( id, v, m ) )
-
 
446
    PROTO_T ( IDENTIFIER id X int v X ulong m )
475
set_diag_tag(IDENTIFIER id, int v, ulong m)
447
{
476
{
448
    ulong n = DEREF_ulong ( id_no ( id ) ) ;
477
	ulong n = DEREF_ulong(id_no(id));
449
    if ( n == LINK_NONE ) {
478
	if (n == LINK_NONE) {
450
	IGNORE capsule_id ( id, v ) ;
479
		IGNORE capsule_id(id, v);
451
	CONS_id ( id, pending_funcs, pending_funcs ) ;
480
		CONS_id(id, pending_funcs, pending_funcs);
452
	n = DEREF_ulong ( id_no ( id ) ) ;
481
		n = DEREF_ulong(id_no(id));
453
    }
482
	}
454
    n &= ~LINK_EXTERN ;
483
	n &= ~LINK_EXTERN;
455
    ASSERT ( vars [v].diags ) ;
484
	ASSERT(vars[v].diags);
456
    vars [v].diags [n] = m ;
485
	vars[v].diags[n] = m;
457
    return ;
486
	return;
458
}
487
}
459
 
488
 
460
 
489
 
461
/*
490
/*
462
    GET A DIAGNOSTIC TAG NUMBER
491
    GET A DIAGNOSTIC TAG NUMBER
463
 
492
 
464
    This routine gets the diagnostic tag associated with external identifier
493
    This routine gets the diagnostic tag associated with external identifier
465
    id of type v.
494
    id of type v.
466
*/
495
*/
467
 
496
 
468
ulong get_diag_tag
497
ulong
469
    PROTO_N ( ( id, v ) )
-
 
470
    PROTO_T ( IDENTIFIER id X int v )
498
get_diag_tag(IDENTIFIER id, int v)
471
{
499
{
472
    ulong n = DEREF_ulong ( id_no ( id ) ) ;
500
	ulong n = DEREF_ulong(id_no(id));
473
    if ( n == LINK_NONE ) return ( LINK_NONE ) ;
501
	if (n == LINK_NONE) {
-
 
502
		return (LINK_NONE);
-
 
503
	}
474
    n &= ~LINK_EXTERN ;
504
	n &= ~LINK_EXTERN;
475
    ASSERT ( vars [v].diags ) ;
505
	ASSERT(vars[v].diags);
476
    return ( vars [v].diags [n] ) ;
506
	return (vars[v].diags[n]);
477
}
507
}
478
 
508
 
479
 
509
 
480
/*
510
/*
481
    FIND THE NUMBER OF LABELS IN A UNIT
511
    FIND THE NUMBER OF LABELS IN A UNIT
482
 
512
 
483
    This routine returns the number of labels in the unit corresponding
513
    This routine returns the number of labels in the unit corresponding
484
    to the bitstream bs.
514
    to the bitstream bs.
485
*/
515
*/
486
 
516
 
487
ulong no_labels
517
ulong
488
    PROTO_N ( ( bs ) )
-
 
489
    PROTO_T ( BITSTREAM *bs )
518
no_labels(BITSTREAM *bs)
490
{
519
{
491
    LINKAGE *lnk = ( LINKAGE * ) bs->link ;
520
	LINKAGE *lnk = (LINKAGE *)bs->link;
492
    return ( lnk->no [ VAR_label ] ) ;
521
	return (lnk->no[VAR_label]);
493
}
522
}
494
 
523
 
495
 
524
 
496
/*
525
/*
497
    RECORD USAGE INFORMATION
526
    RECORD USAGE INFORMATION
498
 
527
 
499
    This routine records the usage information u for the external variable
528
    This routine records the usage information u for the external variable
500
    of type v with number n.
529
    of type v with number n.
501
*/
530
*/
502
 
531
 
503
void record_usage
532
void
504
    PROTO_N ( ( n, v, u ) )
-
 
505
    PROTO_T ( ulong n X int v X unsigned u )
533
record_usage(ulong n, int v, unsigned u)
506
{
534
{
507
    ulong m = ( n & ~LINK_EXTERN ) ;
535
	ulong m = (n & ~LINK_EXTERN);
508
    unsigned char *pw = vars [v].uses + m ;
536
	unsigned char *pw = vars[v].uses + m;
509
    unsigned w = ( unsigned ) *pw ;
537
	unsigned w = (unsigned)*pw;
510
    *pw = ( unsigned char ) ( w | u ) ;
538
	*pw = (unsigned char)(w | u);
511
    return ;
539
	return;
512
}
540
}
513
 
541
 
514
 
542
 
515
/*
543
/*
516
    FIND USAGE INFORMATION
544
    FIND USAGE INFORMATION
517
 
545
 
518
    This routine finds the usage information for the external variable of
546
    This routine finds the usage information for the external variable of
519
    type v with number n.
547
    type v with number n.
520
*/
548
*/
521
 
549
 
522
unsigned find_usage
550
unsigned
523
    PROTO_N ( ( n, v ) )
-
 
524
    PROTO_T ( ulong n X int v )
551
find_usage(ulong n, int v)
525
{
552
{
526
    ulong m = ( n & ~LINK_EXTERN ) ;
553
	ulong m = (n & ~LINK_EXTERN);
527
    unsigned u = ( unsigned ) vars [v].uses [m] ;
554
	unsigned u = (unsigned)vars[v].uses[m];
528
    return ( u ) ;
555
	return (u);
529
}
556
}
530
 
557
 
531
 
558
 
532
/*
559
/*
533
    CLEAR USAGE INFORMATION
560
    CLEAR USAGE INFORMATION
534
 
561
 
535
    This routine clears the usage information for the external variable
562
    This routine clears the usage information for the external variable
536
    of type v with number n.
563
    of type v with number n.
537
*/
564
*/
538
 
565
 
539
void clear_usage
566
void
540
    PROTO_N ( ( n, v ) )
-
 
541
    PROTO_T ( ulong n X int v )
567
clear_usage(ulong n, int v)
542
{
568
{
543
    ulong m = ( n & ~LINK_EXTERN ) ;
569
	ulong m = (n & ~LINK_EXTERN);
544
    vars [v].uses [m] = USAGE_NONE ;
570
	vars[v].uses[m] = USAGE_NONE;
545
    return ;
571
	return;
546
}
572
}
547
 
573
 
548
 
574
 
549
/*
575
/*
550
    INCREMENT A LINKAGE COUNTER
576
    INCREMENT A LINKAGE COUNTER
Line 552... Line 578...
552
    This routine increments the linkage counter associated with the
578
    This routine increments the linkage counter associated with the
553
    bitstream bs.  This is used to keep track of the number of tag
579
    bitstream bs.  This is used to keep track of the number of tag
554
    declarations, or similar, within a unit.
580
    declarations, or similar, within a unit.
555
*/
581
*/
556
 
582
 
557
void count_item
583
void
558
    PROTO_N ( ( bs ) )
-
 
559
    PROTO_T ( BITSTREAM *bs )
584
count_item(BITSTREAM *bs)
560
{
585
{
561
    LINKAGE *lnk = ( LINKAGE * ) bs->link ;
586
	LINKAGE *lnk = (LINKAGE *)bs->link;
562
    ( lnk->count )++ ;
587
	(lnk->count)++;
563
    return ;
588
	return;
564
}
589
}
565
 
590
 
566
 
591
 
567
/*
592
/*
568
    ADD A UNIT TO A CAPSULE
593
    ADD A UNIT TO A CAPSULE
Line 570... Line 595...
570
    This routine adds the unit given by the bitstream bs to the list of
595
    This routine adds the unit given by the bitstream bs to the list of
571
    units of type u.  If the associate unit count is zero then the unit
596
    units of type u.  If the associate unit count is zero then the unit
572
    is not added.
597
    is not added.
573
*/
598
*/
574
 
599
 
575
static void add_unit
600
static void
576
    PROTO_N ( ( u, bs, ps ) )
-
 
577
    PROTO_T ( int u X BITSTREAM *bs X BITSTREAM *ps )
601
add_unit(int u, BITSTREAM *bs, BITSTREAM *ps)
578
{
602
{
579
    if ( bs ) {
603
	if (bs) {
580
	LINKAGE *lnk = ( LINKAGE * ) bs->link ;
604
		LINKAGE *lnk = (LINKAGE *)bs->link;
581
	if ( lnk == NULL || lnk->count || ps ) {
605
		if (lnk == NULL || lnk->count || ps) {
582
	    EQN_INFO *eqn = eqns + u ;
606
			EQN_INFO *eqn = eqns + u;
583
	    LIST ( BITSTREAM_P ) us = eqn->units ;
607
			LIST(BITSTREAM_P)us = eqn->units;
584
	    LIST ( BITSTREAM_P ) vs = eqn->pres ;
608
			LIST(BITSTREAM_P)vs = eqn->pres;
585
	    CONS_bits ( bs, us, us ) ;
609
			CONS_bits(bs, us, us);
586
	    CONS_bits ( ps, vs, vs ) ;
610
			CONS_bits(ps, vs, vs);
587
	    eqn->units = us ;
611
			eqn->units = us;
588
	    eqn->pres = vs ;
612
			eqn->pres = vs;
-
 
613
		}
589
	}
614
	}
590
    }
-
 
591
    return ;
615
	return;
592
}
616
}
593
 
617
 
594
 
618
 
595
/*
619
/*
596
    STANDARD BITSTREAMS
620
    STANDARD BITSTREAMS
597
 
621
 
598
    These bitstreams represent standard units within the TDF capsule.
622
    These bitstreams represent standard units within the TDF capsule.
599
*/
623
*/
600
 
624
 
601
BITSTREAM *tokdec_unit = NULL ;
625
BITSTREAM *tokdec_unit = NULL;
602
BITSTREAM *tokdef_unit = NULL ;
626
BITSTREAM *tokdef_unit = NULL;
603
BITSTREAM *aldef_unit = NULL ;
627
BITSTREAM *aldef_unit = NULL;
604
BITSTREAM *tagdec_unit = NULL ;
628
BITSTREAM *tagdec_unit = NULL;
605
BITSTREAM *tagdef_unit = NULL ;
629
BITSTREAM *tagdef_unit = NULL;
606
BITSTREAM *linkinfo_unit = NULL ;
630
BITSTREAM *linkinfo_unit = NULL;
607
BITSTREAM *diagdef_unit = NULL ;
631
BITSTREAM *diagdef_unit = NULL;
608
BITSTREAM *diagtype_unit = NULL ;
632
BITSTREAM *diagtype_unit = NULL;
609
BITSTREAM *diagcomp_unit = NULL ;
633
BITSTREAM *diagcomp_unit = NULL;
610
static BITSTREAM *diagcomp_pre = NULL ;
634
static BITSTREAM *diagcomp_pre = NULL;
611
static int written_capsule = 0 ;
635
static int written_capsule = 0;
612
 
636
 
613
 
637
 
614
/*
638
/*
615
    DYNAMIC INITIALISATION AND TERMINATION FUNCTIONS
639
    DYNAMIC INITIALISATION AND TERMINATION FUNCTIONS
616
 
640
 
617
    These bitstreams are used to build up the bodies of the dynamic
641
    These bitstreams are used to build up the bodies of the dynamic
618
    initialisation and termination functions.  A count of the number
642
    initialisation and termination functions.  A count of the number
619
    of statements in each is maintained.
643
    of statements in each is maintained.
620
*/
644
*/
621
 
645
 
622
BITSTREAM *init_func = NULL ;
646
BITSTREAM *init_func = NULL;
623
BITSTREAM *term_func = NULL ;
647
BITSTREAM *term_func = NULL;
624
BITSTREAM *term_static_func = NULL ;
648
BITSTREAM *term_static_func = NULL;
625
ulong init_no = 0 ;
649
ulong init_no = 0;
626
ulong term_no = 0 ;
650
ulong term_no = 0;
627
 
651
 
628
 
652
 
629
/*
653
/*
630
    CREATE A LINKER INFORMATION UNIT
654
    CREATE A LINKER INFORMATION UNIT
631
 
655
 
632
    This routine creates a linker information unit containing just a tld
656
    This routine creates a linker information unit containing just a tld
633
    version number.  The usage information for the external variables is
657
    version number.  The usage information for the external variables is
634
    added at a subsequent stage.
658
    added at a subsequent stage.
635
*/
659
*/
636
 
660
 
637
static BITSTREAM *make_tld_unit
661
static BITSTREAM *
638
    PROTO_Z ()
-
 
639
{
-
 
640
    BITSTREAM *bs = start_bitstream ( NIL ( FILE ), NULL_gen_ptr ) ;
-
 
641
    ENC_INT ( bs, 1 ) ;
-
 
642
    return ( bs ) ;
662
make_tld_unit(void)
643
}
-
 
644
 
-
 
645
 
-
 
646
/*
-
 
647
    CREATE A VERSIONS UNIT
-
 
648
 
-
 
649
    This routine creates a versions unit containing a single version
-
 
650
    which gives the TDF version number.
-
 
651
*/
-
 
652
 
-
 
653
static BITSTREAM *make_version_unit
-
 
654
    PROTO_Z ()
-
 
655
{
663
{
-
 
664
	BITSTREAM *bs = start_bitstream(NIL(FILE), NULL_gen_ptr);
-
 
665
	ENC_INT(bs, 1);
-
 
666
	return (bs);
-
 
667
}
-
 
668
 
-
 
669
 
-
 
670
/*
-
 
671
    CREATE A VERSIONS UNIT
-
 
672
 
-
 
673
    This routine creates a versions unit containing a single version
-
 
674
    which gives the TDF version number.
-
 
675
*/
-
 
676
 
-
 
677
static BITSTREAM *
-
 
678
make_version_unit(void)
-
 
679
{
656
    BITSTREAM *bs ;
680
	BITSTREAM *bs;
657
    start_linkage ( &bs, 1 ) ;
681
	start_linkage(&bs, 1);
658
    ENC_make_version ( bs ) ;
682
	ENC_make_version(bs);
659
    bs = enc_version ( bs ) ;
683
	bs = enc_version(bs);
660
    count_item ( bs ) ;
684
	count_item(bs);
661
    if ( output_all ) {
685
	if (output_all) {
662
	/* Output compiler version number */
686
		/* Output compiler version number */
663
	string vers = report_version ( 0 ) ;
687
		string vers = report_version(0);
664
	ENC_user_info ( bs ) ;
688
		ENC_user_info(bs);
665
	ENC_make_string ( bs ) ;
689
		ENC_make_string(bs);
666
	bs = enc_ustring ( bs, vers ) ;
690
		bs = enc_ustring(bs, vers);
667
	count_item ( bs ) ;
691
		count_item(bs);
668
    }
692
	}
669
    return ( bs ) ;
693
	return (bs);
670
}
694
}
671
 
695
 
672
 
696
 
673
/*
697
/*
674
    CREATE ALL CAPSULE UNITS
698
    CREATE ALL CAPSULE UNITS
675
 
699
 
676
    This routine creates or completes all the units comprising the TDF
700
    This routine creates or completes all the units comprising the TDF
677
    capsule.
701
    capsule.
678
*/
702
*/
679
 
703
 
680
static void make_capsule_units
704
static void
681
    PROTO_Z ()
705
make_capsule_units(void)
682
{
706
{
683
    BITSTREAM *bs ;
707
	BITSTREAM *bs;
684
    init_diag () ;
708
	init_diag();
685
    bs = make_version_unit () ;
709
	bs = make_version_unit();
686
    add_unit ( EQN_versions, bs, NIL ( BITSTREAM ) ) ;
710
	add_unit(EQN_versions, bs, NIL(BITSTREAM));
687
    enc_dynamic_init () ;
711
	enc_dynamic_init();
688
    add_unit ( EQN_tokdec, tokdec_unit, NIL ( BITSTREAM ) ) ;
712
	add_unit(EQN_tokdec, tokdec_unit, NIL(BITSTREAM));
689
    add_unit ( EQN_tokdef, tokdef_unit, NIL ( BITSTREAM ) ) ;
713
	add_unit(EQN_tokdef, tokdef_unit, NIL(BITSTREAM));
690
    add_unit ( EQN_aldef, aldef_unit, NIL ( BITSTREAM ) ) ;
714
	add_unit(EQN_aldef, aldef_unit, NIL(BITSTREAM));
691
    add_unit ( EQN_diagtype, diagtype_unit, NIL ( BITSTREAM ) ) ;
715
	add_unit(EQN_diagtype, diagtype_unit, NIL(BITSTREAM));
692
    add_unit ( EQN_tagdec, tagdec_unit, NIL ( BITSTREAM ) ) ;
716
	add_unit(EQN_tagdec, tagdec_unit, NIL(BITSTREAM));
693
    add_unit ( EQN_diagdef, diagdef_unit, NIL ( BITSTREAM ) ) ;
717
	add_unit(EQN_diagdef, diagdef_unit, NIL(BITSTREAM));
694
    add_unit ( EQN_dgcomp, diagcomp_unit, diagcomp_pre ) ;
718
	add_unit(EQN_dgcomp, diagcomp_unit, diagcomp_pre);
695
    add_unit ( EQN_tagdef, tagdef_unit, NIL ( BITSTREAM ) ) ;
719
	add_unit(EQN_tagdef, tagdef_unit, NIL(BITSTREAM));
696
    add_unit ( EQN_linkinfo, linkinfo_unit, NIL ( BITSTREAM ) ) ;
720
	add_unit(EQN_linkinfo, linkinfo_unit, NIL(BITSTREAM));
697
    return ;
721
	return;
698
}
722
}
699
 
723
 
700
 
724
 
701
/*
725
/*
702
    WRITE AN EXTERNAL NAME
726
    WRITE AN EXTERNAL NAME
703
 
727
 
704
    This routine writes the external name s to the bitstream bs.  Spaces
728
    This routine writes the external name s to the bitstream bs.  Spaces
705
    are used to designate the components of unique identifiers.
729
    are used to designate the components of unique identifiers.
706
*/
730
*/
707
 
731
 
708
static BITSTREAM *enc_name
732
static BITSTREAM *
709
    PROTO_N ( ( bs, s, v ) )
-
 
710
    PROTO_T ( BITSTREAM *bs X string s X int v )
733
enc_name(BITSTREAM *bs, string s, int v)
711
{
734
{
712
    string t = s ;
735
	string t = s;
713
    unsigned u = 0 ;
736
	unsigned u = 0;
714
    unsigned long n ;
737
	unsigned long n;
715
    for ( ; ; ) {
738
	for (;;) {
716
	t = ustrchr ( t, ' ' ) ;
739
		t = ustrchr(t, ' ');
717
	u++ ;
740
		u++;
718
	if ( t == NULL ) break ;
-
 
719
	t++ ;
-
 
720
    }
-
 
721
    if ( u == 1 ) {
-
 
722
	/* Simple identifiers */
-
 
723
	n = ( unsigned long ) ustrlen ( s ) ;
-
 
724
	if ( v == VAR_tag && n > mangle_length ) {
-
 
725
	    n = mangle_length ;
-
 
726
	}
-
 
727
	ENC_string_extern ( bs ) ;
-
 
728
	ENC_ALIGN ( bs ) ;
-
 
729
	ENC_IDENT ( bs, s, n ) ;
-
 
730
    } else {
-
 
731
	/* Unique identifiers */
-
 
732
	ENC_unique_extern ( bs ) ;
-
 
733
	ENC_ALIGN ( bs ) ;
-
 
734
	ENC_SLIST ( bs, u ) ;
-
 
735
	for ( ; ; ) {
-
 
736
	    t = ustrchr ( s, ' ' ) ;
-
 
737
	    if ( t == NULL ) {
741
		if (t == NULL) {
738
		n = ( unsigned long ) ustrlen ( s ) ;
-
 
739
		ENC_IDENT ( bs, s, n ) ;
-
 
740
		break ;
742
			break;
741
	    }
743
		}
742
	    n = ( unsigned long ) ( t - s ) ;
-
 
743
	    ENC_IDENT ( bs, s, n ) ;
-
 
744
	    s = t + 1 ;
744
		t++;
745
	}
745
	}
-
 
746
	if (u == 1) {
-
 
747
		/* Simple identifiers */
-
 
748
		n = (unsigned long)ustrlen(s);
-
 
749
		if (v == VAR_tag && n > mangle_length) {
-
 
750
			n = mangle_length;
-
 
751
		}
-
 
752
		ENC_string_extern(bs);
-
 
753
		ENC_ALIGN(bs);
-
 
754
		ENC_IDENT(bs, s, n);
-
 
755
	} else {
-
 
756
		/* Unique identifiers */
-
 
757
		ENC_unique_extern(bs);
-
 
758
		ENC_ALIGN(bs);
-
 
759
		ENC_SLIST(bs, u);
-
 
760
		for (;;) {
-
 
761
			t = ustrchr(s, ' ');
-
 
762
			if (t == NULL) {
-
 
763
				n = (unsigned long)ustrlen(s);
-
 
764
				ENC_IDENT(bs, s, n);
-
 
765
				break;
746
    }
766
			}
-
 
767
			n = (unsigned long)(t - s);
-
 
768
			ENC_IDENT(bs, s, n);
-
 
769
			s = t + 1;
-
 
770
		}
-
 
771
	}
747
    return ( bs ) ;
772
	return (bs);
748
}
773
}
749
 
774
 
750
 
775
 
751
/*
776
/*
752
    WRITE MAIN CAPSULE BODY
777
    WRITE MAIN CAPSULE BODY
753
 
778
 
754
    This routine writes the main body of the output TDF capsule to the
779
    This routine writes the main body of the output TDF capsule to the
755
    bitstream bs.
780
    bitstream bs.
756
*/
781
*/
757
 
782
 
758
static BITSTREAM *write_capsule_body
783
static BITSTREAM *
759
    PROTO_N ( ( bs ) )
-
 
760
    PROTO_T ( BITSTREAM *bs )
784
write_capsule_body(BITSTREAM *bs)
761
{
785
{
762
    int i, j ;
786
	int i, j;
763
    EQN_INFO *eqn ;
787
	EQN_INFO *eqn;
764
    VAR_INFO *var ;
788
	VAR_INFO *var;
765
    ulong no_eqns = 0 ;
789
	ulong no_eqns = 0;
766
    ulong no_vars = 0 ;
790
	ulong no_vars = 0;
767
    BITSTREAM *ts, *to ;
791
	BITSTREAM *ts, *to;
768
 
792
 
769
    /* Call capsule construction routines */
793
	/* Call capsule construction routines */
770
    make_capsule_units () ;
794
	make_capsule_units();
771
 
795
 
772
    /* Count the number of variables */
796
	/* Count the number of variables */
773
    var = vars ;
797
	var = vars;
774
    for ( i = 0 ; i < VAR_no ; i++ ) {
798
	for (i = 0; i < VAR_no; i++) {
775
	if ( var->present ) no_vars++ ;
799
		if (var->present) {
-
 
800
			no_vars++;
-
 
801
		}
776
	var++ ;
802
		var++;
777
    }
803
	}
778
 
804
 
779
    /* Construct linker information unit */
805
	/* Construct linker information unit */
780
    if ( no_vars ) {
806
	if (no_vars) {
781
	ts = make_tld_unit () ;
807
		ts = make_tld_unit();
782
	add_unit ( EQN_tld, ts, NIL ( BITSTREAM ) ) ;
808
		add_unit(EQN_tld, ts, NIL(BITSTREAM));
783
    } else {
809
	} else {
784
	ts = NULL ;
810
		ts = NULL;
785
    }
811
	}
786
    to = ts ;
812
	to = ts;
787
 
813
 
788
    /* Count the number of equations */
814
	/* Count the number of equations */
789
    eqn = eqns ;
815
	eqn = eqns;
790
    for ( i = 0 ; i < EQN_no ; i++ ) {
816
	for (i = 0; i < EQN_no; i++) {
791
	if ( !IS_NULL_list ( eqn->units ) ) no_eqns++ ;
817
		if (!IS_NULL_list(eqn->units)) {
-
 
818
			no_eqns++;
-
 
819
		}
792
	eqn++ ;
820
		eqn++;
793
    }
821
	}
794
 
822
 
795
    /* Output the equation names */
823
	/* Output the equation names */
796
    eqn = eqns ;
824
	eqn = eqns;
797
    ENC_SLIST ( bs, no_eqns ) ;
825
	ENC_SLIST(bs, no_eqns);
798
    for ( i = 0 ; i < EQN_no ; i++ ) {
826
	for (i = 0; i < EQN_no; i++) {
799
	if ( !IS_NULL_list ( eqn->units ) ) {
827
		if (!IS_NULL_list(eqn->units)) {
800
	    string s = ustrlit ( eqn->name ) ;
828
			string s = ustrlit(eqn->name);
801
	    ENC_IDENT ( bs, s, ustrlen ( s ) ) ;
829
			ENC_IDENT(bs, s, ustrlen(s));
802
	}
830
		}
803
	eqn++ ;
831
		eqn++;
804
    }
832
	}
805
 
833
 
806
    /* Output the variable names and numbers */
834
	/* Output the variable names and numbers */
807
    var = vars ;
835
	var = vars;
808
    ENC_SLIST ( bs, no_vars ) ;
836
	ENC_SLIST(bs, no_vars);
809
    for ( i = 0 ; i < VAR_no ; i++ ) {
837
	for (i = 0; i < VAR_no; i++) {
810
	if ( var->present ) {
838
		if (var->present) {
811
	    string s = ustrlit ( var->name ) ;
839
			string s = ustrlit(var->name);
812
	    ENC_IDENT ( bs, s, ustrlen ( s ) ) ;
840
			ENC_IDENT(bs, s, ustrlen(s));
813
	    ENC_INT ( bs, var->no ) ;
841
			ENC_INT(bs, var->no);
-
 
842
		}
-
 
843
		var++;
814
	}
844
	}
815
	var++ ;
-
 
816
    }
-
 
817
 
845
 
818
    /* Output the external variable identifiers */
846
	/* Output the external variable identifiers */
819
    var = vars ;
847
	var = vars;
820
    ENC_SLIST ( bs, no_vars ) ;
848
	ENC_SLIST(bs, no_vars);
821
    for ( i = 0 ; i < VAR_no ; i++ ) {
849
	for (i = 0; i < VAR_no; i++) {
822
	if ( var->present ) {
850
		if (var->present) {
823
	    ulong no_ext = 0 ;
851
			ulong no_ext = 0;
824
	    ulong k, n = var->no ;
852
			ulong k, n = var->no;
825
	    string *names = var->names ;
853
			string *names = var->names;
826
	    unsigned char *uses = var->uses ;
854
			unsigned char *uses = var->uses;
827
	    for ( k = 0 ; k < n ; k++ ) {
855
			for (k = 0; k < n; k++) {
828
		string s = names [k] ;
856
				string s = names[k];
829
		unsigned use = ( unsigned ) uses [k] ;
857
				unsigned use = (unsigned)uses[k];
830
		if ( use != USAGE_NONE ) {
858
				if (use != USAGE_NONE) {
831
		    CONST char *msg ;
859
					CONST char *msg;
832
		    if ( s ) {
860
					if (s) {
833
			/* Count number of external names */
861
						/* Count number of external
-
 
862
						 * names */
834
			no_ext++ ;
863
						no_ext++;
835
		    } else {
864
					} else {
836
			if ( !( use & USAGE_DEFN ) ) {
865
						if (!(use & USAGE_DEFN)) {
837
			    /* Undefined internal object */
866
							/* Undefined internal object */
838
			    if ( ( use & USAGE_DECL ) && i == VAR_dgtag ) {
867
							if ((use & USAGE_DECL) && i == VAR_dgtag) {
839
				/* Diagnostic tags can just be declared */
868
								/* Diagnostic tags can just be declared */
840
				use |= USAGE_DEFN ;
869
								use |= USAGE_DEFN;
841
			    } else {
870
							} else {
842
				msg = "'%s %lu' used but not defined" ;
871
								msg = "'%s %lu' used but not defined";
843
				error ( ERROR_INTERNAL, msg, var->name, k ) ;
872
								error(ERROR_INTERNAL, msg, var->name, k);
844
				use |= USAGE_DECL ;
873
								use |= USAGE_DECL;
845
				names [k] = mangle_anon () ;
874
								names[k] = mangle_anon();
846
				no_ext++ ;
875
								no_ext++;
847
			    }
876
							}
848
			    uses [k] = ( unsigned char ) use ;
877
							uses[k] = (unsigned char)use;
-
 
878
						}
-
 
879
					}
-
 
880
					if (i == VAR_tag && !(use & USAGE_DECL)) {
-
 
881
						/* Undeclared tag */
-
 
882
						if (s) {
-
 
883
							msg = "'%s' used but not declared";
-
 
884
							error(ERROR_INTERNAL, msg, strlit(s));
-
 
885
						} else {
-
 
886
							msg = "'%s %lu' used but not declared";
-
 
887
							error(ERROR_INTERNAL, msg, var->name, k);
-
 
888
						}
-
 
889
					}
-
 
890
				} else {
-
 
891
					names[k] = NULL;
-
 
892
				}
849
			}
893
			}
850
		    }
-
 
851
		    if ( i == VAR_tag && !( use & USAGE_DECL ) ) {
-
 
852
			/* Undeclared tag */
-
 
853
			if ( s ) {
-
 
854
			    msg = "'%s' used but not declared" ;
-
 
855
			    error ( ERROR_INTERNAL, msg, strlit ( s ) ) ;
-
 
856
			} else {
-
 
857
			    msg = "'%s %lu' used but not declared" ;
-
 
858
			    error ( ERROR_INTERNAL, msg, var->name, k ) ;
-
 
859
			}
-
 
860
		    }
-
 
861
		} else {
-
 
862
		    names [k] = NULL ;
-
 
863
		}
-
 
864
	    }
-
 
865
	    ENC_SLIST ( bs, no_ext ) ;
894
			ENC_SLIST(bs, no_ext);
866
	    for ( k = 0 ; k < n ; k++ ) {
895
			for (k = 0; k < n; k++) {
867
		string s = names [k] ;
896
				string s = names[k];
868
		if ( s ) {
897
				if (s) {
869
		    unsigned use = ( unsigned ) uses [k] ;
898
					unsigned use = (unsigned)uses[k];
870
		    if ( use & USAGE_COMMON ) {
899
					if (use & USAGE_COMMON) {
871
			/* Common subsumes defined */
900
						/* Common subsumes defined */
872
			if ( use & USAGE_DEFN ) {
901
						if (use & USAGE_DEFN) {
873
			    use &= ~USAGE_DEFN ;
902
							use &= ~USAGE_DEFN;
874
			} else {
903
						} else {
875
			    use &= ~USAGE_COMMON ;
904
							use &= ~USAGE_COMMON;
-
 
905
						}
-
 
906
					}
-
 
907
					ENC_INT(ts, use);
-
 
908
					ENC_INT(bs, k);
-
 
909
					bs = enc_name(bs, s, i);
-
 
910
				}
876
			}
911
			}
877
		    }
-
 
878
		    ENC_INT ( ts, use ) ;
-
 
879
		    ENC_INT ( bs, k ) ;
-
 
880
		    bs = enc_name ( bs, s, i ) ;
-
 
881
		}
912
		}
882
	    }
913
		var++;
883
	}
914
	}
884
	var++ ;
-
 
885
    }
-
 
886
 
915
 
887
    /* Update linker information unit */
916
	/* Update linker information unit */
888
    if ( ts != to ) {
917
	if (ts != to) {
889
	LIST ( BITSTREAM_P ) u = eqns [ EQN_tld ].units ;
918
		LIST(BITSTREAM_P)u = eqns[EQN_tld].units;
890
	u = END_list ( u ) ;
919
		u = END_list(u);
891
	COPY_bits ( HEAD_list ( u ), ts ) ;
920
		COPY_bits(HEAD_list(u), ts);
892
    }
921
	}
893
 
922
 
894
    /* Output the equation units */
923
	/* Output the equation units */
895
    eqn = eqns ;
924
	eqn = eqns;
896
    ENC_SLIST ( bs, no_eqns ) ;
925
	ENC_SLIST(bs, no_eqns);
897
    for ( i = 0 ; i < EQN_no ; i++ ) {
926
	for (i = 0; i < EQN_no; i++) {
898
	int labels = eqn->labels ;
927
		int labels = eqn->labels;
899
	int count = eqn->count ;
928
		int count = eqn->count;
900
	LIST ( BITSTREAM_P ) u = eqn->units ;
929
		LIST(BITSTREAM_P)u = eqn->units;
901
	if ( !IS_NULL_list ( u ) ) {
930
		if (!IS_NULL_list(u)) {
902
	    /* Output list of units */
931
			/* Output list of units */
903
	    LIST ( BITSTREAM_P ) v = eqn->pres ;
932
			LIST(BITSTREAM_P)v = eqn->pres;
904
	    unsigned no_units = LENGTH_list ( u ) ;
933
			unsigned no_units = LENGTH_list(u);
905
	    if ( no_units > 1 ) {
934
			if (no_units > 1) {
906
		u = REVERSE_list ( u ) ;
935
				u = REVERSE_list(u);
907
		eqn->units = u ;
936
				eqn->units = u;
908
	    }
-
 
909
	    ENC_SLIST ( bs, no_units ) ;
-
 
910
	    while ( !IS_NULL_list ( u ) ) {
-
 
911
		unsigned ub ;
-
 
912
		BITSTREAM *us = DEREF_bits ( HEAD_list ( u ) ) ;
-
 
913
		BITSTREAM *vs = DEREF_bits ( HEAD_list ( v ) ) ;
-
 
914
		gen_ptr plnk = us->link ;
-
 
915
 
-
 
916
		/* Output linkage information */
-
 
917
		if ( plnk ) {
-
 
918
		    /* Output numbers of local variables */
-
 
919
		    LINKAGE *lnk = ( LINKAGE * ) plnk ;
-
 
920
		    var = vars ;
-
 
921
		    ENC_SLIST ( bs, no_vars ) ;
-
 
922
		    for ( j = 0 ; j < VAR_no ; j++ ) {
-
 
923
			if ( var->present ) {
-
 
924
			    ulong nj = lnk->no [j] ;
-
 
925
			    ENC_INT ( bs, nj ) ;
-
 
926
			}
-
 
927
			var++ ;
-
 
928
		    }
-
 
929
 
-
 
930
		    /* Output links for local variables */
-
 
931
		    ENC_SLIST ( bs, no_vars ) ;
-
 
932
		    var = vars ;
-
 
933
		    for ( j = 0 ; j < VAR_no ; j++ ) {
-
 
934
			if ( var->present ) {
-
 
935
			    ulong k, n = vars [j].no ;
-
 
936
			    ulong *map = lnk->map [j] ;
-
 
937
			    ulong no_map = lnk->no_map [j] ;
-
 
938
			    ENC_SLIST ( bs, no_map ) ;
-
 
939
			    for ( k = 0 ; k < n ; k++ ) {
-
 
940
				ulong nk = map [k] ;
-
 
941
				if ( nk != LINK_NONE ) {
-
 
942
				    ENC_INT ( bs, nk ) ;
-
 
943
				    ENC_INT ( bs, k ) ;
-
 
944
				}
-
 
945
			    }
-
 
946
			}
937
			}
-
 
938
			ENC_SLIST(bs, no_units);
-
 
939
			while (!IS_NULL_list(u)) {
947
			var++ ;
940
				unsigned ub;
-
 
941
				BITSTREAM *us = DEREF_bits(HEAD_list(u));
-
 
942
				BITSTREAM *vs = DEREF_bits(HEAD_list(v));
948
		    }
943
				gen_ptr plnk = us->link;
949
 
944
 
950
		    /* Add extra information to unit */
945
				/* Output linkage information */
951
		    if ( lnk->create && ( labels || count || vs ) ) {
-
 
952
			BITSTREAM *ws ;
-
 
953
			ws = start_bitstream ( NIL ( FILE ), plnk ) ;
-
 
954
			if ( labels ) {
946
				if (plnk) {
955
			    /* Number of labels */
947
					/* Output numbers of local variables */
956
			    ulong no_labs = lnk->no [ VAR_label ] ;
948
					LINKAGE *lnk = (LINKAGE *)plnk;
957
			    ENC_INT ( ws, no_labs ) ;
949
					var = vars;
958
			}
-
 
959
			ws = join_bitstreams ( ws, vs ) ;
950
					ENC_SLIST(bs, no_vars);
960
			if ( count ) {
951
					for (j = 0; j < VAR_no; j++) {
961
			    /* Number of items */
952
						if (var->present) {
962
			    ulong no_item = lnk->count ;
953
							ulong nj = lnk->no[j];
963
			    ENC_SLIST ( ws, no_item ) ;
954
							ENC_INT(bs, nj);
964
			}
955
						}
965
			us = join_bitstreams ( ws, us ) ;
956
						var++;
966
		    }
957
					}
967
 
958
 
-
 
959
					/* Output links for local variables */
-
 
960
					ENC_SLIST(bs, no_vars);
-
 
961
					var = vars;
-
 
962
					for (j = 0; j < VAR_no; j++) {
-
 
963
						if (var->present) {
-
 
964
							ulong k, n = vars[j].no;
-
 
965
							ulong *map = lnk->map[j];
-
 
966
							ulong no_map = lnk->no_map[j];
-
 
967
							ENC_SLIST(bs, no_map);
-
 
968
							for (k = 0; k < n; k++) {
-
 
969
								ulong nk = map[k];
-
 
970
								if (nk != LINK_NONE) {
-
 
971
									ENC_INT(bs, nk);
-
 
972
									ENC_INT(bs, k);
-
 
973
								}
-
 
974
							}
-
 
975
						}
-
 
976
						var++;
-
 
977
					}
-
 
978
 
-
 
979
					/* Add extra information to unit */
-
 
980
					if (lnk->create && (labels || count || vs)) {
-
 
981
						BITSTREAM *ws;
-
 
982
						ws = start_bitstream(NIL(FILE), plnk);
-
 
983
						if (labels) {
-
 
984
							/* Number of labels */
-
 
985
							ulong no_labs = lnk->no[VAR_label];
-
 
986
							ENC_INT(ws, no_labs);
-
 
987
						}
-
 
988
						ws = join_bitstreams(ws, vs);
-
 
989
						if (count) {
-
 
990
							/* Number of items */
-
 
991
							ulong no_item = lnk->count;
-
 
992
							ENC_SLIST(ws, no_item);
-
 
993
						}
-
 
994
						us = join_bitstreams(ws, us);
-
 
995
					}
-
 
996
 
968
		} else {
997
				} else {
969
		    /* No linkage information */
998
					/* No linkage information */
970
		    ENC_SLIST_SMALL ( bs, 0 ) ;
999
					ENC_SLIST_SMALL(bs, 0);
971
		    ENC_SLIST_SMALL ( bs, 0 ) ;
1000
					ENC_SLIST_SMALL(bs, 0);
-
 
1001
				}
-
 
1002
 
-
 
1003
				/* Add unit bitstream to capsule */
-
 
1004
				ENC_ALIGN(us);
-
 
1005
				ub = length_bitstream(us);
-
 
1006
				ENC_LENGTH(bs,(ub / BYTE_SIZE));
-
 
1007
				ENC_ALIGN(bs);
-
 
1008
				bs = join_bitstreams(bs, us);
-
 
1009
				v = TAIL_list(v);
-
 
1010
				u = TAIL_list(u);
-
 
1011
			}
972
		}
1012
		}
973
 
-
 
974
		/* Add unit bitstream to capsule */
-
 
975
		ENC_ALIGN ( us ) ;
-
 
976
		ub = length_bitstream ( us ) ;
-
 
977
		ENC_LENGTH ( bs, ( ub / BYTE_SIZE ) ) ;
-
 
978
		ENC_ALIGN ( bs ) ;
-
 
979
		bs = join_bitstreams ( bs, us ) ;
-
 
980
		v = TAIL_list ( v ) ;
-
 
981
		u = TAIL_list ( u ) ;
-
 
982
	    }
1013
		eqn++;
983
	}
1014
	}
984
	eqn++ ;
-
 
985
    }
-
 
986
    return ( bs ) ;
1015
	return (bs);
987
}
1016
}
988
 
1017
 
989
 
1018
 
990
/*
1019
/*
991
    CURRENT FUNCTION INFORMATION
1020
    CURRENT FUNCTION INFORMATION
Line 993... Line 1022...
993
    At the start of each function definition the associated class type
1022
    At the start of each function definition the associated class type
994
    and the identifier corresponding to the this parameter are recorded
1023
    and the identifier corresponding to the this parameter are recorded
995
    in these variables.
1024
    in these variables.
996
*/
1025
*/
997
 
1026
 
998
CLASS_TYPE last_class = NULL_ctype ;
1027
CLASS_TYPE last_class = NULL_ctype;
999
ulong last_params [ DUMMY_max ] ;
1028
ulong last_params[DUMMY_max];
1000
int last_conts [ DUMMY_max ] ;
1029
int last_conts[DUMMY_max];
1001
 
1030
 
1002
 
1031
 
1003
/*
1032
/*
1004
    CLEAR FUNCTION INFORMATION
1033
    CLEAR FUNCTION INFORMATION
1005
 
1034
 
1006
    This routine clears the function information above.
1035
    This routine clears the function information above.
1007
*/
1036
*/
1008
 
1037
 
1009
void clear_params
1038
void
1010
    PROTO_Z ()
1039
clear_params(void)
1011
{
1040
{
1012
    int n ;
1041
	int n;
1013
    for ( n = 0 ; n < DUMMY_max ; n++ ) {
1042
	for (n = 0; n < DUMMY_max; n++) {
1014
	last_params [n] = LINK_NONE ;
1043
		last_params[n] = LINK_NONE;
1015
	last_conts [n] = 0 ;
1044
		last_conts[n] = 0;
1016
    }
1045
	}
1017
    return ;
1046
	return;
1018
}
1047
}
1019
 
1048
 
1020
 
1049
 
1021
/*
1050
/*
1022
    INITIALISE OUTPUT ROUTINES
1051
    INITIALISE OUTPUT ROUTINES
1023
 
1052
 
1024
    This routine initialises the TDF capsule output routines.
1053
    This routine initialises the TDF capsule output routines.
1025
*/
1054
*/
1026
 
1055
 
1027
void init_capsule
1056
void
1028
    PROTO_Z ()
1057
init_capsule(void)
1029
{
1058
{
1030
    if ( output_capsule ) {
1059
	if (output_capsule) {
1031
	/* Initialise capsule units */
1060
		/* Initialise capsule units */
1032
	HASHID nm ;
1061
		HASHID nm;
1033
	gen_ptr lnk ;
1062
		gen_ptr lnk;
1034
	if ( output_tokdec || output_all ) {
1063
		if (output_tokdec || output_all) {
1035
	    start_linkage ( &tokdec_unit, 1 ) ;
1064
			start_linkage(&tokdec_unit, 1);
1036
	    output_tokdec = 1 ;
1065
			output_tokdec = 1;
1037
	}
1066
		}
1038
	start_linkage ( &tokdef_unit, 1 ) ;
1067
		start_linkage(&tokdef_unit, 1);
1039
	start_linkage ( &aldef_unit, 1 ) ;
1068
		start_linkage(&aldef_unit, 1);
1040
	start_linkage ( &tagdec_unit, 1 ) ;
1069
		start_linkage(&tagdec_unit, 1);
1041
	start_linkage ( &tagdef_unit, 1 ) ;
1070
		start_linkage(&tagdef_unit, 1);
1042
	start_linkage ( &linkinfo_unit, 1 ) ;
1071
		start_linkage(&linkinfo_unit, 1);
1043
	if ( output_diag ) {
1072
		if (output_diag) {
1044
	    start_linkage ( &diagdef_unit, 1 ) ;
1073
			start_linkage(&diagdef_unit, 1);
1045
	    start_linkage ( &diagtype_unit, 1 ) ;
1074
			start_linkage(&diagtype_unit, 1);
1046
	    start_linkage ( &diagcomp_unit, 1 ) ;
1075
			start_linkage(&diagcomp_unit, 1);
1047
	    output_inline = 0 ;
1076
			output_inline = 0;
1048
	    output_unused = 1 ;
1077
			output_unused = 1;
1049
	}
1078
		}
1050
	written_capsule = 0 ;
1079
		written_capsule = 0;
1051
 
1080
 
1052
	/* Initialise special functions */
1081
		/* Initialise special functions */
1053
	clear_params () ;
1082
		clear_params();
1054
	lnk = tagdef_unit->link ;
1083
		lnk = tagdef_unit->link;
1055
	init_func = start_bitstream ( NIL ( FILE ), lnk ) ;
1084
		init_func = start_bitstream(NIL(FILE), lnk);
1056
	term_func = start_bitstream ( NIL ( FILE ), lnk ) ;
1085
		term_func = start_bitstream(NIL(FILE), lnk);
1057
	term_static_func = start_bitstream ( NIL ( FILE ), lnk ) ;
1086
		term_static_func = start_bitstream(NIL(FILE), lnk);
1058
	init_no = 0 ;
1087
		init_no = 0;
1059
	term_no = 0 ;
1088
		term_no = 0;
1060
 
1089
 
1061
	/* Initialise dummy types */
1090
		/* Initialise dummy types */
1062
	MAKE_type_compound ( cv_none, NULL_ctype, dummy_class ) ;
1091
		MAKE_type_compound(cv_none, NULL_ctype, dummy_class);
1063
	MAKE_type_ptr ( cv_none, dummy_class, ptr_dummy_class ) ;
1092
		MAKE_type_ptr(cv_none, dummy_class, ptr_dummy_class);
1064
	MAKE_type_dummy ( cv_none, TOK_destr_type, dummy_count ) ;
1093
		MAKE_type_dummy(cv_none, TOK_destr_type, dummy_count);
1065
	MAKE_type_dummy ( cv_none, TOK_vtab_type, dummy_vtab ) ;
1094
		MAKE_type_dummy(cv_none, TOK_vtab_type, dummy_vtab);
1066
	MAKE_type_ptr ( cv_none, dummy_vtab, ptr_dummy_vtab ) ;
1095
		MAKE_type_ptr(cv_none, dummy_vtab, ptr_dummy_vtab);
1067
	MAKE_type_func ( cv_none, type_sint, NULL_list ( TYPE ), 0,
1096
		MAKE_type_func(cv_none, type_sint, NULL_list(TYPE), 0,
1068
			 cv_lang, NULL_list ( TYPE ), NULL_nspace,
1097
			       cv_lang, NULL_list(TYPE), NULL_nspace,
1069
			 NULL_list ( IDENTIFIER ), NULL_list ( TYPE ),
1098
			       NULL_list(IDENTIFIER), NULL_list(TYPE),
1070
			 dummy_func ) ;
1099
			       dummy_func);
1071
	MAKE_off_type ( type_size_t, off_size_t ) ;
1100
		MAKE_off_type(type_size_t, off_size_t);
1072
	nm = lookup_anon () ;
1101
		nm = lookup_anon();
1073
	dummy_type_name = DEREF_id ( hashid_id ( nm ) ) ;
1102
		dummy_type_name = DEREF_id(hashid_id(nm));
1074
    }
1103
	}
1075
    return ;
1104
	return;
1076
}
1105
}
1077
 
1106
 
1078
 
1107
 
1079
/*
1108
/*
1080
    INITIALISE DIAGNOSTIC ROUTINES
1109
    INITIALISE DIAGNOSTIC ROUTINES
1081
 
1110
 
1082
    This routine is called at the start of each input file to initialise
1111
    This routine is called at the start of each input file to initialise
1083
    the diagnostic routines.
1112
    the diagnostic routines.
1084
*/
1113
*/
1085
 
1114
 
1086
void init_diag
1115
void
1087
    PROTO_Z ()
1116
init_diag(void)
1088
{
1117
{
1089
#if TDF_NEW_DIAG
1118
#if TDF_NEW_DIAG
1090
    if ( output_capsule && output_diag >= 2 ) {
1119
	if (output_capsule && output_diag >= 2) {
1091
	BITSTREAM *bs = diagcomp_pre ;
1120
		BITSTREAM *bs = diagcomp_pre;
1092
	if ( bs == NULL ) {
1121
		if (bs == NULL) {
1093
	    bs = start_bitstream ( NIL ( FILE ), diagcomp_unit->link ) ;
1122
			bs = start_bitstream(NIL(FILE), diagcomp_unit->link);
1094
	    bs = enc_dg_compilation ( bs ) ;
1123
			bs = enc_dg_compilation(bs);
1095
	    diagcomp_pre = bs ;
1124
			diagcomp_pre = bs;
1096
	    output_new_diag = output_diag ;
1125
			output_new_diag = output_diag;
-
 
1126
		}
1097
	}
1127
	}
1098
    }
-
 
1099
#endif
1128
#endif
1100
    return ;
1129
	return;
1101
}
1130
}
1102
 
1131
 
1103
 
1132
 
1104
/*
1133
/*
1105
    START OF DUMMY TDF OUTPUT ROUTINES
1134
    START OF DUMMY TDF OUTPUT ROUTINES
1106
 
1135
 
1107
    The following routines are dummies which are used if TDF output is
1136
    The following routines are dummies which are used if TDF output is
1108
    disabled.  The output is still a valid TDF capsule, it just contains
1137
    disabled.  The output is still a valid TDF capsule, it just contains
1109
    no information.
1138
    no information.
1110
*/
1139
*/
1111
 
1140
 
1112
#else /* TDF_OUTPUT */
1141
#else /* TDF_OUTPUT */
1113
 
1142
 
1114
 
1143
 
1115
/*
1144
/*
1116
    WRITE MAIN CAPSULE BODY (DUMMY VERSION)
1145
    WRITE MAIN CAPSULE BODY (DUMMY VERSION)
1117
 
1146
 
1118
    This routine writes the main body of a dummy TDF capsule to the
1147
    This routine writes the main body of a dummy TDF capsule to the
1119
    bitstream bs.
1148
    bitstream bs.
1120
*/
1149
*/
1121
 
1150
 
1122
static BITSTREAM *write_capsule_body
1151
static BITSTREAM *
1123
    PROTO_N ( ( bs ) )
-
 
1124
    PROTO_T ( BITSTREAM *bs )
1152
write_capsule_body(BITSTREAM *bs)
1125
{
1153
{
1126
    return ( bs ) ;
1154
	return (bs);
1127
}
1155
}
1128
 
1156
 
1129
 
1157
 
1130
/*
1158
/*
1131
    INITIALISE OUTPUT ROUTINES (DUMMY VERSION)
1159
    INITIALISE OUTPUT ROUTINES (DUMMY VERSION)
1132
 
1160
 
1133
    This is the dummy initialisation routine for when the TDF output
1161
    This is the dummy initialisation routine for when the TDF output
1134
    routines are disabled.
1162
    routines are disabled.
1135
*/
1163
*/
1136
 
1164
 
1137
void init_capsule
1165
void
1138
    PROTO_Z ()
1166
init_capsule(void)
1139
{
1167
{
1140
    output_capsule = 0 ;
1168
	output_capsule = 0;
1141
    return ;
1169
	return;
1142
}
1170
}
1143
 
1171
 
1144
 
1172
 
1145
/*
1173
/*
1146
    INITIALISEE DIAGNOSTIC ROUTINES (DUMMY VERSION)
1174
    INITIALISEE DIAGNOSTIC ROUTINES (DUMMY VERSION)
1147
 
1175
 
1148
    This is the dummy diagnostic initialisation routine for when the TDF
1176
    This is the dummy diagnostic initialisation routine for when the TDF
1149
    output routines are disabled.
1177
    output routines are disabled.
1150
*/
1178
*/
1151
 
1179
 
1152
void init_diag
1180
void
1153
    PROTO_Z ()
1181
init_diag(void)
1154
{
1182
{
1155
    return ;
1183
	return;
1156
}
1184
}
1157
 
1185
 
1158
 
1186
 
1159
/*
1187
/*
1160
    END OF TDF OUTPUT ROUTINES
1188
    END OF TDF OUTPUT ROUTINES
1161
 
1189
 
1162
    The remaining routines in this module are common whether TDF output
1190
    The remaining routines in this module are common whether TDF output
1163
    is disabled or not.
1191
    is disabled or not.
1164
*/
1192
*/
1165
 
1193
 
1166
#endif /* TDF_OUTPUT */
1194
#endif /* TDF_OUTPUT */
1167
 
-
 
1168
 
-
 
1169
/*
-
 
1170
    TDF OUTPUT FLAGS
-
 
1171
 
-
 
1172
    The flag output_capsule can be set to false to suppress TDF output.
-
 
1173
    The other flags inhibit the output of other optional features.
-
 
1174
*/
-
 
1175
 
-
 
1176
int output_tdf = 1 ;
-
 
1177
int output_capsule = 1 ;
-
 
1178
int output_all = 0 ;
-
 
1179
int output_bugs = 0 ;
-
 
1180
int output_builtin = 0 ;
-
 
1181
int output_date = 1 ;
-
 
1182
int output_diag = 0 ;
-
 
1183
int output_except = 1 ;
-
 
1184
int output_init = 0 ;
-
 
1185
int output_inline = 0 ;
-
 
1186
int output_new_diag = 0 ;
-
 
1187
int output_order = 0 ;
-
 
1188
int output_partial = 1 ;
-
 
1189
int output_rtti = 1 ;
-
 
1190
int output_shared = 1 ;
-
 
1191
int output_std = 0 ;
-
 
1192
int output_term = 0 ;
-
 
1193
int output_tokdec = 0 ;
-
 
1194
int output_unused = 1 ;
-
 
1195
int output_virtual = 0 ;
-
 
1196
 
1195
 
1197
 
1196
 
1198
/*
1197
/*
1199
    PROCESS A TDF OUTPUT OPTION
1198
    TDF OUTPUT FLAGS
1200
 
1199
 
1201
    This routine processes the TDF output options given by opt.  This
1200
    The flag output_capsule can be set to false to suppress TDF output.
1202
    corresponds to the command-line option '-jopt'.
1201
    The other flags inhibit the output of other optional features.
1203
*/
1202
*/
1204
 
1203
 
-
 
1204
int output_tdf = 1;
-
 
1205
int output_capsule = 1;
-
 
1206
int output_all = 0;
-
 
1207
int output_bugs = 0;
-
 
1208
int output_builtin = 0;
-
 
1209
int output_date = 1;
-
 
1210
int output_diag = 0;
-
 
1211
int output_except = 1;
-
 
1212
int output_init = 0;
-
 
1213
int output_inline = 0;
-
 
1214
int output_new_diag = 0;
-
 
1215
int output_order = 0;
-
 
1216
int output_partial = 1;
1205
void output_option
1217
int output_rtti = 1;
-
 
1218
int output_shared = 1;
-
 
1219
int output_std = 0;
-
 
1220
int output_term = 0;
-
 
1221
int output_tokdec = 0;
-
 
1222
int output_unused = 1;
-
 
1223
int output_virtual = 0;
-
 
1224
 
-
 
1225
 
-
 
1226
/*
1206
    PROTO_N ( ( opt ) )
1227
    PROCESS A TDF OUTPUT OPTION
-
 
1228
 
-
 
1229
    This routine processes the TDF output options given by opt.  This
-
 
1230
    corresponds to the command-line option '-jopt'.
-
 
1231
*/
-
 
1232
 
-
 
1233
void
1207
    PROTO_T ( string opt )
1234
output_option(string opt)
1208
{
1235
{
1209
    int out = 1 ;
1236
	int out = 1;
1210
    character c ;
1237
	character c;
1211
    while ( c = *( opt++ ), c != 0 ) {
1238
	while (c = *(opt++), c != 0) {
1212
	switch ( c ) {
1239
		switch (c) {
-
 
1240
		case 'a':
1213
	    case 'a' : output_all = out ; break ;
1241
			output_all = out;
-
 
1242
			break;
-
 
1243
		case 'b':
1214
	    case 'b' : output_bugs = out ; break ;
1244
			output_bugs = out;
-
 
1245
			break;
-
 
1246
		case 'c':
1215
	    case 'c' : output_capsule = out ; break ;
1247
			output_capsule = out;
-
 
1248
			break;
-
 
1249
		case 'd':
1216
	    case 'd' : output_term = out ; break ;
1250
			output_term = out;
-
 
1251
			break;
-
 
1252
		case 'e':
1217
	    case 'e' : output_except = out ; break ;
1253
			output_except = out;
-
 
1254
			break;
-
 
1255
		case 'f':
1218
	    case 'f' : mangle_signature = out ; break ;
1256
			mangle_signature = out;
-
 
1257
			break;
-
 
1258
		case 'g':
1219
	    case 'g' : output_diag = ( DIAG_VERSION * out ) ; break ;
1259
			output_diag = (DIAG_VERSION * out);
-
 
1260
			break;
-
 
1261
		case 'h':
1220
	    case 'h' : output_builtin = out ; break ;
1262
			output_builtin = out;
-
 
1263
			break;
-
 
1264
		case 'i':
1221
	    case 'i' : output_init = out ; break ;
1265
			output_init = out;
-
 
1266
			break;
-
 
1267
		case 'j':
1222
	    case 'j' : output_inline = out ; break ;
1268
			output_inline = out;
-
 
1269
			break;
-
 
1270
		case 'l':
1223
	    case 'l' : output_std = out ; break ;
1271
			output_std = out;
-
 
1272
			break;
-
 
1273
		case 'm':
1224
	    case 'm' : output_date = out ; break ;
1274
			output_date = out;
-
 
1275
			break;
-
 
1276
		case 'n':
1225
	    case 'n' : mangle_objects = out ; break ;
1277
			mangle_objects = out;
-
 
1278
			break;
-
 
1279
		case 'o':
1226
	    case 'o' : output_order = out ; break ;
1280
			output_order = out;
-
 
1281
			break;
-
 
1282
		case 'p':
1227
	    case 'p' : output_partial = out ; break ;
1283
			output_partial = out;
-
 
1284
			break;
-
 
1285
		case 'r':
1228
	    case 'r' : output_rtti = out ; break ;
1286
			output_rtti = out;
-
 
1287
			break;
-
 
1288
		case 's':
1229
	    case 's' : output_shared = out ; break ;
1289
			output_shared = out;
-
 
1290
			break;
-
 
1291
		case 't':
1230
	    case 't' : output_tokdec = out ; break ;
1292
			output_tokdec = out;
-
 
1293
			break;
-
 
1294
		case 'u':
1231
	    case 'u' : output_unused = out ; break ;
1295
			output_unused = out;
-
 
1296
			break;
-
 
1297
		case 'v':
1232
	    case 'v' : output_virtual = out ; break ;
1298
			output_virtual = out;
-
 
1299
			break;
1233
	    case '+' : out = 1 ; break ;
1300
		case '+':
-
 
1301
			out = 1;
-
 
1302
			break;
1234
	    case '-' : out = 0 ; break ;
1303
		case '-':
-
 
1304
			out = 0;
-
 
1305
			break;
1235
	    default : {
1306
		default: {
1236
		/* Unknown output options */
1307
			/* Unknown output options */
1237
		CONST char *err = "Unknown output option, '%c'" ;
1308
			CONST char *err = "Unknown output option, '%c'";
1238
		error ( ERROR_WARNING, err, ( int ) c ) ;
1309
			error(ERROR_WARNING, err,(int)c);
1239
		break ;
1310
			break;
1240
	    }
1311
		}
1241
	}
1312
		}
1242
    }
1313
	}
1243
    return ;
1314
	return;
1244
}
1315
}
1245
 
1316
 
1246
 
1317
 
1247
/*
1318
/*
1248
    ENCODE A VERSION NUMBER
1319
    ENCODE A VERSION NUMBER
1249
 
1320
 
1250
    This routine adds the TDF version number to the bitstream bs, making
1321
    This routine adds the TDF version number to the bitstream bs, making
1251
    adjustments to the minor version number if the extensions they
1322
    adjustments to the minor version number if the extensions they
1252
    represent are not used.
1323
    represent are not used.
1253
*/
1324
*/
1254
 
1325
 
1255
BITSTREAM *enc_version
1326
BITSTREAM *
1256
    PROTO_N ( ( bs ) )
-
 
1257
    PROTO_T ( BITSTREAM *bs )
1327
enc_version(BITSTREAM *bs)
1258
{
1328
{
1259
    int v = TDF_minor ;
1329
	int v = TDF_minor;
1260
#if ( TDF_major == 4 && TDF_minor == 1 )
1330
#if (TDF_major == 4 && TDF_minor == 1)
1261
    if ( !output_new_diag ) v = 0 ;
1331
	if (!output_new_diag) {
-
 
1332
		v = 0;
-
 
1333
	}
1262
#endif
1334
#endif
1263
    ENC_INT ( bs, TDF_major ) ;
1335
	ENC_INT(bs, TDF_major);
1264
    ENC_INT ( bs, v ) ;
1336
	ENC_INT(bs, v);
1265
    return ( bs ) ;
1337
	return (bs);
1266
}
1338
}
1267
 
1339
 
1268
 
1340
 
1269
/*
1341
/*
1270
    MAIN TDF OUTPUT ROUTINE
1342
    MAIN TDF OUTPUT ROUTINE
1271
 
1343
 
1272
    This routine outputs the TDF capsule built up by the parsing and
1344
    This routine outputs the TDF capsule built up by the parsing and
1273
    construction routines.
1345
    construction routines.
1274
*/
1346
*/
1275
 
1347
 
1276
void write_capsule
1348
void
1277
    PROTO_Z ()
1349
write_capsule(void)
1278
{
1350
{
1279
    if ( output_tdf && !written_capsule ) {
1351
	if (output_tdf && !written_capsule) {
1280
	/* Open the output file */
1352
		/* Open the output file */
1281
	FILE *f ;
1353
		FILE *f;
1282
	BITSTREAM *bs ;
1354
		BITSTREAM *bs;
1283
	written_capsule = 1 ;
1355
		written_capsule = 1;
1284
	if ( !open_output ( OUTPUT_TDF, binary_mode ) ) {
1356
		if (!open_output(OUTPUT_TDF, binary_mode)) {
1285
	    string nm = output_name [ OUTPUT_TDF ] ;
1357
			string nm = output_name[OUTPUT_TDF];
1286
	    fail ( ERR_fail_output ( nm ) ) ;
1358
			fail(ERR_fail_output(nm));
1287
	    term_error ( 0 ) ;
1359
			term_error(0);
1288
	    return ;
1360
			return;
1289
	}
1361
		}
1290
	f = output_file [ OUTPUT_TDF ] ;
1362
		f = output_file[OUTPUT_TDF];
1291
	bs = start_bitstream ( f, NULL_gen_ptr ) ;
1363
		bs = start_bitstream(f, NULL_gen_ptr);
1292
 
1364
 
1293
	/* Encode the magic number (4.0 and later) */
1365
		/* Encode the magic number (4.0 and later) */
1294
	ASSERT ( TDF_VERSION == 100 * TDF_major + TDF_minor ) ;
1366
		ASSERT(TDF_VERSION == 100 * TDF_major + TDF_minor);
1295
#if ( TDF_major >= 4 )
1367
#if (TDF_major >= 4)
1296
	ENC_BITS ( bs, 8, ascii_T ) ;
1368
		ENC_BITS(bs, 8, ascii_T);
1297
	ENC_BITS ( bs, 8, ascii_D ) ;
1369
		ENC_BITS(bs, 8, ascii_D);
1298
	ENC_BITS ( bs, 8, ascii_F ) ;
1370
		ENC_BITS(bs, 8, ascii_F);
1299
	ENC_BITS ( bs, 8, ascii_C ) ;
1371
		ENC_BITS(bs, 8, ascii_C);
1300
	bs = enc_version ( bs ) ;
1372
		bs = enc_version(bs);
1301
	ENC_ALIGN ( bs ) ;
1373
		ENC_ALIGN(bs);
1302
#endif
1374
#endif
1303
 
1375
 
1304
	/* Encode the main capsule body */
1376
		/* Encode the main capsule body */
1305
	if ( output_capsule ) {
1377
		if (output_capsule) {
1306
	    bs = write_capsule_body ( bs ) ;
1378
			bs = write_capsule_body(bs);
1307
	} else {
1379
		} else {
1308
	    ENC_SLIST_SMALL ( bs, 0 ) ;
1380
			ENC_SLIST_SMALL(bs, 0);
1309
	    ENC_SLIST_SMALL ( bs, 0 ) ;
1381
			ENC_SLIST_SMALL(bs, 0);
1310
	    ENC_SLIST_SMALL ( bs, 0 ) ;
1382
			ENC_SLIST_SMALL(bs, 0);
1311
	    ENC_SLIST_SMALL ( bs, 0 ) ;
1383
			ENC_SLIST_SMALL(bs, 0);
-
 
1384
		}
-
 
1385
		end_bitstream(bs, 1);
-
 
1386
		close_output(OUTPUT_TDF);
1312
	}
1387
	}
1313
	end_bitstream ( bs, 1 ) ;
-
 
1314
	close_output ( OUTPUT_TDF ) ;
-
 
1315
    }
-
 
1316
    return ;
1388
	return;
1317
}
1389
}