Warning: Undefined variable $n in /usr/local/www/websvn.planix.org/include/diff_util.php on line 243

Warning: Undefined variable $n in /usr/local/www/websvn.planix.org/include/diff_util.php on line 247

Warning: Undefined variable $m in /usr/local/www/websvn.planix.org/include/diff_util.php on line 251

Warning: Undefined variable $n in /usr/local/www/websvn.planix.org/include/diff_util.php on line 243

Warning: Undefined variable $n in /usr/local/www/websvn.planix.org/include/diff_util.php on line 247

Warning: Undefined variable $m in /usr/local/www/websvn.planix.org/include/diff_util.php on line 251
WebSVN – tendra.SVN – Diff – /trunk/src/producers/common/output/shape.c – Rev 2 and 7

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, 1998
32
    		 Crown Copyright (c) 1997, 1998
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 65... Line 95...
65
#include "shape.h"
95
#include "shape.h"
66
#include "struct.h"
96
#include "struct.h"
67
#include "tok.h"
97
#include "tok.h"
68
#include "ustring.h"
98
#include "ustring.h"
69
#if TDF_OUTPUT
99
#if TDF_OUTPUT
70
 
100
 
71
 
101
 
72
/*
102
/*
73
    ENCODE A TDF INT
103
    ENCODE A TDF INT
74
 
104
 
75
    This routine adds the simple integer constant n to the bitstream bs
105
    This routine adds the simple integer constant n to the bitstream bs
76
    as a TDF INT.  The argument e is true if this is the last sequence of
106
    as a TDF INT.  The argument e is true if this is the last sequence of
77
    digits in a value.
107
    digits in a value.
78
*/
108
*/
79
 
109
 
80
static BITSTREAM *enc_tdfint
110
static BITSTREAM *
81
    PROTO_N ( ( bs, n, e ) )
-
 
82
    PROTO_T ( BITSTREAM *bs X NAT n X int e )
111
enc_tdfint(BITSTREAM *bs, NAT n, int e)
83
{
112
{
84
    unsigned np ;
113
	unsigned np;
85
    LIST ( unsigned ) p ;
114
	LIST(unsigned)p;
86
    if ( IS_nat_small ( n ) ) {
115
	if (IS_nat_small(n)) {
87
	p = NULL_list ( unsigned ) ;
116
		p = NULL_list(unsigned);
88
	np = 1 ;
117
		np = 1;
89
    } else {
118
	} else {
90
	p = DEREF_list ( nat_large_values ( n ) ) ;
119
		p = DEREF_list(nat_large_values(n));
91
	np = LENGTH_list ( p ) ;
120
		np = LENGTH_list(p);
92
    }
121
	}
93
    if ( np <= 2 ) {
122
	if (np <= 2) {
94
	/* Small values */
123
		/* Small values */
95
	unsigned long v = get_nat_value ( n ) ;
124
		unsigned long v = get_nat_value(n);
96
	if ( e ) {
125
		if (e) {
97
	    bs = enc_int ( bs, v ) ;
126
			bs = enc_int(bs, v);
98
	} else {
127
		} else {
99
	    bs = enc_int_aux ( bs, v ) ;
128
			bs = enc_int_aux(bs, v);
-
 
129
		}
-
 
130
	} else {
-
 
131
		/* Really large values */
-
 
132
		unsigned u = DEREF_unsigned(HEAD_list(p));
-
 
133
		n = binary_nat_op(exp_rshift_tag, n, small_nat[3]);
-
 
134
		bs = enc_tdfint(bs, n, 0);
-
 
135
		u &= 0x7;
-
 
136
		if (e) {
-
 
137
			u |= 0x8;
-
 
138
		}
-
 
139
		bs = enc_bits(bs,(unsigned)4, u);
100
	}
140
	}
101
    } else {
-
 
102
	/* Really large values */
-
 
103
	unsigned u = DEREF_unsigned ( HEAD_list ( p ) ) ;
-
 
104
	n = binary_nat_op ( exp_rshift_tag, n, small_nat [3] ) ;
-
 
105
	bs = enc_tdfint ( bs, n, 0 ) ;
-
 
106
	u &= 0x7 ;
-
 
107
	if ( e ) u |= 0x8 ;
-
 
108
	bs = enc_bits ( bs, ( unsigned ) 4, u ) ;
-
 
109
    }
-
 
110
    return ( bs ) ;
141
	return (bs);
111
}
142
}
112
 
143
 
113
 
144
 
114
/*
145
/*
115
    ENCODE A TDF BOOL
146
    ENCODE A TDF BOOL
116
 
147
 
117
    This routine adds the value n to the bitstream bs as a TDF BOOL,
148
    This routine adds the value n to the bitstream bs as a TDF BOOL,
118
    nonzero values map to true, zero to false.
149
    nonzero values map to true, zero to false.
119
*/
150
*/
120
 
151
 
121
BITSTREAM *enc_bool
152
BITSTREAM *
122
    PROTO_N ( ( bs, n ) )
-
 
123
    PROTO_T ( BITSTREAM *bs X int n )
153
enc_bool(BITSTREAM *bs, int n)
124
{
154
{
125
    if ( n ) {
155
	if (n) {
126
	ENC_true ( bs ) ;
156
		ENC_true(bs);
127
    } else {
157
	} else {
128
	ENC_false ( bs ) ;
158
		ENC_false(bs);
129
    }
159
	}
130
    return ( bs ) ;
160
	return (bs);
131
}
161
}
132
 
162
 
133
 
163
 
134
/*
164
/*
135
    ENCODE A CALCULATED INTEGRAL EXPRESSION
165
    ENCODE A CALCULATED INTEGRAL EXPRESSION
136
 
166
 
137
    This routine adds the calculated integral expression n to the
167
    This routine adds the calculated integral expression n to the
138
    bitstream bs.  The value is negated if sgn is true and a token is
168
    bitstream bs.  The value is negated if sgn is true and a token is
139
    introduced to represent the value if intro is true.  The value is
169
    introduced to represent the value if intro is true.  The value is
140
    encoded as a NAT if sort is 0, a SIGNED NAT if sort is 1, an
170
    encoded as a NAT if sort is 0, a SIGNED NAT if sort is 1, an
141
    EXP if sort is 2 and a constant EXP if sort is 3.
171
    EXP if sort is 2 and a constant EXP if sort is 3.
142
*/
172
*/
143
 
173
 
144
static BITSTREAM *enc_calc
174
static BITSTREAM *
145
    PROTO_N ( ( bs, n, sgn, intro, sort ) )
-
 
146
    PROTO_T ( BITSTREAM *bs X NAT n X int sgn X int intro X int sort )
175
enc_calc(BITSTREAM *bs, NAT n, int sgn, int intro, int sort)
147
{
176
{
148
    static int suppress_calc = 0 ;
177
	static int suppress_calc = 0;
149
    NAT n1 = n ;
178
	NAT n1 = n;
150
    ulong m = DEREF_ulong ( nat_calc_tok ( n ) ) ;
179
	ulong m = DEREF_ulong(nat_calc_tok(n));
151
    EXP e = DEREF_exp ( nat_calc_value ( n ) ) ;
180
	EXP e = DEREF_exp(nat_calc_value(n));
152
    TYPE t = DEREF_type ( exp_type ( e ) ) ;
181
	TYPE t = DEREF_type(exp_type(e));
153
    if ( m == LINK_NONE && !suppress_calc ) {
182
	if (m == LINK_NONE && !suppress_calc) {
154
	EXP f = eval_exp ( e, 1 ) ;
183
		EXP f = eval_exp(e, 1);
155
	if ( !EQ_exp ( f, e ) && IS_exp_int_lit ( f ) ) {
184
		if (!EQ_exp(f, e) && IS_exp_int_lit(f)) {
156
	    e = f ;
185
			e = f;
157
	    t = DEREF_type ( exp_type ( e ) ) ;
186
			t = DEREF_type(exp_type(e));
158
	    n = DEREF_nat ( exp_int_lit_nat ( e ) ) ;
187
			n = DEREF_nat(exp_int_lit_nat(e));
159
	    if ( !IS_nat_calc ( n ) ) {
188
			if (!IS_nat_calc(n)) {
160
		/* Value evaluates to a literal constant */
189
				/* Value evaluates to a literal constant */
161
		if ( sort == 0 ) {
190
				if (sort == 0) {
162
		    bs = enc_nat ( bs, n, 0 ) ;
191
					bs = enc_nat(bs, n, 0);
163
		} else {
192
				} else {
164
		    if ( sort >= 2 ) {
193
					if (sort >= 2) {
165
			ENC_make_int ( bs ) ;
194
						ENC_make_int(bs);
166
			bs = enc_variety ( bs, t ) ;
195
						bs = enc_variety(bs, t);
167
		    }
196
					}
168
		    bs = enc_snat ( bs, n, sgn, 0 ) ;
197
					bs = enc_snat(bs, n, sgn, 0);
169
		}
198
				}
170
		return ( bs ) ;
199
				return (bs);
171
	    }
200
			}
172
	}
201
		}
173
    }
202
	}
174
 
203
 
175
    /* Encode calculated value */
204
	/* Encode calculated value */
176
    suppress_calc++ ;
205
	suppress_calc++;
177
    if ( sort == 0 ) {
206
	if (sort == 0) {
178
	ENC_computed_nat ( bs ) ;
207
		ENC_computed_nat(bs);
179
	sort = 2 ;
208
		sort = 2;
180
    } else if ( sort == 1 ) {
209
	} else if (sort == 1) {
181
	ENC_computed_signed_nat ( bs ) ;
210
		ENC_computed_signed_nat(bs);
182
	sort = 2 ;
211
		sort = 2;
183
    }
212
	}
184
    if ( sgn ) {
213
	if (sgn) {
185
	/* Negated value */
214
		/* Negated value */
186
	ENC_negate ( bs ) ;
215
		ENC_negate(bs);
187
	bs = enc_error_treatment ( bs, t ) ;
216
		bs = enc_error_treatment(bs, t);
188
	bs = enc_calc ( bs, n, 0, intro, sort ) ;
217
		bs = enc_calc(bs, n, 0, intro, sort);
189
    } else {
218
	} else {
190
	if ( intro && m == LINK_NONE ) {
219
		if (intro && m == LINK_NONE) {
191
	    /* Introduce token for value */
220
			/* Introduce token for value */
192
	    while ( !IS_NULL_exp ( e ) && IS_exp_int_lit ( e ) ) {
221
			while (!IS_NULL_exp(e) && IS_exp_int_lit(e)) {
193
		NAT n2 = DEREF_nat ( exp_int_lit_nat ( e ) ) ;
222
				NAT n2 = DEREF_nat(exp_int_lit_nat(e));
194
		if ( !IS_nat_calc ( n2 ) ) break ;
223
				if (!IS_nat_calc(n2)) {
-
 
224
					break;
-
 
225
				}
195
		m = DEREF_ulong ( nat_calc_tok ( n2 ) ) ;
226
				m = DEREF_ulong(nat_calc_tok(n2));
196
		if ( m != LINK_NONE ) break ;
227
				if (m != LINK_NONE) {
-
 
228
					break;
-
 
229
				}
197
		e = DEREF_exp ( nat_calc_value ( n2 ) ) ;
230
				e = DEREF_exp(nat_calc_value(n2));
198
	    }
231
			}
199
	    if ( !IS_NULL_exp ( e ) && IS_exp_token ( e ) ) {
232
			if (!IS_NULL_exp(e) && IS_exp_token(e)) {
200
		LIST ( TOKEN ) args ;
233
				LIST(TOKEN)args;
201
		args = DEREF_list ( exp_token_args ( e ) ) ;
234
				args = DEREF_list(exp_token_args(e));
202
		if ( IS_NULL_list ( args ) ) {
235
				if (IS_NULL_list(args)) {
203
		    /* Use existing token */
236
					/* Use existing token */
-
 
237
					IDENTIFIER tok =
204
		    IDENTIFIER tok = DEREF_id ( exp_token_tok ( e ) ) ;
238
					    DEREF_id(exp_token_tok(e));
205
		    IGNORE capsule_id ( tok, VAR_token ) ;
239
					IGNORE capsule_id(tok, VAR_token);
206
		    m = DEREF_ulong ( id_no ( tok ) ) ;
240
					m = DEREF_ulong(id_no(tok));
-
 
241
				}
-
 
242
			}
-
 
243
			if (m == LINK_NONE) {
-
 
244
				/* Introduce token for value */
-
 
245
				BITSTREAM *ts;
-
 
246
				m = capsule_no(NULL_string, VAR_token);
-
 
247
				ts = enc_tokdef_start(m, "E", NIL(ulong), 1);
-
 
248
				if (sort == 3) {
-
 
249
					/* Force constant evaluation */
-
 
250
					ENC_make_int(ts);
-
 
251
					ts = enc_variety(ts, t);
-
 
252
					ENC_computed_signed_nat(ts);
-
 
253
				}
-
 
254
				ts = enc_exp(ts, e);
-
 
255
				enc_tokdef_end(m, ts);
-
 
256
			}
-
 
257
			COPY_ulong(nat_calc_tok(n1), m);
-
 
258
			COPY_ulong(nat_calc_tok(n), m);
-
 
259
		}
-
 
260
		if (m == LINK_NONE) {
-
 
261
			/* Calculated value */
-
 
262
			if (sort == 3) {
-
 
263
				/* Force constant evaluation */
-
 
264
				ENC_make_int(bs);
-
 
265
				bs = enc_variety(bs, t);
-
 
266
				ENC_computed_signed_nat(bs);
-
 
267
			}
-
 
268
			bs = enc_exp(bs, e);
-
 
269
		} else {
-
 
270
			/* Tokenised value */
-
 
271
			m = link_no(bs, m, VAR_token);
-
 
272
			ENC_exp_apply_token(bs);
-
 
273
			ENC_make_tok(bs, m);
-
 
274
			ENC_LEN_SMALL(bs, 0);
207
		}
275
		}
208
	    }
-
 
209
	    if ( m == LINK_NONE ) {
-
 
210
		/* Introduce token for value */
-
 
211
		BITSTREAM *ts ;
-
 
212
		m = capsule_no ( NULL_string, VAR_token ) ;
-
 
213
		ts = enc_tokdef_start ( m, "E", NIL ( ulong ), 1 ) ;
-
 
214
		if ( sort == 3 ) {
-
 
215
		    /* Force constant evaluation */
-
 
216
		    ENC_make_int ( ts ) ;
-
 
217
		    ts = enc_variety ( ts, t ) ;
-
 
218
		    ENC_computed_signed_nat ( ts ) ;
-
 
219
		}
-
 
220
		ts = enc_exp ( ts, e ) ;
-
 
221
		enc_tokdef_end ( m, ts ) ;
-
 
222
	    }
-
 
223
	    COPY_ulong ( nat_calc_tok ( n1 ), m ) ;
-
 
224
	    COPY_ulong ( nat_calc_tok ( n ), m ) ;
-
 
225
	}
-
 
226
	if ( m == LINK_NONE ) {
-
 
227
	    /* Calculated value */
-
 
228
	    if ( sort == 3 ) {
-
 
229
		/* Force constant evaluation */
-
 
230
		ENC_make_int ( bs ) ;
-
 
231
		bs = enc_variety ( bs, t ) ;
-
 
232
		ENC_computed_signed_nat ( bs ) ;
-
 
233
	    }
-
 
234
	    bs = enc_exp ( bs, e ) ;
-
 
235
	} else {
-
 
236
	    /* Tokenised value */
-
 
237
	    m = link_no ( bs, m, VAR_token ) ;
-
 
238
	    ENC_exp_apply_token ( bs ) ;
-
 
239
	    ENC_make_tok ( bs, m ) ;
-
 
240
	    ENC_LEN_SMALL ( bs, 0 ) ;
-
 
241
	}
276
	}
242
    }
-
 
243
    suppress_calc-- ;
277
	suppress_calc--;
244
    return ( bs ) ;
278
	return (bs);
245
}
279
}
246
 
280
 
247
 
281
 
248
/*
282
/*
249
    ENCODE A TDF NAT
283
    ENCODE A TDF NAT
250
 
284
 
251
    This routine adds the integer constant n to the bitstream bs as a
285
    This routine adds the integer constant n to the bitstream bs as a
252
    TDF NAT.
286
    TDF NAT.
253
*/
287
*/
254
 
288
 
255
BITSTREAM *enc_nat
289
BITSTREAM *
256
    PROTO_N ( ( bs, n, intro ) )
-
 
257
    PROTO_T ( BITSTREAM *bs X NAT n X int intro )
290
enc_nat(BITSTREAM *bs, NAT n, int intro)
258
{
291
{
259
    if ( IS_NULL_nat ( n ) ) {
292
	if (IS_NULL_nat(n)) {
260
	/* Null constant maps to zero */
293
		/* Null constant maps to zero */
261
	ENC_make_nat ( bs ) ;
294
		ENC_make_nat(bs);
262
	ENC_INT_SMALL ( bs, 0 ) ;
295
		ENC_INT_SMALL(bs, 0);
263
    } else {
296
	} else {
264
	ASSERT ( ORDER_nat == 5 ) ;
297
		ASSERT(ORDER_nat == 5);
265
	switch ( TAG_nat ( n ) ) {
298
		switch (TAG_nat(n)) {
266
	    case nat_small_tag : {
299
		case nat_small_tag: {
267
		unsigned v = DEREF_unsigned ( nat_small_value ( n ) ) ;
300
			unsigned v = DEREF_unsigned(nat_small_value(n));
268
		ENC_make_nat ( bs ) ;
301
			ENC_make_nat(bs);
269
		ENC_INT ( bs, v ) ;
302
			ENC_INT(bs, v);
270
		break ;
303
			break;
271
	    }
304
		}
272
	    case nat_large_tag : {
305
		case nat_large_tag: {
273
		ENC_make_nat ( bs ) ;
306
			ENC_make_nat(bs);
274
		bs = enc_tdfint ( bs, n, 1 ) ;
307
			bs = enc_tdfint(bs, n, 1);
275
		break ;
308
			break;
276
	    }
309
		}
277
	    case nat_calc_tag : {
310
		case nat_calc_tag: {
278
		bs = enc_calc ( bs, n, 0, intro, 0 ) ;
311
			bs = enc_calc(bs, n, 0, intro, 0);
279
		break ;
312
			break;
280
	    }
313
		}
281
	    case nat_neg_tag : {
314
		case nat_neg_tag: {
282
		/* This case shouldn't occur */
315
			/* This case shouldn't occur */
283
		ENC_make_nat ( bs ) ;
316
			ENC_make_nat(bs);
284
		ENC_INT_SMALL ( bs, 0 ) ;
317
			ENC_INT_SMALL(bs, 0);
285
		break ;
318
			break;
286
	    }
319
		}
287
	    case nat_token_tag : {
320
		case nat_token_tag: {
288
		/* Token applications */
321
			/* Token applications */
289
		IDENTIFIER tok = DEREF_id ( nat_token_tok ( n ) ) ;
322
			IDENTIFIER tok = DEREF_id(nat_token_tok(n));
290
		LIST ( TOKEN ) args = DEREF_list ( nat_token_args ( n ) ) ;
323
			LIST(TOKEN)args = DEREF_list(nat_token_args(n));
291
		TOKEN sort = DEREF_tok ( id_token_sort ( tok ) ) ;
324
			TOKEN sort = DEREF_tok(id_token_sort(tok));
292
		int s = token_code ( sort ) ;
325
			int s = token_code(sort);
293
		if ( s == 'Z' ) {
326
			if (s == 'Z') {
294
		    /* Signed nat token */
327
				/* Signed nat token */
295
		    TYPE t = type_sint ;
328
				TYPE t = type_sint;
296
		    ENC_computed_nat ( bs ) ;
329
				ENC_computed_nat(bs);
297
		    ENC_make_int ( bs ) ;
330
				ENC_make_int(bs);
298
		    bs = enc_variety ( bs, t ) ;
331
				bs = enc_variety(bs, t);
-
 
332
			}
-
 
333
			bs = enc_token(bs, tok, args);
-
 
334
			break;
-
 
335
		}
299
		}
336
		}
300
		bs = enc_token ( bs, tok, args ) ;
-
 
301
		break ;
-
 
302
	    }
-
 
303
	}
337
	}
304
    }
-
 
305
    return ( bs ) ;
338
	return (bs);
306
}
339
}
307
 
340
 
308
 
341
 
309
/*
342
/*
310
    ENCODE A TDF SIGNED NAT
343
    ENCODE A TDF SIGNED NAT
311
 
344
 
312
    This routine adds the integer constant n to the bitstream bs as a
345
    This routine adds the integer constant n to the bitstream bs as a
313
    TDF SIGNED NAT.  sgn is true if the value is to be negated and intro
346
    TDF SIGNED NAT.  sgn is true if the value is to be negated and intro
314
    is true if a token is to be introduced for a calculated value.
347
    is true if a token is to be introduced for a calculated value.
315
*/
348
*/
316
 
349
 
317
BITSTREAM *enc_snat
350
BITSTREAM *
318
    PROTO_N ( ( bs, n, sgn, intro ) )
-
 
319
    PROTO_T ( BITSTREAM *bs X NAT n X int sgn X int intro )
351
enc_snat(BITSTREAM *bs, NAT n, int sgn, int intro)
320
{
352
{
321
    if ( IS_NULL_nat ( n ) ) {
353
	if (IS_NULL_nat(n)) {
322
	/* Null constant maps to zero */
354
		/* Null constant maps to zero */
323
	ENC_make_signed_nat ( bs ) ;
355
		ENC_make_signed_nat(bs);
324
	ENC_OFF ( bs ) ;
356
		ENC_OFF(bs);
325
	ENC_INT_SMALL ( bs, 0 ) ;
357
		ENC_INT_SMALL(bs, 0);
326
    } else {
358
	} else {
327
	ASSERT ( ORDER_nat == 5 ) ;
359
		ASSERT(ORDER_nat == 5);
328
	switch ( TAG_nat ( n ) ) {
360
		switch (TAG_nat(n)) {
329
	    case nat_small_tag : {
361
		case nat_small_tag: {
330
		unsigned v = DEREF_unsigned ( nat_small_value ( n ) ) ;
362
			unsigned v = DEREF_unsigned(nat_small_value(n));
331
		if ( v == 0 ) sgn = 0 ;
363
			if (v == 0) {
-
 
364
				sgn = 0;
-
 
365
			}
332
		ENC_make_signed_nat ( bs ) ;
366
			ENC_make_signed_nat(bs);
333
		ENC_BOOL ( bs, sgn ) ;
367
			ENC_BOOL(bs, sgn);
334
		ENC_INT ( bs, v ) ;
368
			ENC_INT(bs, v);
335
		break ;
369
			break;
336
	    }
370
		}
337
	    case nat_large_tag : {
371
		case nat_large_tag: {
338
		ENC_make_signed_nat ( bs ) ;
372
			ENC_make_signed_nat(bs);
339
		ENC_BOOL ( bs, sgn ) ;
373
			ENC_BOOL(bs, sgn);
340
		bs = enc_tdfint ( bs, n, 1 ) ;
374
			bs = enc_tdfint(bs, n, 1);
341
		break ;
375
			break;
342
	    }
376
		}
343
	    case nat_calc_tag : {
377
		case nat_calc_tag: {
344
		bs = enc_calc ( bs, n, sgn, intro, 1 ) ;
378
			bs = enc_calc(bs, n, sgn, intro, 1);
345
		break ;
379
			break;
346
	    }
380
		}
347
	    case nat_neg_tag : {
381
		case nat_neg_tag: {
348
		NAT m = DEREF_nat ( nat_neg_arg ( n ) ) ;
382
			NAT m = DEREF_nat(nat_neg_arg(n));
349
		bs = enc_snat ( bs, m, !sgn, intro ) ;
383
			bs = enc_snat(bs, m, !sgn, intro);
350
		break ;
384
			break;
351
	    }
385
		}
352
	    case nat_token_tag : {
386
		case nat_token_tag: {
353
		/* Token applications */
387
			/* Token applications */
354
		IDENTIFIER tok = DEREF_id ( nat_token_tok ( n ) ) ;
388
			IDENTIFIER tok = DEREF_id(nat_token_tok(n));
355
		LIST ( TOKEN ) args = DEREF_list ( nat_token_args ( n ) ) ;
389
			LIST(TOKEN)args = DEREF_list(nat_token_args(n));
356
		TOKEN sort = DEREF_tok ( id_token_sort ( tok ) ) ;
390
			TOKEN sort = DEREF_tok(id_token_sort(tok));
357
		int s = token_code ( sort ) ;
391
			int s = token_code(sort);
358
		if ( s == 'Z' ) {
392
			if (s == 'Z') {
359
		    /* Signed nat token */
393
				/* Signed nat token */
360
		    if ( sgn ) {
394
				if (sgn) {
361
			/* Negate signed nat */
395
					/* Negate signed nat */
362
			TYPE t = type_sint ;
396
					TYPE t = type_sint;
363
			ENC_computed_signed_nat ( bs ) ;
397
					ENC_computed_signed_nat(bs);
364
			ENC_negate ( bs ) ;
398
					ENC_negate(bs);
365
			bs = enc_error_treatment ( bs, t ) ;
399
					bs = enc_error_treatment(bs, t);
366
			ENC_make_int ( bs ) ;
400
					ENC_make_int(bs);
367
			bs = enc_variety ( bs, t ) ;
401
					bs = enc_variety(bs, t);
368
		    }
402
				}
369
		} else {
403
			} else {
370
		    /* Nat token */
404
				/* Nat token */
371
		    ENC_snat_from_nat ( bs ) ;
405
				ENC_snat_from_nat(bs);
372
		    bs = enc_bool ( bs, sgn ) ;
406
				bs = enc_bool(bs, sgn);
373
		}
407
			}
374
		bs = enc_token ( bs, tok, args ) ;
408
			bs = enc_token(bs, tok, args);
375
		break ;
409
			break;
-
 
410
		}
376
	    }
411
		}
377
	}
412
	}
378
    }
-
 
379
    return ( bs ) ;
413
	return (bs);
380
}
414
}
381
 
415
 
382
 
416
 
383
/*
417
/*
384
    ENCODE AN INTEGER LITERAL EXPRESSION
418
    ENCODE AN INTEGER LITERAL EXPRESSION
385
 
419
 
386
    This routine adds the integer constant expression n of type t to the
420
    This routine adds the integer constant expression n of type t to the
387
    bitstream bs.  etag gives the expression tag which is used to
421
    bitstream bs.  etag gives the expression tag which is used to
388
    determine whether a token should be introduced for the value.
422
    determine whether a token should be introduced for the value.
389
*/
423
*/
390
 
424
 
391
BITSTREAM *enc_int_lit
425
BITSTREAM *
392
    PROTO_N ( ( bs, n, t, etag ) )
-
 
393
    PROTO_T ( BITSTREAM *bs X NAT n X TYPE t X unsigned etag )
426
enc_int_lit(BITSTREAM *bs, NAT n, TYPE t, unsigned etag)
394
{
427
{
395
    if ( IS_nat_calc ( n ) ) {
428
	if (IS_nat_calc(n)) {
396
	if ( etag == exp_identifier_tag ) {
429
		if (etag == exp_identifier_tag) {
397
	    /* Enumerator value */
430
			/* Enumerator value */
398
	    bs = enc_calc ( bs, n, 0, 1, 3 ) ;
431
			bs = enc_calc(bs, n, 0, 1, 3);
399
	} else {
432
		} else {
400
	    /* Other calculated value */
433
			/* Other calculated value */
401
	    bs = enc_calc ( bs, n, 0, 0, 2 ) ;
434
			bs = enc_calc(bs, n, 0, 0, 2);
402
	}
435
		}
403
    } else {
436
	} else {
404
	/* Simple value */
437
		/* Simple value */
405
	ENC_make_int ( bs ) ;
438
		ENC_make_int(bs);
406
	bs = enc_variety ( bs, t ) ;
439
		bs = enc_variety(bs, t);
407
	bs = enc_snat ( bs, n, 0, 0 ) ;
440
		bs = enc_snat(bs, n, 0, 0);
408
    }
441
	}
409
    return ( bs ) ;
442
	return (bs);
410
}
443
}
411
 
444
 
412
 
445
 
413
/*
446
/*
414
    ENCODE A TDF FLOATING LITERAL
447
    ENCODE A TDF FLOATING LITERAL
415
 
448
 
416
    This routine adds the floating literal flt of type t to the bitstream
449
    This routine adds the floating literal flt of type t to the bitstream
417
    bs as a TDF EXP.
450
    bs as a TDF EXP.
418
*/
451
*/
419
 
452
 
420
BITSTREAM *enc_float
453
BITSTREAM *
421
    PROTO_N ( ( bs, flt, t ) )
-
 
422
    PROTO_T ( BITSTREAM *bs X FLOAT flt X TYPE t )
454
enc_float(BITSTREAM *bs, FLOAT flt, TYPE t)
423
{
455
{
424
    ulong n = DEREF_ulong ( flt_tok ( flt ) ) ;
456
	ulong n = DEREF_ulong(flt_tok(flt));
425
    if ( n == LINK_NONE ) {
457
	if (n == LINK_NONE) {
426
	/* Decompose literal */
458
		/* Decompose literal */
427
	BITSTREAM *ts ;
459
		BITSTREAM *ts;
428
	string i = DEREF_string ( flt_simple_int_part ( flt ) ) ;
460
		string i = DEREF_string(flt_simple_int_part(flt));
429
	string f = DEREF_string ( flt_simple_frac_part ( flt ) ) ;
461
		string f = DEREF_string(flt_simple_frac_part(flt));
430
	unsigned long ni = ( unsigned long ) ustrlen ( i ) ;
462
		unsigned long ni = (unsigned long)ustrlen(i);
431
	unsigned long nf = ( unsigned long ) ustrlen ( f ) ;
463
		unsigned long nf = (unsigned long)ustrlen(f);
432
	unsigned long nt = ni + nf + 1 ;
464
		unsigned long nt = ni + nf + 1;
433
	NAT e = DEREF_nat ( flt_simple_exponent ( flt ) ) ;
465
		NAT e = DEREF_nat(flt_simple_exponent(flt));
434
 
466
 
435
	/* Map to canonical form */
467
		/* Map to canonical form */
436
	if ( ni == 0 ) {
468
		if (ni == 0) {
437
	    /* Introduce leading zero */
469
			/* Introduce leading zero */
438
	    i = small_number [0] ;
470
			i = small_number[0];
439
	    ni = 1 ;
471
			ni = 1;
440
	    nt = nf + 2 ;
472
			nt = nf + 2;
441
	}
473
		}
442
	if ( nf == 0 ) {
474
		if (nf == 0) {
443
	    /* No decimal part */
475
			/* No decimal part */
444
	    nt = ni ;
476
			nt = ni;
445
	}
477
		}
446
	if ( nf == 1 && f [0] == '0' ) {
478
		if (nf == 1 && f[0] == '0') {
447
	    /* Ignore trivial decimal part */
479
			/* Ignore trivial decimal part */
448
	    nf = 0 ;
480
			nf = 0;
449
	    nt = ni ;
481
			nt = ni;
450
	}
482
		}
451
 
483
 
452
	/* Encode expression */
484
		/* Encode expression */
453
	n = capsule_no ( NULL_string, VAR_token ) ;
485
		n = capsule_no(NULL_string, VAR_token);
454
	ts = enc_tokdef_start ( n, "E", NIL ( ulong ), 1 ) ;
486
		ts = enc_tokdef_start(n, "E", NIL(ulong), 1);
455
	ENC_make_floating ( ts ) ;
487
		ENC_make_floating(ts);
456
	ts = enc_flvar ( ts, t ) ;
488
		ts = enc_flvar(ts, t);
457
	ENC_to_nearest ( ts ) ;
489
		ENC_to_nearest(ts);
458
	ENC_false ( ts ) ;
490
		ENC_false(ts);
459
	ENC_make_string ( ts ) ;
491
		ENC_make_string(ts);
460
	ENC_INT ( ts, BYTE_SIZE ) ;
492
		ENC_INT(ts, BYTE_SIZE);
461
	ENC_INT ( ts, nt ) ;
493
		ENC_INT(ts, nt);
462
	ts = enc_ascii ( ts, ni, i ) ;
494
		ts = enc_ascii(ts, ni, i);
463
	if ( nf ) {
495
		if (nf) {
464
	    ENC_BITS ( ts, BYTE_SIZE, '.' ) ;
496
			ENC_BITS(ts, BYTE_SIZE, '.');
465
	    ts = enc_ascii ( ts, nf, f ) ;
497
			ts = enc_ascii(ts, nf, f);
466
	}
498
		}
467
	ENC_make_nat ( ts ) ;
499
		ENC_make_nat(ts);
468
	ENC_INT ( ts, 10 ) ;
500
		ENC_INT(ts, 10);
469
	ts = enc_snat ( ts, e, 0, 0 ) ;
501
		ts = enc_snat(ts, e, 0, 0);
470
	enc_tokdef_end ( n, ts ) ;
502
		enc_tokdef_end(n, ts);
471
	COPY_ulong ( flt_tok ( flt ), n ) ;
503
		COPY_ulong(flt_tok(flt), n);
472
    }
504
	}
473
    n = link_no ( bs, n, VAR_token ) ;
505
	n = link_no(bs, n, VAR_token);
474
    ENC_exp_apply_token ( bs ) ;
506
	ENC_exp_apply_token(bs);
475
    ENC_make_tok ( bs, n ) ;
507
	ENC_make_tok(bs, n);
476
    ENC_LEN_SMALL ( bs, 0 ) ;
508
	ENC_LEN_SMALL(bs, 0);
477
    return ( bs ) ;
509
	return (bs);
478
}
510
}
479
 
511
 
480
 
512
 
481
/*
513
/*
482
    ENCODE A SMALL TDF FLOATING LITERAL
514
    ENCODE A SMALL TDF FLOATING LITERAL
483
 
515
 
484
    This routine adds the small floating literal given by the value v of
516
    This routine adds the small floating literal given by the value v of
485
    type t to the bitstream bs as a TDF EXP.
517
    type t to the bitstream bs as a TDF EXP.
486
*/
518
*/
487
 
519
 
488
BITSTREAM *enc_float_int
520
BITSTREAM *
489
    PROTO_N ( ( bs, v, t ) )
-
 
490
    PROTO_T ( BITSTREAM *bs X int v X TYPE t )
521
enc_float_int(BITSTREAM *bs, int v, TYPE t)
491
{
522
{
492
    FLOAT flt = get_float ( t, v ) ;
523
	FLOAT flt = get_float(t, v);
493
    if ( !IS_NULL_flt ( flt ) ) {
524
	if (!IS_NULL_flt(flt)) {
494
	bs = enc_float ( bs, flt, t ) ;
525
		bs = enc_float(bs, flt, t);
495
    } else {
526
	} else {
496
	char s [20] ;
527
		char s[20];
497
	sprintf_v ( s, "%d", v ) ;
528
		sprintf_v(s, "%d", v);
498
	ENC_make_floating ( bs ) ;
529
		ENC_make_floating(bs);
499
	bs = enc_flvar ( bs, t ) ;
530
		bs = enc_flvar(bs, t);
500
	ENC_to_nearest ( bs ) ;
531
		ENC_to_nearest(bs);
501
	ENC_false ( bs ) ;
532
		ENC_false(bs);
502
	ENC_make_string ( bs ) ;
533
		ENC_make_string(bs);
503
	bs = enc_ustring ( bs, ustrlit ( s ) ) ;
534
		bs = enc_ustring(bs, ustrlit(s));
504
	ENC_make_nat ( bs ) ;
535
		ENC_make_nat(bs);
505
	ENC_INT ( bs, 10 ) ;
536
		ENC_INT(bs, 10);
506
	bs = enc_snat ( bs, NULL_nat, 0, 0 ) ;
537
		bs = enc_snat(bs, NULL_nat, 0, 0);
507
    }
538
	}
508
    return ( bs ) ;
539
	return (bs);
509
}
540
}
510
 
541
 
511
 
542
 
512
/*
543
/*
513
    ENCODE A STRING LITERAL EXPRESSION
544
    ENCODE A STRING LITERAL EXPRESSION
514
 
545
 
515
    This routine adds the string literal str of type t to the bitstream
546
    This routine adds the string literal str of type t to the bitstream
516
    bs.  Note that the type determines the string length - the string
547
    bs.  Note that the type determines the string length - the string
517
    is truncated or padded with zeros as necessary (this includes the
548
    is truncated or padded with zeros as necessary (this includes the
518
    normal terminal zero for a string).
549
    normal terminal zero for a string).
519
*/
550
*/
520
 
551
 
521
BITSTREAM *enc_string
552
BITSTREAM *
522
    PROTO_N ( ( bs, str, t ) )
-
 
523
    PROTO_T ( BITSTREAM *bs X STRING str X TYPE t )
553
enc_string(BITSTREAM *bs, STRING str, TYPE t)
524
{
554
{
525
    unsigned long i, m ;
555
	unsigned long i, m;
526
    unsigned long d = 0 ;
556
	unsigned long d = 0;
527
    string s = DEREF_string ( str_simple_text ( str ) ) ;
557
	string s = DEREF_string(str_simple_text(str));
528
    unsigned long n = DEREF_ulong ( str_simple_len ( str ) ) ;
558
	unsigned long n = DEREF_ulong(str_simple_len(str));
529
    unsigned kind = DEREF_unsigned ( str_simple_kind ( str ) ) ;
559
	unsigned kind = DEREF_unsigned(str_simple_kind(str));
530
    if ( n == 0 ) {
560
	if (n == 0) {
531
	/* Allow for empty strings */
561
		/* Allow for empty strings */
532
	bs = enc_null_exp ( bs, t ) ;
562
		bs = enc_null_exp(bs, t);
533
	return ( bs ) ;
563
		return (bs);
534
    }
564
	}
535
    if ( IS_type_array ( t ) ) {
565
	if (IS_type_array(t)) {
536
	/* Find array size */
566
		/* Find array size */
537
	NAT sz = DEREF_nat ( type_array_size ( t ) ) ;
567
		NAT sz = DEREF_nat(type_array_size(t));
538
	m = get_nat_value ( sz ) ;
568
		m = get_nat_value(sz);
539
	if ( m < n ) {
569
		if (m < n) {
540
	    /* String truncation */
570
			/* String truncation */
541
	    n = m ;
571
			n = m;
542
	} else {
572
		} else {
543
	    d = m - n ;
573
			d = m - n;
544
	    if ( d <= STRING_PADDING ) {
574
			if (d <= STRING_PADDING) {
545
		/* Small padding */
575
				/* Small padding */
546
		d = 0 ;
576
				d = 0;
547
	    } else {
577
			} else {
548
		/* Large padding */
578
				/* Large padding */
549
		ENC_concat_nof ( bs ) ;
579
				ENC_concat_nof(bs);
550
		m = n ;
580
				m = n;
551
	    }
581
			}
552
	}
582
		}
553
	t = DEREF_type ( type_array_sub ( t ) ) ;
583
		t = DEREF_type(type_array_sub(t));
554
    } else {
584
	} else {
555
	m = n + 1 ;
585
		m = n + 1;
556
    }
-
 
557
    if ( kind & STRING_FAT ) {
-
 
558
	/* Fat character strings */
-
 
559
	unsigned mbits = 0 ;
-
 
560
	unsigned long maxc = 1 ;
-
 
561
	BASE_TYPE sign = btype_none ;
-
 
562
	unsigned bits = find_type_size ( t, &mbits, &sign ) ;
-
 
563
	if ( sign != btype_unsigned ) bits-- ;
-
 
564
	maxc <<= bits ;
-
 
565
	ENC_make_nof ( bs ) ;
-
 
566
	ENC_LIST ( bs, m ) ;
-
 
567
	for ( i = 0 ; i < n ; i++ ) {
-
 
568
	    TYPE u = t ;
-
 
569
	    int ch = CHAR_SIMPLE ;
-
 
570
	    unsigned long c = get_multi_char ( s, &ch ) ;
-
 
571
	    if ( ch == CHAR_SIMPLE ) c = to_ascii ( c, &ch ) ;
-
 
572
	    if ( maxc && c >= maxc ) {
-
 
573
		/* Character doesn't fit into type */
-
 
574
		ENC_change_variety ( bs ) ;
-
 
575
		bs = enc_error_treatment ( bs, u ) ;
-
 
576
		bs = enc_variety ( bs, u ) ;
-
 
577
		u = type_ulong ;
-
 
578
	    }
-
 
579
	    ENC_make_int ( bs ) ;
-
 
580
	    bs = enc_variety ( bs, u ) ;
-
 
581
	    ENC_make_signed_nat ( bs ) ;
-
 
582
	    ENC_OFF ( bs ) ;
-
 
583
	    ENC_INT ( bs, c ) ;
-
 
584
	    s += MULTI_WIDTH ;
-
 
585
	}
586
	}
586
	for ( ; i < m ; i++ ) {
587
	if (kind & STRING_FAT) {
587
	    /* Terminal zeros */
588
		/* Fat character strings */
-
 
589
		unsigned mbits = 0;
-
 
590
		unsigned long maxc = 1;
-
 
591
		BASE_TYPE sign = btype_none;
588
	    bs = enc_make_int ( bs, t, 0 ) ;
592
		unsigned bits = find_type_size(t, &mbits, &sign);
-
 
593
		if (sign != btype_unsigned) {
-
 
594
			bits--;
589
	}
595
		}
590
     } else {
596
		maxc <<= bits;
591
	ENC_make_nof_int ( bs ) ;
597
		ENC_make_nof(bs);
592
	bs = enc_variety ( bs, t ) ;
598
		ENC_LIST(bs, m);
593
	ENC_make_string ( bs ) ;
599
		for (i = 0; i < n; i++) {
-
 
600
			TYPE u = t;
-
 
601
			int ch = CHAR_SIMPLE;
-
 
602
			unsigned long c = get_multi_char(s, &ch);
594
	ENC_INT ( bs, BYTE_SIZE ) ;
603
			if (ch == CHAR_SIMPLE) {
595
	ENC_INT ( bs, m ) ;
604
				c = to_ascii(c, &ch);
-
 
605
			}
596
	if ( kind & STRING_MULTI ) {
606
			if (maxc && c >= maxc) {
597
	    for ( i = 0 ; i < n ; i++ ) {
607
				/* Character doesn't fit into type */
598
		int ch = CHAR_SIMPLE ;
608
				ENC_change_variety(bs);
599
		unsigned long c = get_multi_char ( s, &ch ) ;
609
				bs = enc_error_treatment(bs, u);
600
		if ( ch == CHAR_SIMPLE ) c = to_ascii ( c, &ch ) ;
610
				bs = enc_variety(bs, u);
-
 
611
				u = type_ulong;
-
 
612
			}
-
 
613
			ENC_make_int(bs);
-
 
614
			bs = enc_variety(bs, u);
-
 
615
			ENC_make_signed_nat(bs);
-
 
616
			ENC_OFF(bs);
601
		ENC_BITS ( bs, BYTE_SIZE, c ) ;
617
			ENC_INT(bs, c);
602
		s += MULTI_WIDTH ;
618
			s += MULTI_WIDTH;
-
 
619
		}
-
 
620
		for (; i < m; i++) {
-
 
621
			/* Terminal zeros */
-
 
622
			bs = enc_make_int(bs, t, 0);
603
	    }
623
		}
604
	} else {
624
	} else {
-
 
625
		ENC_make_nof_int(bs);
-
 
626
		bs = enc_variety(bs, t);
-
 
627
		ENC_make_string(bs);
-
 
628
		ENC_INT(bs, BYTE_SIZE);
-
 
629
		ENC_INT(bs, m);
-
 
630
		if (kind & STRING_MULTI) {
-
 
631
			for (i = 0; i < n; i++) {
-
 
632
				int ch = CHAR_SIMPLE;
-
 
633
				unsigned long c = get_multi_char(s, &ch);
-
 
634
				if (ch == CHAR_SIMPLE) {
-
 
635
					c = to_ascii(c, &ch);
-
 
636
				}
-
 
637
				ENC_BITS(bs, BYTE_SIZE, c);
-
 
638
				s += MULTI_WIDTH;
-
 
639
			}
-
 
640
		} else {
605
	    /* Simple string */
641
			/* Simple string */
606
	    bs = enc_ascii ( bs, n, s ) ;
642
			bs = enc_ascii(bs, n, s);
-
 
643
		}
-
 
644
		for (i = n; i < m; i++) {
-
 
645
			/* Terminal zeros */
-
 
646
			ENC_BITS(bs, BYTE_SIZE, 0);
-
 
647
		}
607
	}
648
	}
608
	for ( i = n ; i < m ; i++ ) {
-
 
609
	    /* Terminal zeros */
-
 
610
	    ENC_BITS ( bs, BYTE_SIZE, 0 ) ;
-
 
611
	}
-
 
612
    }
-
 
613
    if ( d ) {
649
	if (d) {
614
	/* Large padding */
650
		/* Large padding */
615
	ENC_n_copies ( bs ) ;
651
		ENC_n_copies(bs);
616
	ENC_make_nat ( bs ) ;
652
		ENC_make_nat(bs);
617
	ENC_INT ( bs, d ) ;
653
		ENC_INT(bs, d);
618
	bs = enc_make_int ( bs, t, 0 ) ;
654
		bs = enc_make_int(bs, t, 0);
619
    }
655
	}
620
    return ( bs ) ;
656
	return (bs);
621
}
657
}
622
 
658
 
623
 
659
 
624
/*
660
/*
625
    ENCODE A STRING LITERAL
661
    ENCODE A STRING LITERAL
626
 
662
 
627
    This routine adds the string literal str to the bitstream bs.
663
    This routine adds the string literal str to the bitstream bs.
628
*/
664
*/
629
 
665
 
630
BITSTREAM *enc_strlit
666
BITSTREAM *
631
    PROTO_N ( ( bs, str ) )
-
 
632
    PROTO_T ( BITSTREAM *bs X STRING str )
667
enc_strlit(BITSTREAM *bs, STRING str)
633
{
668
{
634
    string s = DEREF_string ( str_simple_text ( str ) ) ;
669
	string s = DEREF_string(str_simple_text(str));
635
    unsigned long n = DEREF_ulong ( str_simple_len ( str ) ) ;
670
	unsigned long n = DEREF_ulong(str_simple_len(str));
636
    unsigned kind = DEREF_unsigned ( str_simple_kind ( str ) ) ;
671
	unsigned kind = DEREF_unsigned(str_simple_kind(str));
637
    ENC_make_string ( bs ) ;
672
	ENC_make_string(bs);
638
    ENC_INT ( bs, BYTE_SIZE ) ;
673
	ENC_INT(bs, BYTE_SIZE);
639
    ENC_INT ( bs, n ) ;
674
	ENC_INT(bs, n);
640
    if ( kind & STRING_MULTI ) {
675
	if (kind & STRING_MULTI) {
641
	unsigned long i ;
676
		unsigned long i;
642
	for ( i = 0 ; i < n ; i++ ) {
677
		for (i = 0; i < n; i++) {
643
	    int ch = CHAR_SIMPLE ;
678
			int ch = CHAR_SIMPLE;
644
	    unsigned long c = get_multi_char ( s, &ch ) ;
679
			unsigned long c = get_multi_char(s, &ch);
645
	    if ( ch == CHAR_SIMPLE ) c = to_ascii ( c, &ch ) ;
680
			if (ch == CHAR_SIMPLE) {
-
 
681
				c = to_ascii(c, &ch);
-
 
682
			}
646
	    ENC_BITS ( bs, BYTE_SIZE, c ) ;
683
			ENC_BITS(bs, BYTE_SIZE, c);
647
	    s += MULTI_WIDTH ;
684
			s += MULTI_WIDTH;
-
 
685
		}
-
 
686
	} else {
-
 
687
		bs = enc_ascii(bs, n, s);
648
	}
688
	}
649
    } else {
-
 
650
	bs = enc_ascii ( bs, n, s ) ;
-
 
651
    }
-
 
652
    return ( bs ) ;
689
	return (bs);
653
}
690
}
654
 
691
 
655
 
692
 
656
/*
693
/*
657
    ENCODE A CHARACTER LITERAL EXPRESSION
694
    ENCODE A CHARACTER LITERAL EXPRESSION
Line 659... Line 696...
659
    This routine adds the character literal str of type t to the bitstream
696
    This routine adds the character literal str of type t to the bitstream
660
    bs.  u gives the actual literal type, from which it is cast to t.  Note
697
    bs.  u gives the actual literal type, from which it is cast to t.  Note
661
    that it is possible that str does not fit into u.
698
    that it is possible that str does not fit into u.
662
*/
699
*/
663
 
700
 
664
BITSTREAM *enc_char
701
BITSTREAM *
665
    PROTO_N ( ( bs, str, t, u ) )
-
 
666
    PROTO_T ( BITSTREAM *bs X STRING str X TYPE t X TYPE u )
702
enc_char(BITSTREAM *bs, STRING str, TYPE t, TYPE u)
667
{
703
{
668
    NAT n ;
704
	NAT n;
669
    TYPE w ;
705
	TYPE w;
670
    int convert_to_t ;
706
	int convert_to_t;
671
    int convert_to_u ;
707
	int convert_to_u;
672
    unsigned long v = DEREF_ulong ( str_simple_tok ( str ) ) ;
708
	unsigned long v = DEREF_ulong(str_simple_tok(str));
673
    if ( v == LINK_NONE ) {
709
	if (v == LINK_NONE) {
674
	/* Evaluate literal */
710
		/* Evaluate literal */
675
	n = eval_char_lit ( str ) ;
711
		n = eval_char_lit(str);
676
	v = DEREF_ulong ( str_simple_tok ( str ) ) ;
712
		v = DEREF_ulong(str_simple_tok(str));
677
	if ( v < 128 ) {
713
		if (v < 128) {
678
	    /* Small values are easy */
714
			/* Small values are easy */
679
	    bs = enc_make_int ( bs, t, ( int ) v ) ;
715
			bs = enc_make_int(bs, t,(int)v);
680
	    return ( bs ) ;
716
			return (bs);
681
	}
717
		}
682
    } else {
718
	} else {
683
	if ( v < 128 ) {
719
		if (v < 128) {
684
	    /* Small values are easy */
720
			/* Small values are easy */
685
	    bs = enc_make_int ( bs, t, ( int ) v ) ;
721
			bs = enc_make_int(bs, t,(int)v);
686
	    return ( bs ) ;
722
			return (bs);
687
	}
723
		}
688
	n = make_nat_value ( v ) ;
724
		n = make_nat_value(v);
689
    }
725
	}
690
    if ( check_nat_range ( u, n ) == 0 ) {
726
	if (check_nat_range(u, n) == 0) {
691
	if ( EQ_type ( t, u ) || check_nat_range ( t, n ) == 0 ) {
727
		if (EQ_type(t, u) || check_nat_range(t, n) == 0) {
692
	    /* Fits into both t and u */
728
			/* Fits into both t and u */
693
	    w = t ;
729
			w = t;
694
	    convert_to_t = 0 ;
730
			convert_to_t = 0;
-
 
731
			convert_to_u = 0;
-
 
732
		} else {
-
 
733
			/* Fits into u but not t */
-
 
734
			w = u;
-
 
735
			convert_to_t = 1;
695
	    convert_to_u = 0 ;
736
			convert_to_u = 0;
-
 
737
		}
696
	} else {
738
	} else {
697
	    /* Fits into u but not t */
-
 
698
	    w = u ;
-
 
699
	    convert_to_t = 1 ;
-
 
700
	    convert_to_u = 0 ;
-
 
701
	}
-
 
702
    } else {
-
 
703
	/* Doesn't fit into u */
739
		/* Doesn't fit into u */
704
	w = find_char_type ( n ) ;
740
		w = find_char_type(n);
705
	convert_to_t = 1 ;
741
		convert_to_t = 1;
706
	convert_to_u = 1 ;
742
		convert_to_u = 1;
707
    }
743
	}
708
    if ( convert_to_t ) {
744
	if (convert_to_t) {
709
	ENC_change_variety ( bs ) ;
745
		ENC_change_variety(bs);
710
	bs = enc_error_treatment ( bs, t ) ;
746
		bs = enc_error_treatment(bs, t);
711
	bs = enc_variety ( bs, t ) ;
747
		bs = enc_variety(bs, t);
712
    }
748
	}
713
    if ( convert_to_u && !EQ_type ( u, t ) ) {
749
	if (convert_to_u && !EQ_type(u, t)) {
714
	ENC_change_variety ( bs ) ;
750
		ENC_change_variety(bs);
715
	bs = enc_error_treatment ( bs, u ) ;
751
		bs = enc_error_treatment(bs, u);
716
	bs = enc_variety ( bs, u ) ;
752
		bs = enc_variety(bs, u);
717
    }
753
	}
718
    ENC_make_int ( bs ) ;
754
	ENC_make_int(bs);
719
    bs = enc_variety ( bs, w ) ;
755
	bs = enc_variety(bs, w);
720
    ENC_make_signed_nat ( bs ) ;
756
	ENC_make_signed_nat(bs);
721
    ENC_OFF ( bs ) ;
757
	ENC_OFF(bs);
722
    bs = enc_tdfint ( bs, n, 1 ) ;
758
	bs = enc_tdfint(bs, n, 1);
723
    return ( bs ) ;
759
	return (bs);
724
}
760
}
725
 
761
 
726
 
762
 
727
/*
763
/*
728
    FIND AN INTEGRAL TYPE
764
    FIND AN INTEGRAL TYPE
729
 
765
 
730
    This routine returns the integral type corresponding to the type t.
766
    This routine returns the integral type corresponding to the type t.
731
*/
767
*/
732
 
768
 
733
static INT_TYPE find_itype
769
static INT_TYPE
734
    PROTO_N ( ( t ) )
-
 
735
    PROTO_T ( TYPE t )
770
find_itype(TYPE t)
736
{
771
{
737
    INT_TYPE it ;
772
	INT_TYPE it;
738
    unsigned tag = TAG_type ( t ) ;
773
	unsigned tag = TAG_type(t);
739
    if ( tag == type_bitfield_tag ) {
774
	if (tag == type_bitfield_tag) {
740
	it = DEREF_itype ( type_bitfield_defn ( t ) ) ;
775
		it = DEREF_itype(type_bitfield_defn(t));
741
    } else {
776
	} else {
742
	if ( tag == type_enumerate_tag ) {
777
		if (tag == type_enumerate_tag) {
743
	    /* Allow for enumeration types */
778
			/* Allow for enumeration types */
744
	    ENUM_TYPE et = DEREF_etype ( type_enumerate_defn ( t ) ) ;
779
			ENUM_TYPE et = DEREF_etype(type_enumerate_defn(t));
745
	    t = DEREF_type ( etype_rep ( et ) ) ;
780
			t = DEREF_type(etype_rep(et));
746
	    tag = TAG_type ( t ) ;
781
			tag = TAG_type(t);
-
 
782
		}
-
 
783
		if (tag != type_integer_tag) {
-
 
784
			t = type_sint;
-
 
785
		}
-
 
786
		it = DEREF_itype(type_integer_rep(t));
747
	}
787
	}
748
	if ( tag != type_integer_tag ) t = type_sint ;
-
 
749
	it = DEREF_itype ( type_integer_rep ( t ) ) ;
-
 
750
    }
-
 
751
    return ( it ) ;
788
	return (it);
752
}
789
}
753
 
790
 
754
 
791
 
755
/*
792
/*
756
    ENCODE A TDF VARIETY NUMBER
793
    ENCODE A TDF VARIETY NUMBER
757
 
794
 
758
    This routine adds the code number of the integral type it to the
795
    This routine adds the code number of the integral type it to the
759
    bitstream bs as a TDF SIGNED NAT.
796
    bitstream bs as a TDF SIGNED NAT.
760
*/
797
*/
761
 
798
 
762
static BITSTREAM *enc_var_no
799
static BITSTREAM *
763
    PROTO_N ( ( bs, it, alt ) )
-
 
764
    PROTO_T ( BITSTREAM *bs X INT_TYPE it X int alt )
800
enc_var_no(BITSTREAM *bs, INT_TYPE it, int alt)
765
{
801
{
766
    ulong tok ;
802
	ulong tok;
767
    unsigned tag = TAG_itype ( it ) ;
803
	unsigned tag = TAG_itype(it);
768
    ASSERT ( ORDER_itype == 6 ) ;
804
	ASSERT(ORDER_itype == 6);
769
    switch ( tag ) {
805
	switch (tag) {
770
	case itype_basic_tag : {
806
	case itype_basic_tag: {
771
	    /* Built-in integral types */
807
		/* Built-in integral types */
772
	    BUILTIN_TYPE n = DEREF_ntype ( itype_basic_no ( it ) ) ;
808
		BUILTIN_TYPE n = DEREF_ntype(itype_basic_no(it));
773
	    unsigned m = base_token [n].no ;
809
		unsigned m = base_token[n].no;
-
 
810
		if (alt) {
774
	    if ( alt ) m = base_token [n].alt ;
811
			m = base_token[n].alt;
-
 
812
		}
775
	    if ( m != ARITH_none ) {
813
		if (m != ARITH_none) {
776
		/* Basic types are easy */
814
			/* Basic types are easy */
777
		bs = enc_make_snat ( bs, ( int ) m ) ;
815
			bs = enc_make_snat(bs,(int)m);
778
		return ( bs ) ;
816
			return (bs);
779
	    }
817
		}
780
	    break ;
818
		break;
781
	}
819
	}
782
	case itype_bitfield_tag : {
820
	case itype_bitfield_tag: {
783
	    /* Bitfield types */
821
		/* Bitfield types */
784
	    TYPE s = DEREF_type ( itype_bitfield_sub ( it ) ) ;
822
		TYPE s = DEREF_type(itype_bitfield_sub(it));
785
	    INT_TYPE is = find_itype ( s ) ;
823
		INT_TYPE is = find_itype(s);
786
	    bs = enc_var_no ( bs, is, alt ) ;
824
		bs = enc_var_no(bs, is, alt);
787
	    return ( bs ) ;
825
		return (bs);
788
	}
826
	}
789
	case itype_token_tag : {
827
	case itype_token_tag: {
790
	    /* Tokenised types */
828
		/* Tokenised types */
791
	    IDENTIFIER tk = DEREF_id ( itype_token_tok ( it ) ) ;
829
		IDENTIFIER tk = DEREF_id(itype_token_tok(it));
792
	    LIST ( TOKEN ) args = DEREF_list ( itype_token_args ( it ) ) ;
830
		LIST(TOKEN)args = DEREF_list(itype_token_args(it));
793
	    bs = enc_token ( bs, tk, args ) ;
831
		bs = enc_token(bs, tk, args);
794
	    return ( bs ) ;
832
		return (bs);
795
	}
833
	}
796
    }
834
	}
797
 
835
 
798
    /* Find the token number */
836
	/* Find the token number */
799
    tok = DEREF_ulong ( itype_ntok ( it ) ) ;
837
	tok = DEREF_ulong(itype_ntok(it));
800
    if ( tok == LINK_NONE ) {
838
	if (tok == LINK_NONE) {
801
	if ( tag == itype_basic_tag ) {
839
		if (tag == itype_basic_tag) {
802
	    /* Look up special token number */
840
			/* Look up special token number */
803
	    BUILTIN_TYPE n = DEREF_ntype ( itype_basic_no ( it ) ) ;
841
			BUILTIN_TYPE n = DEREF_ntype(itype_basic_no(it));
804
	    int tn = base_token [n].tok ;
842
			int tn = base_token[n].tok;
805
	    tok = special_no ( tn ) ;
843
			tok = special_no(tn);
806
	    COPY_ulong ( itype_ntok ( it ), tok ) ;
844
			COPY_ulong(itype_ntok(it), tok);
807
	} else {
845
		} else {
808
	    /* Compound integral types */
846
			/* Compound integral types */
809
	    string s = NULL ;
847
			string s = NULL;
810
	    BITSTREAM *ts, *us ;
848
			BITSTREAM *ts, *us;
811
	    if ( output_all ) {
849
			if (output_all) {
812
		TYPE t = make_itype ( it, it ) ;
850
				TYPE t = make_itype(it, it);
813
		s = mangle_tname ( "~cpp.itype_no.", t ) ;
851
				s = mangle_tname("~cpp.itype_no.", t);
814
	    }
852
			}
815
	    tok = capsule_no ( s, VAR_token ) ;
853
			tok = capsule_no(s, VAR_token);
816
	    COPY_ulong ( itype_ntok ( it ), tok ) ;
854
			COPY_ulong(itype_ntok(it), tok);
817
	    ts = enc_tokdef_start ( tok, "Z", NIL ( ulong ), 1 ) ;
855
			ts = enc_tokdef_start(tok, "Z", NIL(ulong), 1);
818
	    us = start_bitstream ( NIL ( FILE ), ts->link ) ;
856
			us = start_bitstream(NIL(FILE), ts->link);
819
	    switch ( tag ) {
857
			switch (tag) {
820
		case itype_promote_tag : {
858
			case itype_promote_tag: {
821
		    /* Promoted integral types */
859
				/* Promoted integral types */
-
 
860
				INT_TYPE is =
822
		    INT_TYPE is = DEREF_itype ( itype_promote_arg ( it ) ) ;
861
				    DEREF_itype(itype_promote_arg(it));
823
		    ts = enc_special ( ts, TOK_promote ) ;
862
				ts = enc_special(ts, TOK_promote);
824
		    us = enc_var_no ( us, is, 0 ) ;
863
				us = enc_var_no(us, is, 0);
825
		    break ;
864
				break;
826
		}
865
			}
827
		case itype_arith_tag : {
866
			case itype_arith_tag: {
828
		    /* Arithmetic integral types */
867
				/* Arithmetic integral types */
829
		    INT_TYPE is = DEREF_itype ( itype_arith_arg1 ( it ) ) ;
868
				INT_TYPE is = DEREF_itype(itype_arith_arg1(it));
830
		    INT_TYPE ir = DEREF_itype ( itype_arith_arg2 ( it ) ) ;
869
				INT_TYPE ir = DEREF_itype(itype_arith_arg2(it));
831
		    ts = enc_special ( ts, TOK_arith_type ) ;
870
				ts = enc_special(ts, TOK_arith_type);
832
		    us = enc_var_no ( us, is, 0 ) ;
871
				us = enc_var_no(us, is, 0);
833
		    us = enc_var_no ( us, ir, 0 ) ;
872
				us = enc_var_no(us, ir, 0);
834
		    break ;
873
				break;
835
		}
874
			}
836
		case itype_literal_tag : {
875
			case itype_literal_tag: {
837
		    /* Literal integral types */
876
				/* Literal integral types */
838
		    NAT n = DEREF_nat ( itype_literal_nat ( it ) ) ;
877
				NAT n = DEREF_nat(itype_literal_nat(it));
-
 
878
				IDENTIFIER tid =
839
		    IDENTIFIER tid = DEREF_id ( itype_literal_tok ( it ) ) ;
879
				    DEREF_id(itype_literal_tok(it));
840
		    if ( !IS_NULL_id ( tid ) ) {
880
				if (!IS_NULL_id(tid)) {
841
			ulong tn ;
881
					ulong tn;
842
			IGNORE enc_tokdef ( tid, 0 ) ;
882
					IGNORE enc_tokdef(tid, 0);
843
			tn = unit_no ( ts, tid, VAR_token, 0 ) ;
883
					tn = unit_no(ts, tid, VAR_token, 0);
844
			ENC_signed_nat_apply_token ( ts ) ;
884
					ENC_signed_nat_apply_token(ts);
845
			ENC_make_tok ( ts, tn ) ;
885
					ENC_make_tok(ts, tn);
846
		    } else {
886
				} else {
847
			int spec = DEREF_int ( itype_literal_spec ( it ) ) ;
887
					int spec = DEREF_int(itype_literal_spec(it));
848
			ts = enc_special ( ts, spec ) ;
888
					ts = enc_special(ts, spec);
849
		    }
889
				}
850
		    us = enc_snat ( us, n, 0, 0 ) ;
890
				us = enc_snat(us, n, 0, 0);
851
		    break ;
891
				break;
852
		}
892
			}
853
	    }
893
			}
854
	    ts = enc_bitstream ( ts, us ) ;
894
			ts = enc_bitstream(ts, us);
855
	    enc_tokdef_end ( tok, ts ) ;
895
			enc_tokdef_end(tok, ts);
856
	}
896
		}
857
    }
897
	}
858
 
898
 
859
    /* Encode the token application */
899
	/* Encode the token application */
860
    tok = link_no ( bs, tok, VAR_token ) ;
900
	tok = link_no(bs, tok, VAR_token);
861
    ENC_signed_nat_apply_token ( bs ) ;
901
	ENC_signed_nat_apply_token(bs);
862
    ENC_make_tok ( bs, tok ) ;
902
	ENC_make_tok(bs, tok);
863
    ENC_LEN_SMALL ( bs, 0 ) ;
903
	ENC_LEN_SMALL(bs, 0);
864
    return ( bs ) ;
904
	return (bs);
865
}
905
}
866
 
906
 
867
 
907
 
868
/*
908
/*
869
    ENCODE A TDF VARIETY
909
    ENCODE A TDF VARIETY
870
 
910
 
871
    This routine adds the integral type t to the bitstream bs as a
911
    This routine adds the integral type t to the bitstream bs as a
872
    TDF VARIETY.  Note that all integral types are tokenised.
912
    TDF VARIETY.  Note that all integral types are tokenised.
873
*/
913
*/
874
 
914
 
875
BITSTREAM *enc_variety
915
BITSTREAM *
876
    PROTO_N ( ( bs, t ) )
-
 
877
    PROTO_T ( BITSTREAM *bs X TYPE t )
916
enc_variety(BITSTREAM *bs, TYPE t)
878
{
917
{
879
    /* Find the token number */
918
	/* Find the token number */
880
    INT_TYPE it = find_itype ( t ) ;
919
	INT_TYPE it = find_itype(t);
881
    unsigned tag = TAG_itype ( it ) ;
920
	unsigned tag = TAG_itype(it);
882
    ulong tok = DEREF_ulong ( itype_itok ( it ) ) ;
921
	ulong tok = DEREF_ulong(itype_itok(it));
883
    if ( tok == LINK_NONE ) {
922
	if (tok == LINK_NONE) {
884
	ASSERT ( ORDER_itype == 6 ) ;
923
		ASSERT(ORDER_itype == 6);
885
	switch ( tag ) {
924
		switch (tag) {
886
	    case itype_basic_tag : {
925
		case itype_basic_tag: {
887
		/* Built-in integral types */
926
			/* Built-in integral types */
888
		BUILTIN_TYPE n = DEREF_ntype ( itype_basic_no ( it ) ) ;
927
			BUILTIN_TYPE n = DEREF_ntype(itype_basic_no(it));
889
		unsigned m = base_token [n].no ;
928
			unsigned m = base_token[n].no;
890
		if ( m != ARITH_none ) {
929
			if (m != ARITH_none) {
891
		    /* Look up special token number */
930
				/* Look up special token number */
892
		    int tn = base_token [n].tok ;
931
				int tn = base_token[n].tok;
893
		    tok = special_no ( tn ) ;
932
				tok = special_no(tn);
894
		    COPY_ulong ( itype_itok ( it ), tok ) ;
933
				COPY_ulong(itype_itok(it), tok);
895
		}
934
			}
896
		break ;
935
			break;
897
	    }
936
		}
898
	    case itype_token_tag : {
937
		case itype_token_tag: {
899
		/* Tokenised integral types */
938
			/* Tokenised integral types */
900
		IDENTIFIER tk = DEREF_id ( itype_token_tok ( it ) ) ;
939
			IDENTIFIER tk = DEREF_id(itype_token_tok(it));
901
		DECL_SPEC ds = DEREF_dspec ( id_storage ( tk ) ) ;
940
			DECL_SPEC ds = DEREF_dspec(id_storage(tk));
902
		if ( ds & dspec_auto ) {
941
			if (ds & dspec_auto) {
903
		    /* Integral token parameters */
942
				/* Integral token parameters */
904
		    BITSTREAM *ts ;
943
				BITSTREAM *ts;
905
		    bs = enc_special ( bs, TOK_convert ) ;
944
				bs = enc_special(bs, TOK_convert);
906
		    ts = start_bitstream ( NIL ( FILE ), bs->link ) ;
945
				ts = start_bitstream(NIL(FILE), bs->link);
907
		    ts = enc_var_no ( ts, it, 0 ) ;
946
				ts = enc_var_no(ts, it, 0);
908
		    bs = enc_bitstream ( bs, ts ) ;
947
				bs = enc_bitstream(bs, ts);
909
		    return ( bs ) ;
948
				return (bs);
910
		}
949
			}
911
		break ;
950
			break;
912
	    }
951
		}
913
	}
952
		}
914
	if ( tok == LINK_NONE ) {
953
		if (tok == LINK_NONE) {
915
	    /* Define the variety token */
954
			/* Define the variety token */
916
	    string s = NULL ;
955
			string s = NULL;
917
	    if ( output_all ) {
956
			if (output_all) {
918
		t = qualify_type ( t, cv_none, 0 ) ;
957
				t = qualify_type(t, cv_none, 0);
919
		s = mangle_tname ( "~cpp.itype.", t ) ;
958
				s = mangle_tname("~cpp.itype.", t);
920
	    }
959
			}
921
	    tok = capsule_no ( s, VAR_token ) ;
960
			tok = capsule_no(s, VAR_token);
922
	    COPY_ulong ( itype_itok ( it ), tok ) ;
961
			COPY_ulong(itype_itok(it), tok);
923
	    if ( tag == itype_bitfield_tag ) {
962
			if (tag == itype_bitfield_tag) {
924
		/* Bitfield types */
963
				/* Bitfield types */
925
		BITSTREAM *ts ;
964
				BITSTREAM *ts;
926
		NAT n = DEREF_nat ( itype_bitfield_size ( it ) ) ;
965
				NAT n = DEREF_nat(itype_bitfield_size(it));
-
 
966
				BASE_TYPE bt =
927
		BASE_TYPE bt = DEREF_btype ( itype_bitfield_rep ( it ) ) ;
967
				    DEREF_btype(itype_bitfield_rep(it));
928
		ts = enc_tokdef_start ( tok, "U", NIL ( ulong ), 1 ) ;
968
				ts = enc_tokdef_start(tok, "U", NIL(ulong), 1);
929
		ENC_bfvar_bits ( ts ) ;
969
				ENC_bfvar_bits(ts);
930
		if ( bt & btype_signed ) {
970
				if (bt & btype_signed) {
931
		    ENC_true ( ts ) ;
971
					ENC_true(ts);
932
		} else if ( bt & btype_unsigned ) {
972
				} else if (bt & btype_unsigned) {
933
		    ENC_false ( ts ) ;
973
					ENC_false(ts);
934
		} else {
974
				} else {
935
		    BITSTREAM *us ;
975
					BITSTREAM *us;
936
		    ts = enc_special ( ts, TOK_bitf_sign ) ;
976
					ts = enc_special(ts, TOK_bitf_sign);
937
		    us = start_bitstream ( NIL ( FILE ), ts->link ) ;
977
					us = start_bitstream(NIL(FILE),
-
 
978
							     ts->link);
938
		    us = enc_var_no ( us, it, 0 ) ;
979
					us = enc_var_no(us, it, 0);
939
		    ts = enc_bitstream ( ts, us ) ;
980
					ts = enc_bitstream(ts, us);
940
		}
981
				}
941
		ts = enc_nat ( ts, n, 1 ) ;
982
				ts = enc_nat(ts, n, 1);
942
		enc_tokdef_end ( tok, ts ) ;
983
				enc_tokdef_end(tok, ts);
943
	    } else {
984
			} else {
944
		/* Integral types */
985
				/* Integral types */
945
		BITSTREAM *ts, *us ;
986
				BITSTREAM *ts, *us;
946
		ts = enc_tokdef_start ( tok, "V", NIL ( ulong ), 1 ) ;
987
				ts = enc_tokdef_start(tok, "V", NIL(ulong), 1);
947
		ts = enc_special ( ts, TOK_convert ) ;
988
				ts = enc_special(ts, TOK_convert);
948
		us = start_bitstream ( NIL ( FILE ), ts->link ) ;
989
				us = start_bitstream(NIL(FILE), ts->link);
949
		us = enc_var_no ( us, it, 0 ) ;
990
				us = enc_var_no(us, it, 0);
950
		ts = enc_bitstream ( ts, us ) ;
991
				ts = enc_bitstream(ts, us);
951
		enc_tokdef_end ( tok, ts ) ;
992
				enc_tokdef_end(tok, ts);
952
	    }
993
			}
953
	}
994
		}
954
    }
995
	}
955
 
996
 
956
    /* Encode the token application */
997
	/* Encode the token application */
957
    tok = link_no ( bs, tok, VAR_token ) ;
998
	tok = link_no(bs, tok, VAR_token);
958
    if ( tag == itype_bitfield_tag ) {
999
	if (tag == itype_bitfield_tag) {
959
	ENC_bfvar_apply_token ( bs ) ;
1000
		ENC_bfvar_apply_token(bs);
960
    } else {
1001
	} else {
961
	ENC_var_apply_token ( bs ) ;
1002
		ENC_var_apply_token(bs);
962
    }
1003
	}
963
    ENC_make_tok ( bs, tok ) ;
1004
	ENC_make_tok(bs, tok);
964
    ENC_LEN_SMALL ( bs, 0 ) ;
1005
	ENC_LEN_SMALL(bs, 0);
965
    return ( bs ) ;
1006
	return (bs);
966
}
1007
}
967
 
1008
 
968
 
1009
 
969
/*
1010
/*
970
    ENCODE A TDF FLOATING VARIETY NUMBER
1011
    ENCODE A TDF FLOATING VARIETY NUMBER
971
 
1012
 
972
    This routine adds the code number of the floating point type ft to
1013
    This routine adds the code number of the floating point type ft to
973
    the bitstream bs as a TDF SIGNED NAT.
1014
    the bitstream bs as a TDF SIGNED NAT.
974
*/
1015
*/
975
 
1016
 
976
static BITSTREAM *enc_flvar_no
1017
static BITSTREAM *
977
    PROTO_N ( ( bs, ft ) )
-
 
978
    PROTO_T ( BITSTREAM *bs X FLOAT_TYPE ft )
1018
enc_flvar_no(BITSTREAM *bs, FLOAT_TYPE ft)
979
{
1019
{
980
    ulong tok ;
1020
	ulong tok;
981
    unsigned tag = TAG_ftype ( ft ) ;
1021
	unsigned tag = TAG_ftype(ft);
982
    ASSERT ( ORDER_ftype == 4 ) ;
1022
	ASSERT(ORDER_ftype == 4);
983
    switch ( tag ) {
1023
	switch (tag) {
984
	case ftype_basic_tag : {
1024
	case ftype_basic_tag: {
985
	    /* Built-in floating types */
1025
		/* Built-in floating types */
986
	    BUILTIN_TYPE n = DEREF_ntype ( ftype_basic_no ( ft ) ) ;
1026
		BUILTIN_TYPE n = DEREF_ntype(ftype_basic_no(ft));
987
	    unsigned m = base_token [n].no ;
1027
		unsigned m = base_token[n].no;
988
	    if ( m != ARITH_none ) {
1028
		if (m != ARITH_none) {
989
		/* Basic types are easy */
1029
			/* Basic types are easy */
990
		bs = enc_make_snat ( bs, ( int ) m ) ;
1030
			bs = enc_make_snat(bs,(int)m);
991
		return ( bs ) ;
1031
			return (bs);
992
	    }
1032
		}
993
	    break ;
1033
		break;
994
	}
1034
	}
995
	case ftype_token_tag : {
1035
	case ftype_token_tag: {
996
	    /* Tokenised types */
1036
		/* Tokenised types */
997
	    IDENTIFIER tk = DEREF_id ( ftype_token_tok ( ft ) ) ;
1037
		IDENTIFIER tk = DEREF_id(ftype_token_tok(ft));
998
	    LIST ( TOKEN ) args = DEREF_list ( ftype_token_args ( ft ) ) ;
1038
		LIST(TOKEN)args = DEREF_list(ftype_token_args(ft));
999
	    bs = enc_token ( bs, tk, args ) ;
1039
		bs = enc_token(bs, tk, args);
1000
	    return ( bs ) ;
1040
		return (bs);
1001
	}
1041
	}
1002
    }
1042
	}
1003
 
1043
 
1004
    /* Find the token number */
1044
	/* Find the token number */
1005
    tok = DEREF_ulong ( ftype_ntok ( ft ) ) ;
1045
	tok = DEREF_ulong(ftype_ntok(ft));
1006
    if ( tok == LINK_NONE ) {
1046
	if (tok == LINK_NONE) {
1007
	if ( tag == ftype_basic_tag ) {
1047
		if (tag == ftype_basic_tag) {
1008
	    /* Look up special token number */
1048
			/* Look up special token number */
1009
	    BUILTIN_TYPE n = DEREF_ntype ( ftype_basic_no ( ft ) ) ;
1049
			BUILTIN_TYPE n = DEREF_ntype(ftype_basic_no(ft));
1010
	    int tn = base_token [n].tok ;
1050
			int tn = base_token[n].tok;
1011
	    tok = special_no ( tn ) ;
1051
			tok = special_no(tn);
1012
	    COPY_ulong ( ftype_ntok ( ft ), tok ) ;
1052
			COPY_ulong(ftype_ntok(ft), tok);
1013
	} else {
1053
		} else {
1014
	    /* Compound floating types */
1054
			/* Compound floating types */
1015
	    string s = NULL ;
1055
			string s = NULL;
1016
	    BITSTREAM *ts, *us ;
1056
			BITSTREAM *ts, *us;
1017
	    if ( output_all ) {
1057
			if (output_all) {
1018
		TYPE t = make_ftype ( ft, NULL_ftype ) ;
1058
				TYPE t = make_ftype(ft, NULL_ftype);
1019
		s = mangle_tname ( "~cpp.ftype_no.", t ) ;
1059
				s = mangle_tname("~cpp.ftype_no.", t);
1020
	    }
1060
			}
1021
	    tok = capsule_no ( s, VAR_token ) ;
1061
			tok = capsule_no(s, VAR_token);
1022
	    COPY_ulong ( ftype_ntok ( ft ), tok ) ;
1062
			COPY_ulong(ftype_ntok(ft), tok);
1023
	    ts = enc_tokdef_start ( tok, "Z", NIL ( ulong ), 1 ) ;
1063
			ts = enc_tokdef_start(tok, "Z", NIL(ulong), 1);
1024
	    us = start_bitstream ( NIL ( FILE ), ts->link ) ;
1064
			us = start_bitstream(NIL(FILE), ts->link);
1025
	    switch ( tag ) {
1065
			switch (tag) {
1026
		case ftype_arg_promote_tag : {
1066
			case ftype_arg_promote_tag: {
1027
		    /* Promoted floating types */
1067
				/* Promoted floating types */
1028
		    FLOAT_TYPE fs ;
1068
				FLOAT_TYPE fs;
1029
		    fs = DEREF_ftype ( ftype_arg_promote_arg ( ft ) ) ;
1069
				fs = DEREF_ftype(ftype_arg_promote_arg(ft));
1030
		    ts = enc_special ( ts, TOK_promote ) ;
1070
				ts = enc_special(ts, TOK_promote);
1031
		    us = enc_flvar_no ( us, fs ) ;
1071
				us = enc_flvar_no(us, fs);
1032
		    break ;
1072
				break;
1033
		}
1073
			}
1034
		case ftype_arith_tag : {
1074
			case ftype_arith_tag: {
1035
		    /* Arithmetic floating types */
1075
				/* Arithmetic floating types */
-
 
1076
				FLOAT_TYPE fs =
1036
		    FLOAT_TYPE fs = DEREF_ftype ( ftype_arith_arg1 ( ft ) ) ;
1077
				    DEREF_ftype(ftype_arith_arg1(ft));
-
 
1078
				FLOAT_TYPE fr =
1037
		    FLOAT_TYPE fr = DEREF_ftype ( ftype_arith_arg2 ( ft ) ) ;
1079
				    DEREF_ftype(ftype_arith_arg2(ft));
1038
		    ts = enc_special ( ts, TOK_arith_type ) ;
1080
				ts = enc_special(ts, TOK_arith_type);
1039
		    us = enc_flvar_no ( us, fs ) ;
1081
				us = enc_flvar_no(us, fs);
1040
		    us = enc_flvar_no ( us, fr ) ;
1082
				us = enc_flvar_no(us, fr);
1041
		    break ;
1083
				break;
1042
		}
1084
			}
1043
	    }
1085
			}
1044
	    ts = enc_bitstream ( ts, us ) ;
1086
			ts = enc_bitstream(ts, us);
1045
	    enc_tokdef_end ( tok, ts ) ;
1087
			enc_tokdef_end(tok, ts);
1046
	}
1088
		}
1047
    }
1089
	}
1048
 
1090
 
1049
    /* Encode the token application */
1091
	/* Encode the token application */
1050
    tok = link_no ( bs, tok, VAR_token ) ;
1092
	tok = link_no(bs, tok, VAR_token);
1051
    ENC_signed_nat_apply_token ( bs ) ;
1093
	ENC_signed_nat_apply_token(bs);
1052
    ENC_make_tok ( bs, tok ) ;
1094
	ENC_make_tok(bs, tok);
1053
    ENC_LEN_SMALL ( bs, 0 ) ;
1095
	ENC_LEN_SMALL(bs, 0);
1054
    return ( bs ) ;
1096
	return (bs);
1055
}
1097
}
1056
 
1098
 
1057
 
1099
 
1058
/*
1100
/*
1059
    ENCODE A TDF FLOATING VARIETY
1101
    ENCODE A TDF FLOATING VARIETY
1060
 
1102
 
1061
    This routine adds the floating point type t to the bitstream bs as
1103
    This routine adds the floating point type t to the bitstream bs as
1062
    a TDF FLOATING VARIETY.  Note that all floating point types are
1104
    a TDF FLOATING VARIETY.  Note that all floating point types are
1063
    tokenised.
1105
    tokenised.
1064
*/
1106
*/
1065
 
1107
 
1066
BITSTREAM *enc_flvar
1108
BITSTREAM *
1067
    PROTO_N ( ( bs, t ) )
-
 
1068
    PROTO_T ( BITSTREAM *bs X TYPE t )
1109
enc_flvar(BITSTREAM *bs, TYPE t)
1069
{
1110
{
1070
    ulong tok ;
1111
	ulong tok;
1071
    FLOAT_TYPE ft ;
1112
	FLOAT_TYPE ft;
1072
    if ( !IS_type_floating ( t ) ) t = type_double ;
-
 
1073
    ft = DEREF_ftype ( type_floating_rep ( t ) ) ;
-
 
1074
 
-
 
1075
    /* Find the token number */
-
 
1076
    tok = DEREF_ulong ( ftype_ftok ( ft ) ) ;
-
 
1077
    if ( tok == LINK_NONE ) {
-
 
1078
	if ( IS_ftype_basic ( ft ) ) {
1113
	if (!IS_type_floating(t)) {
1079
	    /* Built-in floating point types */
-
 
1080
	    BUILTIN_TYPE n = DEREF_ntype ( ftype_basic_no ( ft ) ) ;
-
 
1081
	    unsigned m = base_token [n].no ;
-
 
1082
	    if ( m != ARITH_none ) {
-
 
1083
		/* Look up special token number */
-
 
1084
		int tn = base_token [n].tok ;
-
 
1085
		tok = special_no ( tn ) ;
1114
		t = type_double;
1086
		COPY_ulong ( ftype_ftok ( ft ), tok ) ;
-
 
1087
	    }
-
 
1088
	} else if ( IS_ftype_token ( ft ) ) {
-
 
1089
	    /* Tokenised floating point types */
-
 
1090
	    IDENTIFIER tk = DEREF_id ( ftype_token_tok ( ft ) ) ;
-
 
1091
	    DECL_SPEC ds = DEREF_dspec ( id_storage ( tk ) ) ;
-
 
1092
	    if ( ds & dspec_auto ) {
-
 
1093
		/* Floating point token parameters */
-
 
1094
		BITSTREAM *ts ;
-
 
1095
		bs = enc_special ( bs, TOK_convert ) ;
-
 
1096
		ts = start_bitstream ( NIL ( FILE ), bs->link ) ;
-
 
1097
		ts = enc_flvar_no ( ts, ft ) ;
-
 
1098
		bs = enc_bitstream ( bs, ts ) ;
-
 
1099
		return ( bs ) ;
-
 
1100
	    }
-
 
1101
	}
1115
	}
-
 
1116
	ft = DEREF_ftype(type_floating_rep(t));
-
 
1117
 
-
 
1118
	/* Find the token number */
-
 
1119
	tok = DEREF_ulong(ftype_ftok(ft));
1102
	if ( tok == LINK_NONE ) {
1120
	if (tok == LINK_NONE) {
-
 
1121
		if (IS_ftype_basic(ft)) {
-
 
1122
			/* Built-in floating point types */
-
 
1123
			BUILTIN_TYPE n = DEREF_ntype(ftype_basic_no(ft));
-
 
1124
			unsigned m = base_token[n].no;
-
 
1125
			if (m != ARITH_none) {
-
 
1126
				/* Look up special token number */
-
 
1127
				int tn = base_token[n].tok;
-
 
1128
				tok = special_no(tn);
-
 
1129
				COPY_ulong(ftype_ftok(ft), tok);
-
 
1130
			}
-
 
1131
		} else if (IS_ftype_token(ft)) {
-
 
1132
			/* Tokenised floating point types */
-
 
1133
			IDENTIFIER tk = DEREF_id(ftype_token_tok(ft));
-
 
1134
			DECL_SPEC ds = DEREF_dspec(id_storage(tk));
-
 
1135
			if (ds & dspec_auto) {
-
 
1136
				/* Floating point token parameters */
-
 
1137
				BITSTREAM *ts;
-
 
1138
				bs = enc_special(bs, TOK_convert);
-
 
1139
				ts = start_bitstream(NIL(FILE), bs->link);
-
 
1140
				ts = enc_flvar_no(ts, ft);
-
 
1141
				bs = enc_bitstream(bs, ts);
-
 
1142
				return (bs);
-
 
1143
			}
-
 
1144
		}
-
 
1145
		if (tok == LINK_NONE) {
1103
	    /* Define the variety token */
1146
			/* Define the variety token */
1104
	    string s = NULL ;
1147
			string s = NULL;
1105
	    BITSTREAM *ts, *us ;
1148
			BITSTREAM *ts, *us;
1106
	    if ( output_all ) {
1149
			if (output_all) {
1107
		t = qualify_type ( t, cv_none, 0 ) ;
1150
				t = qualify_type(t, cv_none, 0);
1108
		s = mangle_tname ( "~cpp.ftype.", t ) ;
1151
				s = mangle_tname("~cpp.ftype.", t);
1109
	    }
1152
			}
1110
	    tok = capsule_no ( s, VAR_token ) ;
1153
			tok = capsule_no(s, VAR_token);
1111
	    COPY_ulong ( ftype_ftok ( ft ), tok ) ;
1154
			COPY_ulong(ftype_ftok(ft), tok);
1112
	    ts = enc_tokdef_start ( tok, "F", NIL ( ulong ), 1 ) ;
1155
			ts = enc_tokdef_start(tok, "F", NIL(ulong), 1);
1113
	    ts = enc_special ( ts, TOK_convert ) ;
1156
			ts = enc_special(ts, TOK_convert);
1114
	    us = start_bitstream ( NIL ( FILE ), ts->link ) ;
1157
			us = start_bitstream(NIL(FILE), ts->link);
1115
	    us = enc_flvar_no ( us, ft ) ;
1158
			us = enc_flvar_no(us, ft);
1116
	    ts = enc_bitstream ( ts, us ) ;
1159
			ts = enc_bitstream(ts, us);
1117
	    enc_tokdef_end ( tok, ts ) ;
1160
			enc_tokdef_end(tok, ts);
-
 
1161
		}
1118
	}
1162
	}
1119
    }
-
 
1120
 
1163
 
1121
    /* Encode the token application */
1164
	/* Encode the token application */
1122
    tok = link_no ( bs, tok, VAR_token ) ;
1165
	tok = link_no(bs, tok, VAR_token);
1123
    ENC_flvar_apply_token ( bs ) ;
1166
	ENC_flvar_apply_token(bs);
1124
    ENC_make_tok ( bs, tok ) ;
1167
	ENC_make_tok(bs, tok);
1125
    ENC_LEN_SMALL ( bs, 0 ) ;
1168
	ENC_LEN_SMALL(bs, 0);
1126
    return ( bs ) ;
1169
	return (bs);
1127
}
1170
}
1128
 
1171
 
1129
 
1172
 
1130
/*
1173
/*
1131
    ENCODE A TDF BITFIELD VARIETY
1174
    ENCODE A TDF BITFIELD VARIETY
1132
 
1175
 
1133
    This routine adds the bitfield type t to the bitstream bs as a TDF
1176
    This routine adds the bitfield type t to the bitstream bs as a TDF
1134
    FLOATING BITFIELD.
1177
    FLOATING BITFIELD.
1135
*/
1178
*/
1136
 
1179
 
1137
BITSTREAM *enc_bfvar
1180
BITSTREAM *
1138
    PROTO_N ( ( bs, t ) )
-
 
1139
    PROTO_T ( BITSTREAM *bs X TYPE t )
1181
enc_bfvar(BITSTREAM *bs, TYPE t)
1140
{
1182
{
1141
    INT_TYPE it = DEREF_itype ( type_bitfield_defn ( t ) ) ;
1183
	INT_TYPE it = DEREF_itype(type_bitfield_defn(t));
1142
    ulong m = DEREF_ulong ( itype_itok ( it ) ) ;
1184
	ulong m = DEREF_ulong(itype_itok(it));
1143
    if ( m == LINK_NONE ) {
1185
	if (m == LINK_NONE) {
1144
	static LIST ( INT_TYPE ) bftypes = NULL_list ( INT_TYPE ) ;
1186
		static LIST(INT_TYPE)bftypes = NULL_list(INT_TYPE);
1145
	LIST ( INT_TYPE ) p = bftypes ;
1187
		LIST(INT_TYPE)p = bftypes;
1146
	while ( !IS_NULL_list ( p ) ) {
1188
		while (!IS_NULL_list(p)) {
1147
	    INT_TYPE is = DEREF_itype ( HEAD_list ( p ) ) ;
1189
			INT_TYPE is = DEREF_itype(HEAD_list(p));
1148
	    if ( eq_itype ( it, is ) ) {
1190
			if (eq_itype(it, is)) {
1149
		m = DEREF_ulong ( itype_itok ( is ) ) ;
1191
				m = DEREF_ulong(itype_itok(is));
1150
		COPY_ulong ( itype_itok ( it ), m ) ;
1192
				COPY_ulong(itype_itok(it), m);
1151
		break ;
1193
				break;
1152
	    }
1194
			}
1153
	    p = TAIL_list ( p ) ;
1195
			p = TAIL_list(p);
1154
	}
1196
		}
1155
	if ( IS_NULL_list ( p ) ) {
1197
		if (IS_NULL_list(p)) {
1156
	    /* Add bitfield type to list */
1198
			/* Add bitfield type to list */
1157
	    CONS_itype ( it, bftypes, bftypes ) ;
1199
			CONS_itype(it, bftypes, bftypes);
-
 
1200
		}
1158
	}
1201
	}
1159
    }
-
 
1160
    bs = enc_variety ( bs, t ) ;
1202
	bs = enc_variety(bs, t);
1161
    return ( bs ) ;
1203
	return (bs);
1162
}
1204
}
1163
 
1205
 
1164
 
1206
 
1165
/*
1207
/*
1166
    ENCODE AN ARITHMETIC TYPE
1208
    ENCODE AN ARITHMETIC TYPE
1167
 
1209
 
1168
    This routine adds the code number for the integral or floating point
1210
    This routine adds the code number for the integral or floating point
1169
    type t to the bitstream bs.
1211
    type t to the bitstream bs.
1170
*/
1212
*/
1171
 
1213
 
1172
BITSTREAM *enc_arith
1214
BITSTREAM *
1173
    PROTO_N ( ( bs, t, alt ) )
-
 
1174
    PROTO_T ( BITSTREAM *bs X TYPE t X int alt )
1215
enc_arith(BITSTREAM *bs, TYPE t, int alt)
1175
{
1216
{
1176
    unsigned n ;
1217
	unsigned n;
1177
    BUILTIN_TYPE bt ;
1218
	BUILTIN_TYPE bt;
1178
    if ( !IS_NULL_type ( t ) ) {
1219
	if (!IS_NULL_type(t)) {
1179
	switch ( TAG_type ( t ) ) {
1220
		switch (TAG_type(t)) {
1180
	    case type_integer_tag :
1221
		case type_integer_tag:
1181
	    case type_enumerate_tag : {
1222
		case type_enumerate_tag: {
1182
		/* Integral and enumeration types */
1223
			/* Integral and enumeration types */
1183
		INT_TYPE it = find_itype ( t ) ;
1224
			INT_TYPE it = find_itype(t);
1184
		bs = enc_var_no ( bs, it, alt ) ;
1225
			bs = enc_var_no(bs, it, alt);
1185
		return ( bs ) ;
1226
			return (bs);
1186
	    }
1227
		}
1187
	    case type_floating_tag : {
1228
		case type_floating_tag: {
1188
		/* Floating point types */
1229
			/* Floating point types */
1189
		FLOAT_TYPE ft = DEREF_ftype ( type_floating_rep ( t ) ) ;
1230
			FLOAT_TYPE ft = DEREF_ftype(type_floating_rep(t));
1190
		bs = enc_flvar_no ( bs, ft ) ;
1231
			bs = enc_flvar_no(bs, ft);
1191
		return ( bs ) ;
1232
			return (bs);
1192
	    }
1233
		}
1193
	    case type_ptr_tag :
1234
		case type_ptr_tag:
1194
	    case type_ref_tag : {
1235
		case type_ref_tag: {
1195
		/* Pointer types */
1236
			/* Pointer types */
1196
		bs = enc_special ( bs, TOK_ptr_rep ) ;
1237
			bs = enc_special(bs, TOK_ptr_rep);
1197
		return ( bs ) ;
1238
			return (bs);
-
 
1239
		}
1198
	    }
1240
		}
-
 
1241
	}
-
 
1242
	bt = is_builtin_type(t, 0);
-
 
1243
	if (alt) {
-
 
1244
		n = base_token[bt].alt;
-
 
1245
	} else {
-
 
1246
		n = base_token[bt].no;
1199
	}
1247
	}
1200
    }
-
 
1201
    bt = is_builtin_type ( t, 0 ) ;
-
 
1202
    if ( alt ) {
-
 
1203
	n = base_token [ bt ].alt ;
-
 
1204
    } else {
-
 
1205
	n = base_token [ bt ].no ;
-
 
1206
    }
-
 
1207
    bs = enc_make_snat ( bs, ( int ) n ) ;
1248
	bs = enc_make_snat(bs,(int)n);
1208
    return ( bs ) ;
1249
	return (bs);
1209
}
1250
}
1210
 
1251
 
1211
 
1252
 
1212
/*
1253
/*
1213
    IS A TYPE A TOKEN APPLICATION?
1254
    IS A TYPE A TOKEN APPLICATION?
1214
 
1255
 
1215
    This routine checks whether the class t represents a token application.
1256
    This routine checks whether the class t represents a token application.
1216
*/
1257
*/
1217
 
1258
 
1218
int is_tokenised_class
1259
int
1219
    PROTO_N ( ( t ) )
-
 
1220
    PROTO_T ( TYPE t )
1260
is_tokenised_class(TYPE t)
1221
{
1261
{
1222
    if ( !IS_NULL_type ( t ) && IS_type_token ( t ) ) {
1262
	if (!IS_NULL_type(t) && IS_type_token(t)) {
1223
	IDENTIFIER id = DEREF_id ( type_token_tok ( t ) ) ;
1263
		IDENTIFIER id = DEREF_id(type_token_tok(t));
1224
	if ( IS_id_token ( id ) ) return ( 1 ) ;
1264
		if (IS_id_token(id)) {
-
 
1265
			return (1);
1225
    }
1266
		}
-
 
1267
	}
1226
    return ( 0 ) ;
1268
	return (0);
1227
}
1269
}
1228
 
1270
 
1229
 
1271
 
1230
/*
1272
/*
1231
    ENCODE A TDF ALIGNMENT
1273
    ENCODE A TDF ALIGNMENT
1232
 
1274
 
1233
    This routine adds the alignment of the type t to the bitstream bs
1275
    This routine adds the alignment of the type t to the bitstream bs
1234
    as a TDF ALIGNMENT.
1276
    as a TDF ALIGNMENT.
1235
*/
1277
*/
1236
 
1278
 
1237
BITSTREAM *enc_alignment
1279
BITSTREAM *
1238
    PROTO_N ( ( bs, t ) )
-
 
1239
    PROTO_T ( BITSTREAM *bs X TYPE t )
1280
enc_alignment(BITSTREAM *bs, TYPE t)
1240
{
1281
{
1241
    if ( IS_NULL_type ( t ) ) {
1282
	if (IS_NULL_type(t)) {
1242
	/* This shouldn't happen */
1283
		/* This shouldn't happen */
1243
	t = type_sint ;
1284
		t = type_sint;
1244
    }
1285
	}
1245
    switch ( TAG_type ( t ) ) {
1286
	switch (TAG_type(t)) {
1246
	case type_ptr_tag :
1287
	case type_ptr_tag:
1247
	case type_ref_tag : {
1288
	case type_ref_tag: {
1248
	    /* Pointer alignment */
1289
		/* Pointer alignment */
1249
	    TYPE s = DEREF_type ( type_ptr_etc_sub ( t ) ) ;
1290
		TYPE s = DEREF_type(type_ptr_etc_sub(t));
1250
	    switch ( TAG_type ( s ) ) {
1291
		switch (TAG_type(s)) {
1251
		case type_top_tag :
1292
		case type_top_tag:
1252
		case type_bottom_tag : {
1293
		case type_bottom_tag: {
1253
		    /* Generic pointer */
1294
			/* Generic pointer */
1254
		    ENC_alignment ( bs ) ;
1295
			ENC_alignment(bs);
1255
		    bs = enc_special ( bs, TOK_ptr_void ) ;
1296
			bs = enc_special(bs, TOK_ptr_void);
1256
		    break ;
1297
			break;
1257
		}
1298
		}
1258
		case type_func_tag : {
1299
		case type_func_tag: {
1259
		    /* Function pointer */
1300
			/* Function pointer */
1260
		    ENC_alignment ( bs ) ;
1301
			ENC_alignment(bs);
1261
		    ENC_proc ( bs ) ;
1302
			ENC_proc(bs);
1262
		    break ;
1303
			break;
1263
		}
1304
		}
1264
		default : {
1305
		default : {
1265
		    /* Simple pointers */
1306
			/* Simple pointers */
1266
		    ENC_alignment ( bs ) ;
1307
			ENC_alignment(bs);
1267
		    ENC_pointer ( bs ) ;
1308
			ENC_pointer(bs);
1268
		    ENC_alignment ( bs ) ;
1309
			ENC_alignment(bs);
1269
		    ENC_top ( bs ) ;
1310
			ENC_top(bs);
1270
		    break ;
1311
			break;
1271
		}
1312
		}
1272
	    }
1313
		}
1273
	    break ;
1314
		break;
1274
	}
1315
	}
1275
	case type_array_tag : {
1316
	case type_array_tag: {
1276
	    /* Array types */
1317
		/* Array types */
1277
	    TYPE s = DEREF_type ( type_array_sub ( t ) ) ;
1318
		TYPE s = DEREF_type(type_array_sub(t));
1278
	    bs = enc_alignment ( bs, s ) ;
1319
		bs = enc_alignment(bs, s);
1279
	    break ;
1320
		break;
-
 
1321
	}
-
 
1322
	case type_compound_tag: {
-
 
1323
		/* Compound types */
-
 
1324
		CLASS_TYPE ct = DEREF_ctype(type_compound_defn(t));
-
 
1325
		TYPE s = DEREF_type(ctype_form(ct));
-
 
1326
		if (is_tokenised_class(s)) {
-
 
1327
			ENC_alignment(bs);
-
 
1328
			bs = enc_shape(bs, s);
-
 
1329
		} else {
-
 
1330
			bs = enc_al_ctype(bs, ct);
-
 
1331
		}
-
 
1332
		break;
-
 
1333
	}
-
 
1334
	case type_token_tag: {
-
 
1335
		/* Tokenised types */
-
 
1336
		IDENTIFIER id = DEREF_id(type_token_tok(t));
-
 
1337
		ulong n = DEREF_ulong(id_no(id));
-
 
1338
		if (n == LINK_TOKDEF) {
-
 
1339
			/* Allow for recursive tokenised types */
-
 
1340
			bs = enc_special(bs, TOK_empty_align);
-
 
1341
		} else {
-
 
1342
			ENC_alignment(bs);
-
 
1343
			bs = enc_shape(bs, t);
-
 
1344
		}
-
 
1345
		break;
1280
	}
1346
	}
1281
	case type_compound_tag : {
1347
	default: {
1282
	    /* Compound types */
1348
		/* Other types are simple */
1283
	    CLASS_TYPE ct = DEREF_ctype ( type_compound_defn ( t ) ) ;
-
 
1284
	    TYPE s = DEREF_type ( ctype_form ( ct ) ) ;
-
 
1285
	    if ( is_tokenised_class ( s ) ) {
-
 
1286
		ENC_alignment ( bs ) ;
1349
		ENC_alignment(bs);
1287
		bs = enc_shape ( bs, s ) ;
1350
		bs = enc_shape(bs, t);
1288
	    } else {
-
 
1289
		bs = enc_al_ctype ( bs, ct ) ;
-
 
1290
	    }
-
 
1291
	    break ;
1351
		break;
1292
	}
1352
	}
1293
	case type_token_tag : {
-
 
1294
	    /* Tokenised types */
-
 
1295
	    IDENTIFIER id = DEREF_id ( type_token_tok ( t ) ) ;
-
 
1296
	    ulong n = DEREF_ulong ( id_no ( id ) ) ;
-
 
1297
	    if ( n == LINK_TOKDEF ) {
-
 
1298
		/* Allow for recursive tokenised types */
-
 
1299
		bs = enc_special ( bs, TOK_empty_align ) ;
-
 
1300
	    } else {
-
 
1301
		ENC_alignment ( bs ) ;
-
 
1302
		bs = enc_shape ( bs, t ) ;
-
 
1303
	    }
-
 
1304
	    break ;
-
 
1305
	}
-
 
1306
	default : {
-
 
1307
	    /* Other types are simple */
-
 
1308
	    ENC_alignment ( bs ) ;
-
 
1309
	    bs = enc_shape ( bs, t ) ;
-
 
1310
	    break ;
-
 
1311
	}
1353
	}
1312
    }
-
 
1313
    return ( bs ) ;
1354
	return (bs);
1314
}
1355
}
1315
 
1356
 
1316
 
1357
 
1317
/*
1358
/*
1318
    DOES A TYPE HAVE A SIMPLE ALIGNMENT?
1359
    DOES A TYPE HAVE A SIMPLE ALIGNMENT?
1319
 
1360
 
1320
    This routine checks whether the alignment of the type t is of the
1361
    This routine checks whether the alignment of the type t is of the
1321
    simple form 'alignment ( t )'.
1362
    simple form 'alignment ( t )'.
1322
*/
1363
*/
1323
 
1364
 
1324
static int simple_alignment
1365
static int
1325
    PROTO_N ( ( t ) )
-
 
1326
    PROTO_T ( TYPE t )
1366
simple_alignment(TYPE t)
1327
{
1367
{
1328
    if ( !IS_NULL_type ( t ) ) {
1368
	if (!IS_NULL_type(t)) {
1329
	switch ( TAG_type ( t ) ) {
1369
		switch (TAG_type(t)) {
1330
	    case type_array_tag : {
1370
		case type_array_tag: {
1331
		/* Array types */
1371
			/* Array types */
1332
		TYPE s = DEREF_type ( type_array_sub ( t ) ) ;
1372
			TYPE s = DEREF_type(type_array_sub(t));
1333
		return ( simple_alignment ( s ) ) ;
1373
			return (simple_alignment(s));
1334
	    }
1374
		}
1335
	    case type_compound_tag : {
1375
		case type_compound_tag: {
1336
		/* Compound types */
1376
			/* Compound types */
1337
		CLASS_TYPE ct = DEREF_ctype ( type_compound_defn ( t ) ) ;
1377
			CLASS_TYPE ct = DEREF_ctype(type_compound_defn(t));
1338
		TYPE s = DEREF_type ( ctype_form ( ct ) ) ;
1378
			TYPE s = DEREF_type(ctype_form(ct));
1339
		if ( !is_tokenised_class ( s ) ) {
1379
			if (!is_tokenised_class(s)) {
1340
		    CLASS_INFO ci = DEREF_cinfo ( ctype_info ( ct ) ) ;
1380
				CLASS_INFO ci = DEREF_cinfo(ctype_info(ct));
1341
		    if ( !( ci & cinfo_complete ) ) return ( 0 ) ;
1381
				if (!(ci & cinfo_complete)) {
-
 
1382
					return (0);
-
 
1383
				}
1342
		    if ( !( ci & cinfo_defined ) ) return ( 0 ) ;
1384
				if (!(ci & cinfo_defined)) {
-
 
1385
					return (0);
-
 
1386
				}
1343
		    if ( ci & cinfo_recursive ) return ( 0 ) ;
1387
				if (ci & cinfo_recursive) {
-
 
1388
					return (0);
-
 
1389
				}
1344
		}
1390
			}
1345
		break ;
1391
			break;
1346
	    }
1392
		}
1347
	    case type_token_tag : {
1393
		case type_token_tag: {
1348
		/* Tokenised types */
1394
			/* Tokenised types */
1349
		IDENTIFIER id = DEREF_id ( type_token_tok ( t ) ) ;
1395
			IDENTIFIER id = DEREF_id(type_token_tok(t));
1350
		ulong n = DEREF_ulong ( id_no ( id ) ) ;
1396
			ulong n = DEREF_ulong(id_no(id));
1351
		if ( n == LINK_TOKDEF ) return ( 0 ) ;
1397
			if (n == LINK_TOKDEF) {
-
 
1398
				return (0);
-
 
1399
			}
1352
		break ;
1400
			break;
1353
	    }
1401
		}
1354
	}
1402
		}
1355
    }
1403
	}
1356
    return ( 1 ) ;
1404
	return (1);
1357
}
1405
}
1358
 
1406
 
1359
 
1407
 
1360
/*
1408
/*
1361
    ENCODE A TDF SHAPE OFFSET
1409
    ENCODE A TDF SHAPE OFFSET
1362
 
1410
 
1363
    This routine adds the offset of the type t to the bitstream bs.
1411
    This routine adds the offset of the type t to the bitstream bs.
1364
*/
1412
*/
1365
 
1413
 
1366
BITSTREAM *enc_shape_offset
1414
BITSTREAM *
1367
    PROTO_N ( ( bs, t ) )
-
 
1368
    PROTO_T ( BITSTREAM *bs X TYPE t )
1415
enc_shape_offset(BITSTREAM *bs, TYPE t)
1369
{
1416
{
1370
    if ( !IS_NULL_type ( t ) && IS_type_array ( t ) ) {
1417
	if (!IS_NULL_type(t) && IS_type_array(t)) {
1371
	/* Allow for variable-sized arrays */
1418
		/* Allow for variable-sized arrays */
1372
	NAT n = DEREF_nat ( type_array_size ( t ) ) ;
1419
		NAT n = DEREF_nat(type_array_size(t));
1373
	if ( !IS_NULL_nat ( n ) && IS_nat_calc ( n ) ) {
1420
		if (!IS_NULL_nat(n) && IS_nat_calc(n)) {
1374
	    EXP e = DEREF_exp ( nat_calc_value ( n ) ) ;
1421
			EXP e = DEREF_exp(nat_calc_value(n));
1375
	    TYPE s = DEREF_type ( type_array_sub ( t ) ) ;
1422
			TYPE s = DEREF_type(type_array_sub(t));
1376
	    ENC_offset_mult ( bs ) ;
1423
			ENC_offset_mult(bs);
1377
	    bs = enc_shape_offset ( bs, s ) ;
1424
			bs = enc_shape_offset(bs, s);
1378
	    bs = enc_exp ( bs, e ) ;
1425
			bs = enc_exp(bs, e);
1379
	    return ( bs ) ;
1426
			return (bs);
1380
	}
1427
		}
1381
    }
1428
	}
1382
    if ( simple_alignment ( t ) ) {
1429
	if (simple_alignment(t)) {
1383
	/* Use token as shorthand */
1430
		/* Use token as shorthand */
1384
	if ( EQ_type ( t, type_char ) ) {
1431
		if (EQ_type(t, type_char)) {
1385
	    bs = enc_special ( bs, TOK_char_offset ) ;
1432
			bs = enc_special(bs, TOK_char_offset);
1386
	} else {
1433
		} else {
1387
	    BITSTREAM *ts = start_bitstream ( NIL ( FILE ), bs->link ) ;
1434
			BITSTREAM *ts = start_bitstream(NIL(FILE), bs->link);
1388
	    bs = enc_special ( bs, TOK_shape_offset ) ;
1435
			bs = enc_special(bs, TOK_shape_offset);
1389
	    ts = enc_shape ( ts, t ) ;
1436
			ts = enc_shape(ts, t);
1390
	    bs = enc_bitstream ( bs, ts ) ;
1437
			bs = enc_bitstream(bs, ts);
1391
	}
1438
		}
1392
    } else {
1439
	} else {
1393
	/* Output explicit instructions */
1440
		/* Output explicit instructions */
1394
	ENC_offset_pad ( bs ) ;
1441
		ENC_offset_pad(bs);
1395
	bs = enc_alignment ( bs, t ) ;
1442
		bs = enc_alignment(bs, t);
1396
	ENC_shape_offset ( bs ) ;
1443
		ENC_shape_offset(bs);
1397
	bs = enc_shape ( bs, t ) ;
1444
		bs = enc_shape(bs, t);
1398
    }
1445
	}
1399
    return ( bs ) ;
1446
	return (bs);
1400
}
1447
}
1401
 
1448
 
1402
 
1449
 
1403
/*
1450
/*
1404
    ENCODE A TDF OFFSET
1451
    ENCODE A TDF OFFSET
1405
 
1452
 
1406
    This routine adds the offset off to the bitstream bs as a TDF EXP.
1453
    This routine adds the offset off to the bitstream bs as a TDF EXP.
1545
/*
1591
/*
1546
    ENCODE AN EXTRA OFFSET
1592
    ENCODE AN EXTRA OFFSET
1547
 
1593
 
1548
    This routine adds an expression representing n times the offset off
1594
    This routine adds an expression representing n times the offset off
1549
    rounded up to the alignment of t to the bitstream bs.
1595
    rounded up to the alignment of t to the bitstream bs.
1550
*/
1596
*/
1551
 
1597
 
1552
BITSTREAM *enc_extra_offset
1598
BITSTREAM *
1553
    PROTO_N ( ( bs, t, off, n ) )
-
 
1554
    PROTO_T ( BITSTREAM *bs X TYPE t X OFFSET off X int n )
1599
enc_extra_offset(BITSTREAM *bs, TYPE t, OFFSET off, int n)
1555
{
1600
{
1556
    if ( n == 0 ) {
1601
	if (n == 0) {
1557
	ENC_offset_zero ( bs ) ;
1602
		ENC_offset_zero(bs);
1558
	bs = enc_alignment ( bs, t ) ;
1603
		bs = enc_alignment(bs, t);
1559
    } else {
-
 
1560
	if ( n < 0 ) {
-
 
1561
	    ENC_offset_negate ( bs ) ;
-
 
1562
	    n = -n ;
-
 
1563
	}
-
 
1564
	if ( n == 1 ) {
-
 
1565
	    BITSTREAM *ts ;
-
 
1566
	    bs = enc_special ( bs, TOK_extra_offset ) ;
-
 
1567
	    ts = start_bitstream ( NIL ( FILE ), bs->link ) ;
-
 
1568
	    ts = enc_alignment ( ts, t ) ;
-
 
1569
	    ts = enc_offset ( ts, off ) ;
-
 
1570
	    bs = enc_bitstream ( bs, ts ) ;
-
 
1571
	} else {
1604
	} else {
-
 
1605
		if (n < 0) {
-
 
1606
			ENC_offset_negate(bs);
-
 
1607
			n = -n;
-
 
1608
		}
-
 
1609
		if (n == 1) {
-
 
1610
			BITSTREAM *ts;
-
 
1611
			bs = enc_special(bs, TOK_extra_offset);
-
 
1612
			ts = start_bitstream(NIL(FILE), bs->link);
-
 
1613
			ts = enc_alignment(ts, t);
-
 
1614
			ts = enc_offset(ts, off);
-
 
1615
			bs = enc_bitstream(bs, ts);
-
 
1616
		} else {
1572
	    ENC_offset_mult ( bs ) ;
1617
			ENC_offset_mult(bs);
1573
	    bs = enc_extra_offset ( bs, t, off, 1 ) ;
1618
			bs = enc_extra_offset(bs, t, off, 1);
1574
	    bs = enc_make_int ( bs, type_sint, n ) ;
1619
			bs = enc_make_int(bs, type_sint, n);
-
 
1620
		}
1575
	}
1621
	}
1576
    }
-
 
1577
    return ( bs ) ;
1622
	return (bs);
1578
}
1623
}
1579
 
1624
 
1580
 
1625
 
1581
/*
1626
/*
1582
    ENCODE AN ADD TO POINTER EXPRESSION
1627
    ENCODE AN ADD TO POINTER EXPRESSION
Line 1584... Line 1629...
1584
    This routine adds the expression formed by adding the offset off
1629
    This routine adds the expression formed by adding the offset off
1585
    to the pointer a to the bitstream bs.  virt is true for a virtual
1630
    to the pointer a to the bitstream bs.  virt is true for a virtual
1586
    base offset.
1631
    base offset.
1587
*/
1632
*/
1588
 
1633
 
1589
BITSTREAM *enc_add_ptr
1634
BITSTREAM *
1590
    PROTO_N ( ( bs, a, n, off, virt ) )
-
 
1591
    PROTO_T ( BITSTREAM *bs X EXP a X ulong n X OFFSET off X int virt )
1635
enc_add_ptr(BITSTREAM *bs, EXP a, ulong n, OFFSET off, int virt)
1592
{
1636
{
1593
    if ( IS_NULL_off ( off ) ) {
1637
	if (IS_NULL_off(off)) {
1594
	if ( n == LINK_NONE ) {
1638
		if (n == LINK_NONE) {
1595
	    bs = enc_exp ( bs, a ) ;
1639
			bs = enc_exp(bs, a);
-
 
1640
		} else {
-
 
1641
			ENC_exp_apply_token(bs);
-
 
1642
			ENC_make_tok(bs, n);
-
 
1643
			ENC_LEN_SMALL(bs, 0);
-
 
1644
		}
-
 
1645
		return (bs);
-
 
1646
	}
-
 
1647
	ASSERT(ORDER_off == 13);
-
 
1648
	switch (TAG_off(off)) {
-
 
1649
	case off_base_tag: {
-
 
1650
		/* Base class offsets */
-
 
1651
		GRAPH gr = DEREF_graph(off_base_graph(off));
-
 
1652
		DECL_SPEC acc = DEREF_dspec(graph_access(gr));
-
 
1653
		if (virt && (acc & dspec_mutable)) {
-
 
1654
			/* Virtual base offset */
-
 
1655
			bs = enc_add_base(bs, off, NULL_off);
-
 
1656
			bs = enc_add_ptr(bs, a, n, NULL_off, 0);
-
 
1657
			bs = enc_end_base(bs, off, NULL_off);
-
 
1658
			return (bs);
-
 
1659
		}
-
 
1660
		if (acc & dspec_ignore) {
-
 
1661
			/* Null base offset */
-
 
1662
			bs = enc_add_ptr(bs, a, n, NULL_off, 0);
-
 
1663
			return (bs);
-
 
1664
		}
-
 
1665
		break;
-
 
1666
	}
-
 
1667
	case off_deriv_tag: {
-
 
1668
		/* Derived class offsets */
-
 
1669
		GRAPH gr = DEREF_graph(off_deriv_graph(off));
-
 
1670
		DECL_SPEC acc = DEREF_dspec(graph_access(gr));
-
 
1671
		if (virt && (acc & dspec_mutable)) {
-
 
1672
			/* Virtual base offset */
-
 
1673
			OFFSET off1, off2;
-
 
1674
			gr = min_base_class(gr);
-
 
1675
			off = DEREF_off(graph_off(gr));
-
 
1676
			if (IS_off_deriv(off)) {
-
 
1677
				off1 = DEREF_off(off_deriv_direct(off));
-
 
1678
				off2 = DEREF_off(off_deriv_indirect(off));
-
 
1679
			} else {
-
 
1680
				off1 = off;
-
 
1681
				off2 = NULL_off;
-
 
1682
			}
-
 
1683
			bs = enc_add_base(bs, off1, off2);
-
 
1684
			bs = enc_add_ptr(bs, a, n, NULL_off, 0);
-
 
1685
			bs = enc_end_base(bs, off1, off2);
-
 
1686
			return (bs);
-
 
1687
		}
-
 
1688
		if (acc & dspec_ignore) {
-
 
1689
			/* Null base offset */
-
 
1690
			bs = enc_add_ptr(bs, a, n, NULL_off, 0);
-
 
1691
			return (bs);
-
 
1692
		}
-
 
1693
		break;
-
 
1694
	}
-
 
1695
	case off_plus_tag: {
-
 
1696
		/* Offset additions */
-
 
1697
		OFFSET off1 = DEREF_off(off_plus_arg1(off));
-
 
1698
		OFFSET off2 = DEREF_off(off_plus_arg2(off));
-
 
1699
		if (is_zero_offset(off2)) {
-
 
1700
			bs = enc_add_ptr(bs, a, n, off1, virt);
-
 
1701
		} else {
-
 
1702
			ENC_add_to_ptr(bs);
-
 
1703
			bs = enc_add_ptr(bs, a, n, off1, virt);
-
 
1704
			bs = enc_offset(bs, off2);
-
 
1705
		}
-
 
1706
		return (bs);
-
 
1707
	}
-
 
1708
	}
-
 
1709
 
-
 
1710
	/* Other offsets */
-
 
1711
	if (is_zero_offset(off)) {
-
 
1712
		bs = enc_add_ptr(bs, a, n, NULL_off, 0);
1596
	} else {
1713
	} else {
1597
	    ENC_exp_apply_token ( bs ) ;
1714
		ENC_add_to_ptr(bs);
1598
	    ENC_make_tok ( bs, n ) ;
1715
		bs = enc_add_ptr(bs, a, n, NULL_off, 0);
1599
	    ENC_LEN_SMALL ( bs, 0 ) ;
1716
		bs = enc_offset(bs, off);
1600
	}
1717
	}
1601
	return ( bs ) ;
1718
	return (bs);
1602
    }
-
 
1603
    ASSERT ( ORDER_off == 13 ) ;
-
 
1604
    switch ( TAG_off ( off ) ) {
-
 
1605
	case off_base_tag : {
-
 
1606
	    /* Base class offsets */
-
 
1607
	    GRAPH gr = DEREF_graph ( off_base_graph ( off ) ) ;
-
 
1608
	    DECL_SPEC acc = DEREF_dspec ( graph_access ( gr ) ) ;
-
 
1609
	    if ( virt && ( acc & dspec_mutable ) ) {
-
 
1610
		/* Virtual base offset */
-
 
1611
		bs = enc_add_base ( bs, off, NULL_off ) ;
-
 
1612
		bs = enc_add_ptr ( bs, a, n, NULL_off, 0 ) ;
-
 
1613
		bs = enc_end_base ( bs, off, NULL_off ) ;
-
 
1614
		return ( bs ) ;
-
 
1615
	    }
-
 
1616
	    if ( acc & dspec_ignore ) {
-
 
1617
		/* Null base offset */
-
 
1618
		bs = enc_add_ptr ( bs, a, n, NULL_off, 0 ) ;
-
 
1619
		return ( bs ) ;
-
 
1620
	    }
-
 
1621
	    break ;
-
 
1622
	}
-
 
1623
	case off_deriv_tag : {
-
 
1624
	    /* Derived class offsets */
-
 
1625
	    GRAPH gr = DEREF_graph ( off_deriv_graph ( off ) ) ;
-
 
1626
	    DECL_SPEC acc = DEREF_dspec ( graph_access ( gr ) ) ;
-
 
1627
	    if ( virt && ( acc & dspec_mutable ) ) {
-
 
1628
		/* Virtual base offset */
-
 
1629
		OFFSET off1, off2 ;
-
 
1630
		gr = min_base_class ( gr ) ;
-
 
1631
		off = DEREF_off ( graph_off ( gr ) ) ;
-
 
1632
		if ( IS_off_deriv ( off ) ) {
-
 
1633
		    off1 = DEREF_off ( off_deriv_direct ( off ) ) ;
-
 
1634
		    off2 = DEREF_off ( off_deriv_indirect ( off ) ) ;
-
 
1635
		} else {
-
 
1636
		    off1 = off ;
-
 
1637
		    off2 = NULL_off ;
-
 
1638
		}
-
 
1639
		bs = enc_add_base ( bs, off1, off2 ) ;
-
 
1640
		bs = enc_add_ptr ( bs, a, n, NULL_off, 0 ) ;
-
 
1641
		bs = enc_end_base ( bs, off1, off2 ) ;
-
 
1642
		return ( bs ) ;
-
 
1643
	    }
-
 
1644
	    if ( acc & dspec_ignore ) {
-
 
1645
		/* Null base offset */
-
 
1646
		bs = enc_add_ptr ( bs, a, n, NULL_off, 0 ) ;
-
 
1647
		return ( bs ) ;
-
 
1648
	    }
-
 
1649
	    break ;
-
 
1650
	}
-
 
1651
	case off_plus_tag : {
-
 
1652
	    /* Offset additions */
-
 
1653
	    OFFSET off1 = DEREF_off ( off_plus_arg1 ( off ) ) ;
-
 
1654
	    OFFSET off2 = DEREF_off ( off_plus_arg2 ( off ) ) ;
-
 
1655
	    if ( is_zero_offset ( off2 ) ) {
-
 
1656
		bs = enc_add_ptr ( bs, a, n, off1, virt ) ;
-
 
1657
	    } else {
-
 
1658
		ENC_add_to_ptr ( bs ) ;
-
 
1659
		bs = enc_add_ptr ( bs, a, n, off1, virt ) ;
-
 
1660
		bs = enc_offset ( bs, off2 ) ;
-
 
1661
	    }
-
 
1662
	    return ( bs ) ;
-
 
1663
	}
-
 
1664
    }
-
 
1665
 
-
 
1666
    /* Other offsets */
-
 
1667
    if ( is_zero_offset ( off ) ) {
-
 
1668
	bs = enc_add_ptr ( bs, a, n, NULL_off, 0 ) ;
-
 
1669
    } else {
-
 
1670
	ENC_add_to_ptr ( bs ) ;
-
 
1671
	bs = enc_add_ptr ( bs, a, n, NULL_off, 0 ) ;
-
 
1672
	bs = enc_offset ( bs, off ) ;
-
 
1673
    }
-
 
1674
    return ( bs ) ;
-
 
1675
}
1719
}
1676
 
1720
 
1677
 
1721
 
1678
/*
1722
/*
1679
    ENCODE A TDF SHAPE
1723
    ENCODE A TDF SHAPE
1680
 
1724
 
1681
    This routine adds the type t to the bitstream bs as a TDF SHAPE.
1725
    This routine adds the type t to the bitstream bs as a TDF SHAPE.
1804
#if LANGUAGE_CPP
1847
#if LANGUAGE_CPP
1805
	    if ( tok == TOK_vtab_type ) {
1848
		if (tok == TOK_vtab_type) {
1806
		bs = enc_vtable_shape ( bs, size_dummy_vtab ) ;
1849
			bs = enc_vtable_shape(bs, size_dummy_vtab);
1807
		break ;
1850
			break;
1808
	    }
1851
		}
1809
#endif
1852
#endif
1810
	    bs = enc_special ( bs, tok ) ;
1853
		bs = enc_special(bs, tok);
1811
	    break ;
-
 
1812
	}
-
 
1813
	default : {
-
 
1814
	    /* This case shouldn't occur */
-
 
1815
	    bs = enc_shape ( bs, type_sint ) ;
-
 
1816
	    break ;
1854
		break;
1817
	}
1855
	}
-
 
1856
	default: {
-
 
1857
		/* This case shouldn't occur */
-
 
1858
		bs = enc_shape(bs, type_sint);
-
 
1859
		break;
1818
    }
1860
	}
-
 
1861
	}
1819
    return ( bs ) ;
1862
	return (bs);
1820
}
1863
}
1821
 
1864
 
1822
 
1865
 
1823
/*
1866
/*
1824
    DO TWO TYPES HAVE THE SAME REPRESENTATION?
1867
    DO TWO TYPES HAVE THE SAME REPRESENTATION?
1825
 
1868
 
1826
    This routine returns true if the types s and t have the same
1869
    This routine returns true if the types s and t have the same
1827
    representation as shapes (or alignments if ptr is true) in TDF.
1870
    representation as shapes (or alignments if ptr is true) in TDF.
1828
*/
1871
*/
1829
 
1872
 
1830
int eq_type_rep
1873
int
1831
    PROTO_N ( ( s, t, ptr ) )
-
 
1832
    PROTO_T ( TYPE s X TYPE t X int ptr )
1874
eq_type_rep(TYPE s, TYPE t, int ptr)
1833
{
1875
{
1834
    unsigned ns, nt ;
1876
	unsigned ns, nt;
1835
    if ( EQ_type ( s, t ) ) return ( 1 ) ;
1877
	if (EQ_type(s, t)) {
-
 
1878
		return (1);
-
 
1879
	}
1836
    if ( IS_NULL_type ( s ) || IS_NULL_type ( t ) ) return ( 0 ) ;
1880
	if (IS_NULL_type(s) || IS_NULL_type(t)) {
-
 
1881
		return (0);
-
 
1882
	}
1837
    ns = TAG_type ( s ) ;
1883
	ns = TAG_type(s);
1838
    nt = TAG_type ( t ) ;
1884
	nt = TAG_type(t);
1839
 
1885
 
1840
    /* Check the first type */
1886
	/* Check the first type */
1841
    switch ( ns ) {
1887
	switch (ns) {
1842
	case type_top_tag :
1888
	case type_top_tag:
1843
	case type_bottom_tag : {
1889
	case type_bottom_tag: {
1844
	    /* Top and bottom types */
1890
		/* Top and bottom types */
1845
	    if ( nt == ns ) return ( 1 ) ;
1891
		if (nt == ns) {
-
 
1892
			return (1);
-
 
1893
		}
1846
	    if ( nt == type_top_tag || nt == type_bottom_tag ) {
1894
		if (nt == type_top_tag || nt == type_bottom_tag) {
1847
		/* alignment ( top ) == alignment ( bottom ) */
1895
			/* alignment ( top ) == alignment ( bottom ) */
1848
		return ( ptr ) ;
1896
			return (ptr);
1849
	    }
1897
		}
1850
	    break ;
1898
		break;
1851
	}
1899
	}
1852
	case type_ptr_tag :
1900
	case type_ptr_tag:
1853
	case type_ref_tag : {
1901
	case type_ref_tag: {
1854
	    /* Pointer and reference types */
1902
		/* Pointer and reference types */
1855
	    if ( nt == type_ptr_tag || nt == type_ref_tag ) {
1903
		if (nt == type_ptr_tag || nt == type_ref_tag) {
1856
		TYPE ps, pt ;
1904
			TYPE ps, pt;
1857
		if ( ptr ) {
1905
			if (ptr) {
1858
		    /* alignment ( pointer ( s ) ) is constant */
1906
				/* alignment ( pointer ( s ) ) is constant */
1859
		    return ( 1 ) ;
1907
				return (1);
1860
		}
1908
			}
1861
		ps = DEREF_type ( type_ptr_etc_sub ( s ) ) ;
1909
			ps = DEREF_type(type_ptr_etc_sub(s));
1862
		pt = DEREF_type ( type_ptr_etc_sub ( t ) ) ;
1910
			pt = DEREF_type(type_ptr_etc_sub(t));
1863
		return ( eq_type_rep ( ps, pt, 1 ) ) ;
1911
			return (eq_type_rep(ps, pt, 1));
1864
	    }
1912
		}
1865
	    break ;
1913
		break;
1866
	}
1914
	}
1867
	case type_ptr_mem_tag : {
1915
	case type_ptr_mem_tag: {
1868
	    /* Pointer to member types */
1916
		/* Pointer to member types */
1869
	    if ( nt == type_ptr_mem_tag ) {
1917
		if (nt == type_ptr_mem_tag) {
1870
		TYPE ps = DEREF_type ( type_ptr_mem_sub ( s ) ) ;
1918
			TYPE ps = DEREF_type(type_ptr_mem_sub(s));
1871
		TYPE pt = DEREF_type ( type_ptr_mem_sub ( t ) ) ;
1919
			TYPE pt = DEREF_type(type_ptr_mem_sub(t));
1872
		if ( IS_type_func ( ps ) ) {
1920
			if (IS_type_func(ps)) {
1873
		    if ( IS_type_func ( pt ) ) {
1921
				if (IS_type_func(pt)) {
1874
			/* Pointers to member functions */
1922
					/* Pointers to member functions */
1875
			return ( 1 ) ;
1923
					return (1);
1876
		    }
1924
				}
1877
		} else {
1925
			} else {
1878
		    if ( !IS_type_func ( pt ) ) {
1926
				if (!IS_type_func(pt)) {
1879
			/* Pointers to data members */
1927
					/* Pointers to data members */
-
 
1928
					return (1);
-
 
1929
				}
-
 
1930
			}
-
 
1931
		}
-
 
1932
		break;
-
 
1933
	}
-
 
1934
	case type_func_tag: {
-
 
1935
		/* Function types */
-
 
1936
		if (nt == type_func_tag) {
-
 
1937
			/* All functions have the same representation */
1880
			return ( 1 ) ;
1938
			return (1);
-
 
1939
		}
-
 
1940
		break;
-
 
1941
	}
-
 
1942
	case type_array_tag: {
-
 
1943
		/* Array types */
-
 
1944
		if (ptr) {
-
 
1945
			/* alignment ( nof ( n, s ) ) == alignment ( s ) */
-
 
1946
			TYPE ps = DEREF_type(type_array_sub(s));
-
 
1947
			return (eq_type_rep(ps, t, 1));
-
 
1948
		}
-
 
1949
		if (nt == type_array_tag) {
-
 
1950
			NAT ms = DEREF_nat(type_array_size(s));
-
 
1951
			NAT mt = DEREF_nat(type_array_size(t));
-
 
1952
			if (EQ_nat(ms, mt) || eq_nat(ms, mt)) {
-
 
1953
				TYPE ps = DEREF_type(type_array_sub(s));
-
 
1954
				TYPE pt = DEREF_type(type_array_sub(t));
-
 
1955
				return (eq_type_rep(ps, pt, 0));
1881
		    }
1956
			}
-
 
1957
		}
-
 
1958
		break;
-
 
1959
	}
-
 
1960
	case type_enumerate_tag: {
-
 
1961
		/* Enumeration types */
-
 
1962
		ENUM_TYPE es = DEREF_etype(type_enumerate_defn(s));
-
 
1963
		TYPE ps = DEREF_type(etype_rep(es));
-
 
1964
		return (eq_type_rep(ps, t, ptr));
-
 
1965
	}
-
 
1966
	}
-
 
1967
 
-
 
1968
	/* Check the second type */
-
 
1969
	switch (nt) {
-
 
1970
	case type_array_tag: {
-
 
1971
		/* Array types */
-
 
1972
		if (ptr) {
-
 
1973
			/* alignment ( nof ( n, t ) ) == alignment ( t ) */
-
 
1974
			TYPE pt = DEREF_type(type_array_sub(t));
-
 
1975
			return (eq_type_rep(s, pt, 1));
1882
		}
1976
		}
1883
	    }
-
 
1884
	    break ;
1977
		break;
1885
	}
1978
	}
1886
	case type_func_tag : {
1979
	case type_enumerate_tag: {
1887
	    /* Function types */
1980
		/* Enumeration types */
1888
	    if ( nt == type_func_tag ) {
1981
		ENUM_TYPE et = DEREF_etype(type_enumerate_defn(t));
1889
		/* All functions have the same representation */
1982
		TYPE pt = DEREF_type(etype_rep(et));
1890
		return ( 1 ) ;
1983
		return (eq_type_rep(s, pt, ptr));
-
 
1984
	}
1891
	    }
1985
	}
-
 
1986
 
-
 
1987
	/* Compare the types */
-
 
1988
	if (ns == nt) {
1892
	    break ;
1989
		if (ptr) {
-
 
1990
			return (eq_type_offset(s, t));
-
 
1991
		}
-
 
1992
		return (eq_type_unqual(s, t));
1893
	}
1993
	}
1894
	case type_array_tag : {
-
 
1895
	    /* Array types */
-
 
1896
	    if ( ptr ) {
-
 
1897
		/* alignment ( nof ( n, s ) ) == alignment ( s ) */
-
 
1898
		TYPE ps = DEREF_type ( type_array_sub ( s ) ) ;
-
 
1899
		return ( eq_type_rep ( ps, t, 1 ) ) ;
-
 
1900
	    }
-
 
1901
	    if ( nt == type_array_tag ) {
-
 
1902
		NAT ms = DEREF_nat ( type_array_size ( s ) ) ;
-
 
1903
		NAT mt = DEREF_nat ( type_array_size ( t ) ) ;
-
 
1904
		if ( EQ_nat ( ms, mt ) || eq_nat ( ms, mt ) ) {
-
 
1905
		    TYPE ps = DEREF_type ( type_array_sub ( s ) ) ;
-
 
1906
		    TYPE pt = DEREF_type ( type_array_sub ( t ) ) ;
-
 
1907
		    return ( eq_type_rep ( ps, pt, 0 ) ) ;
-
 
1908
		}
-
 
1909
	    }
-
 
1910
	    break ;
-
 
1911
	}
-
 
1912
	case type_enumerate_tag : {
-
 
1913
	    /* Enumeration types */
-
 
1914
	    ENUM_TYPE es = DEREF_etype ( type_enumerate_defn ( s ) ) ;
-
 
1915
	    TYPE ps = DEREF_type ( etype_rep ( es ) ) ;
-
 
1916
	    return ( eq_type_rep ( ps, t, ptr ) ) ;
-
 
1917
	}
-
 
1918
    }
-
 
1919
 
-
 
1920
    /* Check the second type */
-
 
1921
    switch ( nt ) {
-
 
1922
	case type_array_tag : {
-
 
1923
	    /* Array types */
-
 
1924
	    if ( ptr ) {
-
 
1925
		/* alignment ( nof ( n, t ) ) == alignment ( t ) */
-
 
1926
		TYPE pt = DEREF_type ( type_array_sub ( t ) ) ;
-
 
1927
		return ( eq_type_rep ( s, pt, 1 ) ) ;
-
 
1928
	    }
-
 
1929
	    break ;
-
 
1930
	}
-
 
1931
	case type_enumerate_tag : {
-
 
1932
	    /* Enumeration types */
-
 
1933
	    ENUM_TYPE et = DEREF_etype ( type_enumerate_defn ( t ) ) ;
-
 
1934
	    TYPE pt = DEREF_type ( etype_rep ( et ) ) ;
-
 
1935
	    return ( eq_type_rep ( s, pt, ptr ) ) ;
-
 
1936
	}
-
 
1937
    }
-
 
1938
 
-
 
1939
    /* Compare the types */
-
 
1940
    if ( ns == nt ) {
-
 
1941
	if ( ptr ) return ( eq_type_offset ( s, t ) ) ;
-
 
1942
	return ( eq_type_unqual ( s, t ) ) ;
-
 
1943
    }
-
 
1944
    return ( 0 ) ;
1994
	return (0);
1945
}
1995
}
1946
 
1996
 
1947
 
1997
 
1948
#endif /* TDF_OUTPUT */
1998
#endif /* TDF_OUTPUT */