Subversion Repositories tendra.SVN

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 7u83 1
/*
2
    		 Crown Copyright (c) 1997
3
 
4
    This TenDRA(r) Computer Program is subject to Copyright
5
    owned by the United Kingdom Secretary of State for Defence
6
    acting through the Defence Evaluation and Research Agency
7
    (DERA).  It is made available to Recipients with a
8
    royalty-free licence for its use, reproduction, transfer
9
    to other parties and amendment for any purpose not excluding
10
    product development provided that any such use et cetera
11
    shall be deemed to be acceptance of the following conditions:-
12
 
13
        (1) Its Recipients shall ensure that this Notice is
14
        reproduced upon any copies or amended versions of it;
15
 
16
        (2) Any amended version of it shall be clearly marked to
17
        show both the nature of and the organisation responsible
18
        for the relevant amendment or amendments;
19
 
20
        (3) Its onward transfer from a recipient to another
21
        party shall be deemed to be that party's acceptance of
22
        these conditions;
23
 
24
        (4) DERA gives no warranty or assurance as to its
25
        quality or suitability for any purpose and DERA accepts
26
        no liability whatsoever in relation to any use to which
27
        it may be put.
28
*/
29
 
30
 
31
/*** tdf-read.c --- TDF reader ADT.
32
 *
33
 ** Author: Steve Folkes <smf@hermes.mod.uk>
34
 *
35
 *** Commentary:
36
 *
37
 * This file implements the TDF reader routines used by the TDF linker.
38
 *
39
 *** Change Log:
40
 * $Log: tdf-read.c,v $
41
 * Revision 1.1.1.1  1998/01/17  15:57:20  release
42
 * First version to be checked into rolling release.
43
 *
44
 * Revision 1.3  1995/09/22  08:39:37  smf
45
 * Fixed problems with incomplete structures (to shut "tcc" up).
46
 * Fixed some problems in "name-key.c" (no real problems, but rewritten to
47
 * reduce the warnings that were output by "tcc" and "gcc").
48
 * Fixed bug CR95_354.tld-common-id-problem (library capsules could be loaded
49
 * more than once).
50
 *
51
 * Revision 1.2  1994/12/12  11:46:55  smf
52
 * Performing changes for 'CR94_178.sid+tld-update' - bringing in line with
53
 * OSSG C Coding Standards.
54
 *
55
 * Revision 1.1.1.1  1994/07/25  16:03:38  smf
56
 * Initial import of TDF linker 3.5 non shared files.
57
 *
58
**/
59
 
60
/****************************************************************************/
61
 
62
#include "tdf-read.h"
63
#include "gen-errors.h"
64
#include "ostream.h"
65
 
66
#include "solve-cycles.h"
67
 
68
/*--------------------------------------------------------------------------*/
69
 
70
ExceptionP XX_tdf_read_error = EXCEPTION ("error reading TDF capsule");
71
 
72
/*--------------------------------------------------------------------------*/
73
 
74
static unsigned
75
tdf_read_nibble PROTO_N ((reader))
76
		PROTO_T (TDFReaderP reader)
77
{
78
    if (reader->new_byte) {
79
	switch (reader->type) EXHAUSTIVE {
80
	  case RT_STREAM:
81
	    if (bistream_read_byte (&(reader->u.bistream), &(reader->byte))) {
82
		reader->new_byte = FALSE;
83
		return (((unsigned) reader->byte >> 4) & 0xF);
84
	    }
85
	    E_unexpected_eof_in_tdf (reader);
86
	    THROW (XX_tdf_read_error);
87
	    UNREACHED;
88
	  case RT_STRING:
89
	    if (reader->u.string.current < reader->u.string.limit) {
90
		reader->byte     = (ByteT) (*(reader->u.string.current ++));
91
		reader->new_byte = FALSE;
92
		reader->u.string.byte ++;
93
		return (((unsigned) reader->byte >> 4) & 0xF);
94
	    }
95
	    E_unexpected_eof_in_tdf (reader);
96
	    THROW (XX_tdf_read_error);
97
	    UNREACHED;
98
	}
99
    }
100
    reader->new_byte = TRUE;
101
    return (reader->byte & 0xF);
102
}
103
 
104
/*--------------------------------------------------------------------------*/
105
 
106
BoolT
107
tdf_reader_open PROTO_N ((reader, name))
108
		PROTO_T (TDFReaderP reader X
109
			 CStringP   name)
110
{
111
    reader->type     = RT_STREAM;
112
    reader->new_byte = TRUE;
113
    if (!bistream_open (&(reader->u.bistream), name)) {
114
	return (FALSE);
115
    }
116
    return (TRUE);
117
}
118
 
119
void
120
tdf_reader_open_string PROTO_N ((reader, name, bytes))
121
		       PROTO_T (TDFReaderP reader X
122
				CStringP   name X
123
				NStringP   bytes)
124
{
125
    CStringP contents = nstring_contents (bytes);
126
    unsigned length   = nstring_length (bytes);
127
 
128
    reader->type              = RT_STRING;
129
    reader->new_byte          = TRUE;
130
    reader->u.string.contents = contents;
131
    reader->u.string.current  = contents;
132
    reader->u.string.limit    = (contents + length);
133
    reader->u.string.name     = name;
134
    reader->u.string.byte     = 0;
135
}
136
 
137
CStringP
138
tdf_reader_name PROTO_N ((reader))
139
		PROTO_T (TDFReaderP reader)
140
{
141
    switch (reader->type) EXHAUSTIVE {
142
      case RT_STREAM:
143
	return (bistream_name (&(reader->u.bistream)));
144
      case RT_STRING:
145
	return (reader->u.string.name);
146
    }
147
    UNREACHED;
148
}
149
 
150
unsigned
151
tdf_reader_byte PROTO_N ((reader))
152
		PROTO_T (TDFReaderP reader)
153
{
154
    switch (reader->type) EXHAUSTIVE {
155
      case RT_STREAM:
156
	return (bistream_byte (&(reader->u.bistream)));
157
      case RT_STRING:
158
	return (reader->u.string.byte);
159
    }
160
    UNREACHED;
161
}
162
 
163
unsigned
164
tdf_read_int PROTO_N ((reader))
165
	     PROTO_T (TDFReaderP reader)
166
{
167
    unsigned value = 0;
168
    unsigned limit = (UINT_MAX >> 3);
169
 
170
    for (;;) {
171
	unsigned nibble = tdf_read_nibble (reader);
172
 
173
	if (value > limit) {
174
	    E_tdf_integer_too_big_in_tdf (reader);
175
	    THROW (XX_tdf_read_error);
176
	    UNREACHED;
177
	}
178
	value <<= 3;
179
	value |= (nibble & 0x7);
180
	if (nibble & 0x8) {
181
	    return (value);
182
	}
183
    }
184
}
185
 
186
void
187
tdf_read_align PROTO_N ((reader))
188
	       PROTO_T (TDFReaderP reader)
189
{
190
    reader->new_byte = TRUE;
191
}
192
 
193
void
194
tdf_read_bytes PROTO_N ((reader, nstring))
195
	       PROTO_T (TDFReaderP reader X
196
			NStringP   nstring)
197
{
198
    unsigned length   = nstring_length (nstring);
199
    CStringP contents = nstring_contents (nstring);
200
 
201
    tdf_read_align (reader);
202
    switch (reader->type) EXHAUSTIVE {
203
      case RT_STREAM:
204
	if (bistream_read_chars (&(reader->u.bistream), length, contents) !=
205
	    length) {
206
	    E_unexpected_eof_in_tdf (reader);
207
	    THROW (XX_tdf_read_error);
208
	    UNREACHED;
209
	}
210
	break;
211
      case RT_STRING:
212
	if ((reader->u.string.current + length) > reader->u.string.limit) {
213
	    E_unexpected_eof_in_tdf (reader);
214
	    THROW (XX_tdf_read_error);
215
	    UNREACHED;
216
	}
217
	nstring_insert_cstring (nstring, reader->u.string.current);
218
	reader->u.string.current += length;
219
	reader->u.string.byte    += length;
220
	break;
221
    }
222
}
223
 
224
void
225
tdf_read_string PROTO_N ((reader, nstring))
226
		PROTO_T (TDFReaderP reader X
227
			 NStringP   nstring)
228
{
229
    unsigned size = tdf_read_int (reader);
230
    unsigned length;
231
 
232
    if (size != 8) {
233
	E_unsupported_char_size_in_tdf (reader, size);
234
	THROW (XX_tdf_read_error);
235
	UNREACHED;
236
    }
237
    length = tdf_read_int (reader);
238
    nstring_init_length (nstring, length);
239
    tdf_read_bytes (reader, nstring);
240
}
241
 
242
void
243
tdf_read_name PROTO_N ((reader, name))
244
	      PROTO_T (TDFReaderP reader X
245
		       NameKeyP   name)
246
{
247
    unsigned type = ((tdf_read_nibble (reader) >> 2) & 0x3);
248
    NStringT nstring;
249
    unsigned components;
250
    unsigned i;
251
 
252
    tdf_read_align (reader);
253
    switch (type) {
254
      case 0x1:
255
	tdf_read_string (reader, &nstring);
256
	name_key_init_string (name, &nstring);
257
	break;
258
      case 0x2:
259
	components = tdf_read_int (reader);
260
	name_key_init_unique (name, components);
261
	for (i = 0; i < components; i ++) {
262
	    tdf_read_string (reader, &nstring);
263
	    name_key_set_component (name, i, &nstring);
264
	}
265
	break;
266
      default:
267
	E_bad_name_type_in_tdf (reader, type);
268
	THROW (XX_tdf_read_error);
269
	UNREACHED;
270
    }
271
}
272
 
273
void
274
tdf_read_eof PROTO_N ((reader))
275
	     PROTO_T (TDFReaderP reader)
276
{
277
    ByteT byte;
278
 
279
    switch (reader->type) EXHAUSTIVE {
280
      case RT_STREAM:
281
	if (bistream_read_byte (&(reader->u.bistream), &byte)) {
282
	    E_expected_eof_in_tdf (reader);
283
	    THROW (XX_tdf_read_error);
284
	    UNREACHED;
285
	}
286
	break;
287
      case RT_STRING:
288
	if (reader->u.string.current < reader->u.string.limit) {
289
	    E_expected_eof_in_tdf (reader);
290
	    THROW (XX_tdf_read_error);
291
	    UNREACHED;
292
	}
293
	break;
294
    }
295
}
296
 
297
void
298
tdf_reader_rewind PROTO_N ((reader))
299
		  PROTO_T (TDFReaderP reader)
300
{
301
    switch (reader->type) EXHAUSTIVE {
302
      case RT_STREAM:
303
	bistream_rewind (&(reader->u.bistream));
304
	break;
305
      case RT_STRING:
306
	reader->u.string.current = reader->u.string.contents;
307
	break;
308
    }
309
}
310
 
311
void
312
tdf_reader_close PROTO_N ((reader))
313
		 PROTO_T (TDFReaderP reader)
314
{
315
    switch (reader->type) EXHAUSTIVE {
316
      case RT_STREAM:
317
	bistream_close (&(reader->u.bistream));
318
	break;
319
      case RT_STRING:
320
	break;
321
    }
322
}
323
 
324
/*
325
 * Local variables(smf):
326
 * eval: (include::add-path-entry "../os-interface" "../library")
327
 * eval: (include::add-path-entry "../generated")
328
 * end:
329
**/