Warning: Attempt to read property "date" on null in /usr/local/www/websvn.planix.org/blame.php on line 247

Warning: Attempt to read property "msg" on null in /usr/local/www/websvn.planix.org/blame.php on line 247
WebSVN – tendra.SVN – Blame – /branches/tendra5/src/tools/tld/arg-data.c – Rev 2

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
/**** arg-data.c --- Command line argument data ADT.
32
 *
33
 ** Author: Steve Folkes <smf@hermes.mod.uk>
34
 *
35
 **** Commentary:
36
 *
37
 * This file implements the ADT that stores the information on the various
38
 * command line options that were given to the TDF linker.
39
 *
40
 **** Change Log:
41
 * $Log: arg-data.c,v $
42
 * Revision 1.1.1.1  1998/01/17  15:57:16  release
43
 * First version to be checked into rolling release.
44
 *
45
 * Revision 1.4  1995/09/22  08:36:58  smf
46
 * Fixed problems with incomplete structures (to shut "tcc" up).
47
 *
48
 * Revision 1.3  1995/07/07  15:31:54  smf
49
 * Updated to support TDF specification 4.0.
50
 *
51
 * Revision 1.2  1994/12/12  11:43:52  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:22  smf
56
 * Initial import of TDF linker 3.5 non shared files.
57
 *
58
**/
59
 
60
/****************************************************************************/
61
 
62
#include "arg-data.h"
63
#include "capsule.h"
64
#include "gen-errors.h"
65
 
66
#include "solve-cycles.h"
67
 
68
/*--------------------------------------------------------------------------*/
69
 
70
static void
71
shape_control_init PROTO_N ((control))
72
		   PROTO_T (ShapeControlP control)
73
{
74
    control->head = NIL (ShapeControlEntryP);
75
}
76
 
77
static ShapeControlEntryP
78
shape_control_find PROTO_N ((control, shape))
79
		   PROTO_T (ShapeControlP control X
80
			    CStringP      shape)
81
{
82
    NStringT           nstring;
83
    ShapeControlEntryP entry;
84
 
85
    nstring_copy_cstring (&nstring, shape);
86
    for (entry = control->head; entry; entry = entry->next) {
87
	if (nstring_equal (&nstring, &(entry->shape))) {
88
	    nstring_destroy (&nstring);
89
	    return (entry);
90
	}
91
    }
92
    entry             = ALLOCATE (ShapeControlEntryT);
93
    entry->next       = control->head;
94
    nstring_assign (&(entry->shape), &nstring);
95
    entry->all        = FALSE;
96
    name_key_list_init (&(entry->names));
97
    control->head     = entry;
98
    return (entry);
99
}
100
 
101
static void
102
shape_control_entry_add_name PROTO_N ((entry, name))
103
			     PROTO_T (ShapeControlEntryP entry X
104
				      CStringP           name)
105
{
106
    NameKeyT key;
107
 
108
    if (name_key_parse_cstring (&key, name)) {
109
	name_key_list_add (&(entry->names), &key);
110
    } else {
111
	E_illegal_external_name (name);
112
    }
113
}
114
 
115
static void
116
shape_control_entry_set PROTO_N ((entry))
117
			PROTO_T (ShapeControlEntryP entry)
118
{
119
    entry->all = TRUE;
120
}
121
 
122
/*--------------------------------------------------------------------------*/
123
 
124
static void
125
rename_control_init PROTO_N ((control))
126
		    PROTO_T (RenameControlP control)
127
{
128
    control->head = NIL (RenameControlEntryP);
129
}
130
 
131
static RenameControlEntryP
132
rename_control_find PROTO_N ((control, shape))
133
		    PROTO_T (RenameControlP control X
134
			     NStringP       shape)
135
{
136
    RenameControlEntryP entry;
137
 
138
    for (entry = control->head; entry; entry = entry->next) {
139
	if (nstring_equal (shape, &(entry->shape))) {
140
	    return (entry);
141
	}
142
    }
143
    entry             = ALLOCATE (RenameControlEntryT);
144
    entry->next       = control->head;
145
    nstring_copy (&(entry->shape), shape);
146
    name_key_pair_list_init (&(entry->names));
147
    control->head     = entry;
148
    return (entry);
149
}
150
 
151
static NameKeyPairListP
152
rename_control_entry_names PROTO_N ((entry))
153
			   PROTO_T (RenameControlEntryP entry)
154
{
155
    return (&(entry->names));
156
}
157
 
158
static void
159
rename_control_entry_parse_pair PROTO_N ((entry, from, to))
160
				PROTO_T (RenameControlEntryP entry X
161
					 CStringP            from X
162
					 CStringP            to)
163
{
164
    NStringP shape = &(entry->shape);
165
    NameKeyT from_key;
166
    NameKeyT to_key;
167
 
168
    if (!name_key_parse_cstring (&from_key, from)) {
169
	E_illegal_external_name (from);
170
    } else if (!name_key_parse_cstring (&to_key, to)) {
171
	E_illegal_external_name (to);
172
    } else if (!name_key_pair_list_add (&(entry->names), &from_key, &to_key)) {
173
	E_multiply_renamed_name (shape, &from_key);
174
	name_key_destroy (&from_key);
175
	name_key_destroy (&to_key);
176
    }
177
}
178
 
179
/*--------------------------------------------------------------------------*/
180
 
181
void
182
shape_control_iter PROTO_N ((control, proc, closure))
183
		   PROTO_T (ShapeControlP control X
184
			    void        (*proc) PROTO_S ((NStringP, BoolT,
185
							  NameKeyListP,
186
							  GenericP)) X
187
			    GenericP      closure)
188
{
189
    ShapeControlEntryP entry;
190
 
191
    for (entry = control->head; entry; entry = entry->next) {
192
	(*proc) (&(entry->shape), entry->all, &(entry->names), closure);
193
    }
194
}
195
 
196
void
197
rename_control_iter PROTO_N ((control, proc, closure))
198
		    PROTO_T (RenameControlP control X
199
			     void         (*proc) PROTO_S ((NStringP,
200
							    NameKeyPairListP,
201
							    GenericP)) X
202
			     GenericP       closure)
203
{
204
    RenameControlEntryP entry;
205
 
206
    for (entry = control->head; entry; entry = entry->next) {
207
	(*proc) (&(entry->shape), &(entry->names), closure);
208
    }
209
}
210
 
211
/*--------------------------------------------------------------------------*/
212
 
213
void
214
arg_data_init PROTO_N ((arg_data, default_output_file))
215
	      PROTO_T (ArgDataP arg_data X
216
		       CStringP default_output_file)
217
{
218
    arg_data->all_hide_defined    = FALSE;
219
    arg_data->suppress_mult       = FALSE;
220
    shape_control_init (&(arg_data->hides));
221
    shape_control_init (&(arg_data->keeps));
222
    shape_control_init (&(arg_data->suppresses));
223
    rename_control_init (&(arg_data->renames));
224
    arg_data->extract_all         = FALSE;
225
    arg_data->extract_basename    = FALSE;
226
    arg_data->extract_match_base  = FALSE;
227
    arg_data->content_index       = FALSE;
228
    arg_data->content_size        = FALSE;
229
    arg_data->content_version     = FALSE;
230
    ostream_init (&(arg_data->debug_file));
231
    arg_data->default_output_file = default_output_file;
232
    arg_data->output_file         = NIL (CStringP);
233
    arg_data->num_library_files   = 0;
234
    arg_data->num_library_paths   = 0;
235
    cstring_list_init (&arg_data->library.list.file);
236
    cstring_list_init (&(arg_data->library.list.path));
237
    arg_data->unit_file           = NIL (CStringP);
238
    arg_data->num_files           = 0;
239
}
240
 
241
void
242
arg_data_set_all_hide_defd PROTO_N ((arg_data, enable))
243
			   PROTO_T (ArgDataP arg_data X
244
				    BoolT    enable)
245
{
246
    arg_data->all_hide_defined = enable;
247
}
248
 
249
BoolT
250
arg_data_get_all_hide_defd PROTO_N ((arg_data))
251
			   PROTO_T (ArgDataP arg_data)
252
{
253
    return (arg_data->all_hide_defined);
254
}
255
 
256
void
257
arg_data_set_suppress_mult PROTO_N ((arg_data, enable))
258
			   PROTO_T (ArgDataP arg_data X
259
				    BoolT    enable)
260
{
261
    arg_data->suppress_mult = enable;
262
}
263
 
264
BoolT
265
arg_data_get_suppress_mult PROTO_N ((arg_data))
266
			   PROTO_T (ArgDataP arg_data)
267
{
268
    return (arg_data->suppress_mult);
269
}
270
 
271
void
272
arg_data_add_hide PROTO_N ((arg_data, shape, name))
273
		  PROTO_T (ArgDataP arg_data X
274
			   CStringP shape X
275
			   CStringP name)
276
{
277
    ShapeControlEntryP entry = shape_control_find (&(arg_data->hides), shape);
278
 
279
    shape_control_entry_add_name (entry, name);
280
}
281
 
282
void
283
arg_data_add_hide_defined PROTO_N ((arg_data, shape))
284
			  PROTO_T (ArgDataP arg_data X
285
				   CStringP shape)
286
{
287
    ShapeControlEntryP entry = shape_control_find (&(arg_data->hides), shape);
288
 
289
    shape_control_entry_set (entry);
290
}
291
 
292
ShapeControlP
293
arg_data_get_hides PROTO_N ((arg_data))
294
		   PROTO_T (ArgDataP arg_data)
295
{
296
    return (&(arg_data->hides));
297
}
298
 
299
void
300
arg_data_add_keep PROTO_N ((arg_data, shape, name))
301
		  PROTO_T (ArgDataP arg_data X
302
			   CStringP shape X
303
			   CStringP name)
304
{
305
    ShapeControlEntryP entry = shape_control_find (&(arg_data->keeps), shape);
306
 
307
    shape_control_entry_add_name (entry, name);
308
}
309
 
310
void
311
arg_data_add_keep_all PROTO_N ((arg_data, shape))
312
		      PROTO_T (ArgDataP arg_data X
313
			       CStringP shape)
314
{
315
    ShapeControlEntryP entry = shape_control_find (&(arg_data->keeps), shape);
316
 
317
    shape_control_entry_set (entry);
318
}
319
 
320
ShapeControlP
321
arg_data_get_keeps PROTO_N ((arg_data))
322
		   PROTO_T (ArgDataP arg_data)
323
{
324
    return (&(arg_data->keeps));
325
}
326
 
327
void
328
arg_data_add_suppress PROTO_N ((arg_data, shape, name))
329
		      PROTO_T (ArgDataP arg_data X
330
			       CStringP shape X
331
			       CStringP name)
332
{
333
    ShapeControlEntryP entry = shape_control_find (&(arg_data->suppresses),
334
						   shape);
335
 
336
    shape_control_entry_add_name (entry, name);
337
}
338
 
339
void
340
arg_data_add_suppress_all PROTO_N ((arg_data, shape))
341
			  PROTO_T (ArgDataP arg_data X
342
				   CStringP shape)
343
{
344
    ShapeControlEntryP entry = shape_control_find (&(arg_data->suppresses),
345
						   shape);
346
 
347
    shape_control_entry_set (entry);
348
}
349
 
350
ShapeControlP
351
arg_data_get_suppresses PROTO_N ((arg_data))
352
			PROTO_T (ArgDataP arg_data)
353
{
354
    return (&(arg_data->suppresses));
355
}
356
 
357
void
358
arg_data_add_rename PROTO_N ((arg_data, shape, from, to))
359
		    PROTO_T (ArgDataP arg_data X
360
			     NStringP shape X
361
			     NameKeyP from X
362
			     NameKeyP to)
363
{
364
    RenameControlEntryP entry;
365
    NameKeyPairListP    names;
366
 
367
    entry = rename_control_find (&(arg_data->renames), shape);
368
    names = rename_control_entry_names (entry);
369
    if (!name_key_pair_list_add (names, from, to)) {
370
	E_multiply_renamed_name (shape, from);
371
	name_key_destroy (from);
372
	name_key_destroy (to);
373
    }
374
}
375
 
376
void
377
arg_data_parse_rename PROTO_N ((arg_data, shape, from, to))
378
		      PROTO_T (ArgDataP arg_data X
379
			       CStringP shape X
380
			       CStringP from X
381
			       CStringP to)
382
{
383
    NStringT            nstring;
384
    RenameControlEntryP entry;
385
 
386
    nstring_copy_cstring (&nstring, shape);
387
    entry = rename_control_find (&(arg_data->renames), &nstring);
388
    nstring_destroy (&nstring);
389
    rename_control_entry_parse_pair (entry, from, to);
390
}
391
 
392
RenameControlP
393
arg_data_get_renames PROTO_N ((arg_data))
394
		     PROTO_T (ArgDataP arg_data)
395
{
396
    return (&(arg_data->renames));
397
}
398
 
399
void
400
arg_data_set_extract_all PROTO_N ((arg_data, enable))
401
			 PROTO_T (ArgDataP arg_data X
402
				  BoolT    enable)
403
{
404
    arg_data->extract_all = enable;
405
}
406
 
407
BoolT
408
arg_data_get_extract_all PROTO_N ((arg_data))
409
			 PROTO_T (ArgDataP arg_data)
410
{
411
    return (arg_data->extract_all);
412
}
413
 
414
void
415
arg_data_set_extract_basename PROTO_N ((arg_data, enable))
416
			      PROTO_T (ArgDataP arg_data X
417
				       BoolT    enable)
418
{
419
    arg_data->extract_basename = enable;
420
}
421
 
422
BoolT
423
arg_data_get_extract_basename PROTO_N ((arg_data))
424
			      PROTO_T (ArgDataP arg_data)
425
{
426
    return (arg_data->extract_basename);
427
}
428
 
429
void
430
arg_data_set_extract_match_base PROTO_N ((arg_data, enable))
431
				PROTO_T (ArgDataP arg_data X
432
					 BoolT    enable)
433
{
434
    arg_data->extract_match_base = enable;
435
}
436
 
437
BoolT
438
arg_data_get_extract_match_base PROTO_N ((arg_data))
439
				PROTO_T (ArgDataP arg_data)
440
{
441
    return (arg_data->extract_match_base);
442
}
443
 
444
void
445
arg_data_set_content_index PROTO_N ((arg_data, enable))
446
			   PROTO_T (ArgDataP arg_data X
447
				    BoolT    enable)
448
{
449
    arg_data->content_index = enable;
450
}
451
 
452
BoolT
453
arg_data_get_content_index PROTO_N ((arg_data))
454
			   PROTO_T (ArgDataP arg_data)
455
{
456
    return (arg_data->content_index);
457
}
458
 
459
void
460
arg_data_set_content_size PROTO_N ((arg_data, enable))
461
			  PROTO_T (ArgDataP arg_data X
462
				   BoolT    enable)
463
{
464
    arg_data->content_size = enable;
465
}
466
 
467
BoolT
468
arg_data_get_content_size PROTO_N ((arg_data))
469
			  PROTO_T (ArgDataP arg_data)
470
{
471
    return (arg_data->content_size);
472
}
473
 
474
void
475
arg_data_set_content_version PROTO_N ((arg_data, enable))
476
    			     PROTO_T (ArgDataP arg_data X
477
				      BoolT    enable)
478
{
479
    arg_data->content_version = enable;
480
}
481
 
482
BoolT
483
arg_data_get_content_version PROTO_N ((arg_data))
484
    			     PROTO_T (ArgDataP arg_data)
485
{
486
    return (arg_data->content_version);
487
}
488
 
489
void
490
arg_data_set_debug_file PROTO_N ((arg_data, debug_file))
491
			PROTO_T (ArgDataP arg_data X
492
				 CStringP debug_file)
493
{
494
    if (ostream_is_open (&(arg_data->debug_file))) {
495
	E_tld_multiple_debug_files ();
496
	UNREACHED;
497
    }
498
    if (!ostream_open (&(arg_data->debug_file), debug_file)) {
499
	E_tld_cannot_open_debug_file (debug_file);
500
	UNREACHED;
501
    }
502
}
503
 
504
OStreamP
505
arg_data_get_debug_file PROTO_N ((arg_data))
506
			PROTO_T (ArgDataP arg_data)
507
{
508
    return (&(arg_data->debug_file));
509
}
510
 
511
void
512
arg_data_set_output_file PROTO_N ((arg_data, output_file))
513
			 PROTO_T (ArgDataP arg_data X
514
				  CStringP output_file)
515
{
516
    if (arg_data->output_file) {
517
	E_tld_multiple_output_files ();
518
	UNREACHED;
519
    }
520
    arg_data->output_file = output_file;
521
}
522
 
523
CStringP
524
arg_data_get_output_file PROTO_N ((arg_data))
525
			 PROTO_T (ArgDataP arg_data)
526
{
527
    if (arg_data->output_file) {
528
	return (arg_data->output_file);
529
    } else {
530
	return (arg_data->default_output_file);
531
    }
532
}
533
 
534
void
535
arg_data_add_library_file PROTO_N ((arg_data, library_file))
536
			  PROTO_T (ArgDataP arg_data X
537
				   CStringP library_file)
538
{
539
    CStringListP libraries = &(arg_data->library.list.file);
540
    if (!cstring_list_contains (libraries, library_file)) {
541
	arg_data->num_library_files ++;
542
	cstring_list_append (libraries, library_file);
543
    }
544
}
545
 
546
void
547
arg_data_add_library_path PROTO_N ((arg_data, directory))
548
			  PROTO_T (ArgDataP arg_data X
549
				   CStringP directory)
550
{
551
    arg_data->num_library_paths ++;
552
    cstring_list_append (&(arg_data->library.list.path), directory);
553
}
554
 
555
void
556
arg_data_vector_libraries PROTO_N ((arg_data))
557
			  PROTO_T (ArgDataP arg_data)
558
{
559
    unsigned          num_files = arg_data->num_library_files;
560
    unsigned          num_paths = arg_data->num_library_paths;
561
    CStringP         *files     = ALLOCATE_VECTOR (CStringP, num_files);
562
    CStringP         *paths     = ALLOCATE_VECTOR (CStringP, num_paths);
563
    CStringListEntryP entry;
564
    unsigned          i;
565
 
566
    for (i = 0, entry = cstring_list_head (&(arg_data->library.list.file));
567
	 i < num_files; i ++, entry = cstring_list_entry_deallocate (entry)) {
568
	files [i] = cstring_list_entry_string (entry);
569
    }
570
    for (i = 0, entry = cstring_list_head (&(arg_data->library.list.path));
571
	 i < num_paths; i ++, entry = cstring_list_entry_deallocate (entry)) {
572
	paths [i] = cstring_list_entry_string (entry);
573
    }
574
    arg_data->library.vector.file = files;
575
    arg_data->library.vector.path = paths;
576
}
577
 
578
unsigned
579
arg_data_num_library_files PROTO_N ((arg_data))
580
			   PROTO_T (ArgDataP arg_data)
581
{
582
    return (arg_data->num_library_files);
583
}
584
 
585
unsigned
586
arg_data_num_library_paths PROTO_N ((arg_data))
587
			   PROTO_T (ArgDataP arg_data)
588
{
589
    return (arg_data->num_library_paths);
590
}
591
 
592
CStringP *
593
arg_data_library_files PROTO_N ((arg_data))
594
		       PROTO_T (ArgDataP arg_data)
595
{
596
    return (arg_data->library.vector.file);
597
}
598
 
599
CStringP *
600
arg_data_library_paths PROTO_N ((arg_data))
601
		       PROTO_T (ArgDataP arg_data)
602
{
603
    return (arg_data->library.vector.path);
604
}
605
 
606
void
607
arg_data_set_unit_file PROTO_N ((arg_data, unit_file))
608
		       PROTO_T (ArgDataP arg_data X
609
				CStringP unit_file)
610
{
611
    if (arg_data->unit_file) {
612
	E_tld_multiple_unit_files ();
613
	UNREACHED;
614
    }
615
    arg_data->unit_file = unit_file;
616
    capsule_read_unit_set_file (unit_file);
617
}
618
 
619
void
620
arg_data_set_files PROTO_N ((arg_data, num_files, files))
621
		   PROTO_T (ArgDataP  arg_data X
622
			    int       num_files X
623
			    CStringP *files)
624
{
625
    arg_data->num_files = (unsigned) num_files;
626
    arg_data->files     = files;
627
}
628
 
629
unsigned
630
arg_data_get_num_files PROTO_N ((arg_data))
631
		       PROTO_T (ArgDataP arg_data)
632
{
633
    return (arg_data->num_files);
634
}
635
 
636
CStringP *
637
arg_data_get_files PROTO_N ((arg_data))
638
		   PROTO_T (ArgDataP arg_data)
639
{
640
    return (arg_data->files);
641
}
642
 
643
/*
644
 * Local variables(smf):
645
 * eval: (include::add-path-entry "../os-interface" "../library" "../tdf")
646
 * eval: (include::add-path-entry "../generated")
647
 * End:
648
**/