OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [tags/] [gnu-src/] [gcc-4.5.1/] [gcc-4.5.1-or32-1.0rc3/] [gcc/] [ada/] [prepcomp.adb] - Blame information for rev 516

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 281 jeremybenn
------------------------------------------------------------------------------
2
--                                                                          --
3
--                         GNAT COMPILER COMPONENTS                         --
4
--                                                                          --
5
--                             P R E P C O M P                              --
6
--                                                                          --
7
--                                 B o d y                                  --
8
--                                                                          --
9
--          Copyright (C) 2003-2009, Free Software Foundation, Inc.         --
10
--                                                                          --
11
-- GNAT is free software;  you can  redistribute it  and/or modify it under --
12
-- terms of the  GNU General Public License as published  by the Free Soft- --
13
-- ware  Foundation;  either version 3,  or (at your option) any later ver- --
14
-- sion.  GNAT is distributed in the hope that it will be useful, but WITH- --
15
-- OUT ANY WARRANTY;  without even the  implied warranty of MERCHANTABILITY --
16
-- or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License --
17
-- for  more details.  You should have  received  a copy of the GNU General --
18
-- Public License  distributed with GNAT; see file COPYING3.  If not, go to --
19
-- http://www.gnu.org/licenses for a complete copy of the license.          --
20
--                                                                          --
21
-- GNAT was originally developed  by the GNAT team at  New York University. --
22
-- Extensive contributions were provided by Ada Core Technologies Inc.      --
23
--                                                                          --
24
------------------------------------------------------------------------------
25
 
26
with Ada.Unchecked_Deallocation;
27
 
28
with Errout;   use Errout;
29
with Lib.Writ; use Lib.Writ;
30
with Opt;      use Opt;
31
with Osint;    use Osint;
32
with Prep;     use Prep;
33
with Scans;    use Scans;
34
with Scn;      use Scn;
35
with Sinput.L; use Sinput.L;
36
with Stringt;  use Stringt;
37
with Table;
38
with Types;    use Types;
39
 
40
package body Prepcomp is
41
 
42
   No_Preprocessing : Boolean := True;
43
   --  Set to False if there is at least one source that needs to be
44
   --  preprocessed.
45
 
46
   Source_Index_Of_Preproc_Data_File : Source_File_Index := No_Source_File;
47
 
48
   --  The following variable should be a constant, but this is not possible
49
   --  because its type GNAT.Dynamic_Tables.Instance has a component P of
50
   --  unitialized private type GNAT.Dynamic_Tables.Table_Private and there
51
   --  are no exported values for this private type. Warnings are Off because
52
   --  it is never assigned a value.
53
 
54
   pragma Warnings (Off);
55
   No_Mapping : Prep.Symbol_Table.Instance;
56
   pragma Warnings (On);
57
 
58
   type String_Ptr is access String;
59
   type String_Array is array (Positive range <>) of String_Ptr;
60
   type String_Array_Ptr is access String_Array;
61
 
62
   procedure Free is
63
      new Ada.Unchecked_Deallocation (String_Array, String_Array_Ptr);
64
 
65
   Symbol_Definitions : String_Array_Ptr := new String_Array (1 .. 4);
66
   --  An extensible array to temporarily stores symbol definitions specified
67
   --  on the command line with -gnateD switches.
68
 
69
   Last_Definition : Natural := 0;
70
   --  Index of last symbol definition in array Symbol_Definitions
71
 
72
   type Preproc_Data is record
73
      Mapping      : Symbol_Table.Instance;
74
      File_Name    : File_Name_Type := No_File;
75
      Deffile      : String_Id      := No_String;
76
      Undef_False  : Boolean        := False;
77
      Always_Blank : Boolean        := False;
78
      Comments     : Boolean        := False;
79
      List_Symbols : Boolean        := False;
80
      Processed    : Boolean        := False;
81
   end record;
82
   --  Structure to keep the preprocessing data for a file name or for the
83
   --  default (when Name_Id = No_Name).
84
 
85
   No_Preproc_Data : constant Preproc_Data :=
86
     (Mapping      => No_Mapping,
87
      File_Name    => No_File,
88
      Deffile      => No_String,
89
      Undef_False  => False,
90
      Always_Blank => False,
91
      Comments     => False,
92
      List_Symbols => False,
93
      Processed    => False);
94
 
95
   Default_Data : Preproc_Data := No_Preproc_Data;
96
   --  The preprocessing data to be used when no specific preprocessing data
97
   --  is specified for a source.
98
 
99
   Default_Data_Defined : Boolean := False;
100
   --  True if source for which no specific preprocessing is specified need to
101
   --  be preprocess with the Default_Data.
102
 
103
   Current_Data : Preproc_Data := No_Preproc_Data;
104
 
105
   package Preproc_Data_Table is new Table.Table
106
     (Table_Component_Type => Preproc_Data,
107
      Table_Index_Type     => Int,
108
      Table_Low_Bound      => 1,
109
      Table_Initial        => 5,
110
      Table_Increment      => 100,
111
      Table_Name           => "Prepcomp.Preproc_Data_Table");
112
   --  Table to store the specific preprocessing data
113
 
114
   Command_Line_Symbols : Symbol_Table.Instance;
115
   --  A table to store symbol definitions specified on the command line with
116
   --  -gnateD switches.
117
 
118
   package Dependencies is new Table.Table
119
     (Table_Component_Type => Source_File_Index,
120
      Table_Index_Type     => Int,
121
      Table_Low_Bound      => 1,
122
      Table_Initial        => 10,
123
      Table_Increment      => 100,
124
      Table_Name           => "Prepcomp.Dependencies");
125
   --  Table to store the dependencies on preprocessing files
126
 
127
   procedure Add_Command_Line_Symbols;
128
   --  Add the command line symbol definitions, if any, to Prep.Mapping table
129
 
130
   procedure Skip_To_End_Of_Line;
131
   --  Ignore errors and scan up to the next end of line or the end of file
132
 
133
   ------------------------------
134
   -- Add_Command_Line_Symbols --
135
   ------------------------------
136
 
137
   procedure Add_Command_Line_Symbols is
138
      Symbol_Id : Prep.Symbol_Id;
139
 
140
   begin
141
      for J in 1 .. Symbol_Table.Last (Command_Line_Symbols) loop
142
         Symbol_Id := Prep.Index_Of (Command_Line_Symbols.Table (J).Symbol);
143
 
144
         if Symbol_Id = No_Symbol then
145
            Symbol_Table.Increment_Last (Prep.Mapping);
146
            Symbol_Id := Symbol_Table.Last (Prep.Mapping);
147
         end if;
148
 
149
         Prep.Mapping.Table (Symbol_Id) := Command_Line_Symbols.Table (J);
150
      end loop;
151
   end Add_Command_Line_Symbols;
152
 
153
   ----------------------
154
   -- Add_Dependencies --
155
   ----------------------
156
 
157
   procedure Add_Dependencies is
158
   begin
159
      for Index in 1 .. Dependencies.Last loop
160
         Add_Preprocessing_Dependency (Dependencies.Table (Index));
161
      end loop;
162
   end Add_Dependencies;
163
 
164
   ---------------------------
165
   -- Add_Symbol_Definition --
166
   ---------------------------
167
 
168
   procedure Add_Symbol_Definition (Def : String) is
169
   begin
170
      --  If Symbol_Definitions is not large enough, double it
171
 
172
      if Last_Definition = Symbol_Definitions'Last then
173
         declare
174
            New_Symbol_Definitions : constant String_Array_Ptr :=
175
              new String_Array (1 .. 2 * Last_Definition);
176
 
177
         begin
178
            New_Symbol_Definitions (Symbol_Definitions'Range) :=
179
              Symbol_Definitions.all;
180
            Free (Symbol_Definitions);
181
            Symbol_Definitions := New_Symbol_Definitions;
182
         end;
183
      end if;
184
 
185
      Last_Definition := Last_Definition + 1;
186
      Symbol_Definitions (Last_Definition) := new String'(Def);
187
   end Add_Symbol_Definition;
188
 
189
   -------------------
190
   -- Check_Symbols --
191
   -------------------
192
 
193
   procedure Check_Symbols is
194
   begin
195
      --  If there is at least one switch -gnateD specified
196
 
197
      if Symbol_Table.Last (Command_Line_Symbols) >= 1 then
198
         Current_Data := No_Preproc_Data;
199
         No_Preprocessing := False;
200
         Current_Data.Processed := True;
201
 
202
         --  Start with an empty, initialized mapping table; use Prep.Mapping,
203
         --  because Prep.Index_Of uses Prep.Mapping.
204
 
205
         Prep.Mapping := No_Mapping;
206
         Symbol_Table.Init (Prep.Mapping);
207
 
208
         --  Add the command line symbols
209
 
210
         Add_Command_Line_Symbols;
211
 
212
         --  Put the resulting Prep.Mapping in Current_Data, and immediately
213
         --  set Prep.Mapping to nil.
214
 
215
         Current_Data.Mapping := Prep.Mapping;
216
         Prep.Mapping := No_Mapping;
217
 
218
         --  Set the default data
219
 
220
         Default_Data := Current_Data;
221
         Default_Data_Defined := True;
222
      end if;
223
   end Check_Symbols;
224
 
225
   ------------------------------
226
   -- Parse_Preprocessing_Data --
227
   ------------------------------
228
 
229
   procedure Parse_Preprocessing_Data_File (N : File_Name_Type) is
230
      OK            : Boolean := False;
231
      Dash_Location : Source_Ptr;
232
      Symbol_Data   : Prep.Symbol_Data;
233
      Symbol_Id     : Prep.Symbol_Id;
234
      T             : constant Nat := Total_Errors_Detected;
235
 
236
   begin
237
      --  Load the preprocessing data file
238
 
239
      Source_Index_Of_Preproc_Data_File := Load_Preprocessing_Data_File (N);
240
 
241
      --  Fail if preprocessing data file cannot be found
242
 
243
      if Source_Index_Of_Preproc_Data_File = No_Source_File then
244
         Get_Name_String (N);
245
         Fail ("preprocessing data file """
246
               & Name_Buffer (1 .. Name_Len)
247
               & """ not found");
248
      end if;
249
 
250
      --  Initialize scanner and set its behavior for processing a data file
251
 
252
      Scn.Scanner.Initialize_Scanner (Source_Index_Of_Preproc_Data_File);
253
      Scn.Scanner.Set_End_Of_Line_As_Token (True);
254
      Scn.Scanner.Reset_Special_Characters;
255
 
256
      For_Each_Line : loop
257
         <<Scan_Line>>
258
         Scan;
259
 
260
         exit For_Each_Line when Token = Tok_EOF;
261
 
262
         if Token = Tok_End_Of_Line then
263
            goto Scan_Line;
264
         end if;
265
 
266
         --  Line is not empty
267
 
268
         OK := False;
269
         No_Preprocessing := False;
270
         Current_Data := No_Preproc_Data;
271
 
272
         case Token is
273
            when Tok_Asterisk =>
274
 
275
               --  Default data
276
 
277
               if Default_Data_Defined then
278
                  Error_Msg
279
                    ("multiple default preprocessing data", Token_Ptr);
280
 
281
               else
282
                  OK := True;
283
                  Default_Data_Defined := True;
284
               end if;
285
 
286
            when Tok_String_Literal =>
287
 
288
               --  Specific data
289
 
290
               String_To_Name_Buffer (String_Literal_Id);
291
               Canonical_Case_File_Name (Name_Buffer (1 .. Name_Len));
292
               Current_Data.File_Name := Name_Find;
293
               OK := True;
294
 
295
               for Index in 1 .. Preproc_Data_Table.Last loop
296
                  if Current_Data.File_Name =
297
                       Preproc_Data_Table.Table (Index).File_Name
298
                  then
299
                     Error_Msg_File_1 := Current_Data.File_Name;
300
                     Error_Msg
301
                       ("multiple preprocessing data for{", Token_Ptr);
302
                     OK := False;
303
                     exit;
304
                  end if;
305
               end loop;
306
 
307
            when others =>
308
               Error_Msg ("`'*` or literal string expected", Token_Ptr);
309
         end case;
310
 
311
         --  If there is a problem, skip the line
312
 
313
         if not OK then
314
            Skip_To_End_Of_Line;
315
            goto Scan_Line;
316
         end if;
317
 
318
         --  Scan past the * or the literal string
319
 
320
         Scan;
321
 
322
         --  A literal string in second position is a definition file
323
 
324
         if Token = Tok_String_Literal then
325
            Current_Data.Deffile := String_Literal_Id;
326
            Current_Data.Processed := False;
327
            Scan;
328
 
329
         else
330
            --  If there is no definition file, set Processed to True now
331
 
332
            Current_Data.Processed := True;
333
         end if;
334
 
335
         --  Start with an empty, initialized mapping table; use Prep.Mapping,
336
         --  because Prep.Index_Of uses Prep.Mapping.
337
 
338
         Prep.Mapping := No_Mapping;
339
         Symbol_Table.Init (Prep.Mapping);
340
 
341
         --  Check the switches that may follow
342
 
343
         while Token /= Tok_End_Of_Line and then Token /= Tok_EOF loop
344
            if Token /= Tok_Minus then
345
               Error_Msg ("`'-` expected", Token_Ptr);
346
               Skip_To_End_Of_Line;
347
               goto Scan_Line;
348
            end if;
349
 
350
            --  Keep the location of the '-' for possible error reporting
351
 
352
            Dash_Location := Token_Ptr;
353
 
354
            --  Scan past the '-'
355
 
356
            Scan;
357
            OK := False;
358
            Change_Reserved_Keyword_To_Symbol;
359
 
360
            --  An identifier (or a reserved word converted to an
361
            --  identifier) is expected and there must be no blank space
362
            --  between the '-' and the identifier.
363
 
364
            if Token = Tok_Identifier
365
              and then Token_Ptr = Dash_Location + 1
366
            then
367
               Get_Name_String (Token_Name);
368
 
369
               --  Check the character in the source, because the case is
370
               --  significant.
371
 
372
               case Sinput.Source (Token_Ptr) is
373
                  when 'u' =>
374
 
375
                     --  Undefined symbol are False
376
 
377
                     if Name_Len = 1 then
378
                        Current_Data.Undef_False := True;
379
                        OK := True;
380
                     end if;
381
 
382
                  when 'b' =>
383
 
384
                     --  Blank lines
385
 
386
                     if Name_Len = 1 then
387
                        Current_Data.Always_Blank := True;
388
                        OK := True;
389
                     end if;
390
 
391
                  when 'c' =>
392
 
393
                     --  Comment removed lines
394
 
395
                     if Name_Len = 1 then
396
                        Current_Data.Comments := True;
397
                        OK := True;
398
                     end if;
399
 
400
                  when 's' =>
401
 
402
                     --  List symbols
403
 
404
                     if Name_Len = 1 then
405
                        Current_Data.List_Symbols := True;
406
                        OK := True;
407
                     end if;
408
 
409
                  when 'D' =>
410
 
411
                     --  Symbol definition
412
 
413
                     OK := Name_Len > 1;
414
 
415
                     if OK then
416
 
417
                        --  A symbol must be an Ada identifier; it cannot start
418
                        --  with an underline or a digit.
419
 
420
                        if Name_Buffer (2) = '_'
421
                          or else Name_Buffer (2) in '0' .. '9'
422
                        then
423
                           Error_Msg ("symbol expected", Token_Ptr + 1);
424
                           Skip_To_End_Of_Line;
425
                           goto Scan_Line;
426
                        end if;
427
 
428
                        --  Get the name id of the symbol
429
 
430
                        Symbol_Data.On_The_Command_Line := True;
431
                        Name_Buffer (1 .. Name_Len - 1) :=
432
                          Name_Buffer (2 .. Name_Len);
433
                        Name_Len := Name_Len - 1;
434
                        Symbol_Data.Symbol := Name_Find;
435
 
436
                        if Name_Buffer (1 .. Name_Len) = "if"
437
                          or else Name_Buffer (1 .. Name_Len) = "else"
438
                          or else Name_Buffer (1 .. Name_Len) = "elsif"
439
                          or else Name_Buffer (1 .. Name_Len) = "end"
440
                          or else Name_Buffer (1 .. Name_Len) = "not"
441
                          or else Name_Buffer (1 .. Name_Len) = "and"
442
                          or else Name_Buffer (1 .. Name_Len) = "then"
443
                        then
444
                           Error_Msg ("symbol expected", Token_Ptr + 1);
445
                           Skip_To_End_Of_Line;
446
                           goto Scan_Line;
447
                        end if;
448
 
449
                        --  Get the name id of the original symbol, with
450
                        --  possibly capital letters.
451
 
452
                        Name_Len := Integer (Scan_Ptr - Token_Ptr - 1);
453
 
454
                        for J in 1 .. Name_Len loop
455
                           Name_Buffer (J) :=
456
                             Sinput.Source (Token_Ptr + Text_Ptr (J));
457
                        end loop;
458
 
459
                        Symbol_Data.Original := Name_Find;
460
 
461
                        --  Scan past D<symbol>
462
 
463
                        Scan;
464
 
465
                        if Token /= Tok_Equal then
466
                           Error_Msg ("`=` expected", Token_Ptr);
467
                           Skip_To_End_Of_Line;
468
                           goto Scan_Line;
469
                        end if;
470
 
471
                        --  Scan past '='
472
 
473
                        Scan;
474
 
475
                        --  Here any reserved word is OK
476
 
477
                        Change_Reserved_Keyword_To_Symbol
478
                          (All_Keywords => True);
479
 
480
                        --  Value can be an identifier (or a reserved word)
481
                        --  or a literal string.
482
 
483
                        case Token is
484
                           when Tok_String_Literal =>
485
                              Symbol_Data.Is_A_String := True;
486
                              Symbol_Data.Value := String_Literal_Id;
487
 
488
                           when Tok_Identifier =>
489
                              Symbol_Data.Is_A_String := False;
490
                              Start_String;
491
 
492
                              for J in Token_Ptr .. Scan_Ptr - 1 loop
493
                                 Store_String_Char (Sinput.Source (J));
494
                              end loop;
495
 
496
                              Symbol_Data.Value := End_String;
497
 
498
                           when others =>
499
                              Error_Msg
500
                                ("literal string or identifier expected",
501
                                 Token_Ptr);
502
                              Skip_To_End_Of_Line;
503
                              goto Scan_Line;
504
                        end case;
505
 
506
                        --  If symbol already exists, replace old definition
507
                        --  by new one.
508
 
509
                        Symbol_Id := Prep.Index_Of (Symbol_Data.Symbol);
510
 
511
                        --  Otherwise, add a new entry in the table
512
 
513
                        if Symbol_Id = No_Symbol then
514
                           Symbol_Table.Increment_Last (Prep.Mapping);
515
                           Symbol_Id := Symbol_Table.Last (Mapping);
516
                        end if;
517
 
518
                        Prep.Mapping.Table (Symbol_Id) := Symbol_Data;
519
                     end if;
520
 
521
                  when others =>
522
                     null;
523
               end case;
524
 
525
               Scan;
526
            end if;
527
 
528
            if not OK then
529
               Error_Msg ("invalid switch", Dash_Location);
530
               Skip_To_End_Of_Line;
531
               goto Scan_Line;
532
            end if;
533
         end loop;
534
 
535
         --  Add the command line symbols, if any, possibly replacing symbols
536
         --  just defined.
537
 
538
         Add_Command_Line_Symbols;
539
 
540
         --  Put the resulting Prep.Mapping in Current_Data, and immediately
541
         --  set Prep.Mapping to nil.
542
 
543
         Current_Data.Mapping := Prep.Mapping;
544
         Prep.Mapping := No_Mapping;
545
 
546
         --  Record Current_Data
547
 
548
         if Current_Data.File_Name = No_File then
549
            Default_Data := Current_Data;
550
 
551
         else
552
            Preproc_Data_Table.Increment_Last;
553
            Preproc_Data_Table.Table (Preproc_Data_Table.Last) := Current_Data;
554
         end if;
555
 
556
         Current_Data := No_Preproc_Data;
557
      end loop For_Each_Line;
558
 
559
      Scn.Scanner.Set_End_Of_Line_As_Token (False);
560
 
561
      --  Fail if there were errors in the preprocessing data file
562
 
563
      if Total_Errors_Detected > T then
564
         Errout.Finalize (Last_Call => True);
565
         Errout.Output_Messages;
566
         Fail ("errors found in preprocessing data file """
567
               & Get_Name_String (N) & """");
568
      end if;
569
 
570
      --  Record the dependency on the preprocessor data file
571
 
572
      Dependencies.Increment_Last;
573
      Dependencies.Table (Dependencies.Last) :=
574
        Source_Index_Of_Preproc_Data_File;
575
   end Parse_Preprocessing_Data_File;
576
 
577
   ---------------------------
578
   -- Prepare_To_Preprocess --
579
   ---------------------------
580
 
581
   procedure Prepare_To_Preprocess
582
     (Source               : File_Name_Type;
583
      Preprocessing_Needed : out Boolean)
584
   is
585
      Default : Boolean := False;
586
      Index   : Int := 0;
587
 
588
   begin
589
      --  By default, preprocessing is not needed
590
 
591
      Preprocessing_Needed := False;
592
 
593
      if No_Preprocessing then
594
         return;
595
      end if;
596
 
597
      --  First, look for preprocessing data specific to the current source
598
 
599
      for J in 1 .. Preproc_Data_Table.Last loop
600
         if Preproc_Data_Table.Table (J).File_Name = Source then
601
            Index := J;
602
            Current_Data := Preproc_Data_Table.Table (J);
603
            exit;
604
         end if;
605
      end loop;
606
 
607
      --  If no specific preprocessing data, then take the default
608
 
609
      if Index = 0 then
610
         if Default_Data_Defined then
611
            Current_Data := Default_Data;
612
            Default := True;
613
 
614
         else
615
            --  If no default, then nothing to do
616
 
617
            return;
618
         end if;
619
      end if;
620
 
621
      --  Set the preprocessing flags according to the preprocessing data
622
 
623
      if Current_Data.Comments and then not Current_Data.Always_Blank then
624
         Comment_Deleted_Lines := True;
625
         Blank_Deleted_Lines   := False;
626
 
627
      else
628
         Comment_Deleted_Lines := False;
629
         Blank_Deleted_Lines   := True;
630
      end if;
631
 
632
      Undefined_Symbols_Are_False := Current_Data.Undef_False;
633
      List_Preprocessing_Symbols  := Current_Data.List_Symbols;
634
 
635
      --  If not already done it, process the definition file
636
 
637
      if Current_Data.Processed then
638
 
639
         --  Set Prep.Mapping
640
 
641
         Prep.Mapping := Current_Data.Mapping;
642
 
643
      else
644
         --  First put the mapping in Prep.Mapping, because Prep.Parse_Def_File
645
         --  works on Prep.Mapping.
646
 
647
         Prep.Mapping := Current_Data.Mapping;
648
 
649
         String_To_Name_Buffer (Current_Data.Deffile);
650
 
651
         declare
652
            N           : constant File_Name_Type    := Name_Find;
653
            Deffile     : constant Source_File_Index :=
654
                            Load_Definition_File (N);
655
            Add_Deffile : Boolean                    := True;
656
            T           : constant Nat               := Total_Errors_Detected;
657
 
658
         begin
659
            if Deffile = No_Source_File then
660
               Fail ("definition file """
661
                     & Get_Name_String (N)
662
                     & """ not found");
663
            end if;
664
 
665
            --  Initialize the preprocessor and set the characteristics of the
666
            --  scanner for a definition file.
667
 
668
            Prep.Setup_Hooks
669
              (Error_Msg         => Errout.Error_Msg'Access,
670
               Scan              => Scn.Scanner.Scan'Access,
671
               Set_Ignore_Errors => Errout.Set_Ignore_Errors'Access,
672
               Put_Char          => null,
673
               New_EOL           => null);
674
 
675
            Scn.Scanner.Set_End_Of_Line_As_Token (True);
676
            Scn.Scanner.Reset_Special_Characters;
677
 
678
            --  Initialize the scanner and process the definition file
679
 
680
            Scn.Scanner.Initialize_Scanner (Deffile);
681
            Prep.Parse_Def_File;
682
 
683
            --  Reset the behaviour of the scanner to the default
684
 
685
            Scn.Scanner.Set_End_Of_Line_As_Token (False);
686
 
687
            --  Fail if errors were found while processing the definition file
688
 
689
            if T /= Total_Errors_Detected then
690
               Errout.Finalize (Last_Call => True);
691
               Errout.Output_Messages;
692
               Fail ("errors found in definition file """
693
                     & Get_Name_String (N)
694
                     & """");
695
            end if;
696
 
697
            for Index in 1 .. Dependencies.Last loop
698
               if Dependencies.Table (Index) = Deffile then
699
                  Add_Deffile := False;
700
                  exit;
701
               end if;
702
            end loop;
703
 
704
            if Add_Deffile then
705
               Dependencies.Increment_Last;
706
               Dependencies.Table (Dependencies.Last) := Deffile;
707
            end if;
708
         end;
709
 
710
         --  Get back the mapping, indicate that the definition file is
711
         --  processed and store back the preprocessing data.
712
 
713
         Current_Data.Mapping := Prep.Mapping;
714
         Current_Data.Processed := True;
715
 
716
         if Default then
717
            Default_Data := Current_Data;
718
 
719
         else
720
            Preproc_Data_Table.Table (Index) := Current_Data;
721
         end if;
722
      end if;
723
 
724
      Preprocessing_Needed := True;
725
   end Prepare_To_Preprocess;
726
 
727
   ---------------------------------------------
728
   -- Process_Command_Line_Symbol_Definitions --
729
   ---------------------------------------------
730
 
731
   procedure Process_Command_Line_Symbol_Definitions is
732
      Symbol_Data : Prep.Symbol_Data;
733
      Found : Boolean := False;
734
 
735
   begin
736
      Symbol_Table.Init (Command_Line_Symbols);
737
 
738
      --  The command line definitions have been stored temporarily in
739
      --  array Symbol_Definitions.
740
 
741
      for Index in 1 .. Last_Definition loop
742
         --  Check each symbol definition, fail immediately if syntax is not
743
         --  correct.
744
 
745
         Check_Command_Line_Symbol_Definition
746
           (Definition => Symbol_Definitions (Index).all,
747
            Data       => Symbol_Data);
748
         Found := False;
749
 
750
         --  If there is already a definition for this symbol, replace the old
751
         --  definition by this one.
752
 
753
         for J in 1 .. Symbol_Table.Last (Command_Line_Symbols) loop
754
            if Command_Line_Symbols.Table (J).Symbol = Symbol_Data.Symbol then
755
               Command_Line_Symbols.Table (J) := Symbol_Data;
756
               Found := True;
757
               exit;
758
            end if;
759
         end loop;
760
 
761
         --  Otherwise, create a new entry in the table
762
 
763
         if not Found then
764
            Symbol_Table.Increment_Last (Command_Line_Symbols);
765
            Command_Line_Symbols.Table
766
              (Symbol_Table.Last (Command_Line_Symbols)) := Symbol_Data;
767
         end if;
768
      end loop;
769
   end Process_Command_Line_Symbol_Definitions;
770
 
771
   -------------------------
772
   -- Skip_To_End_Of_Line --
773
   -------------------------
774
 
775
   procedure Skip_To_End_Of_Line is
776
   begin
777
      Set_Ignore_Errors (To => True);
778
 
779
      while Token /= Tok_End_Of_Line and then Token /= Tok_EOF loop
780
         Scan;
781
      end loop;
782
 
783
      Set_Ignore_Errors (To => False);
784
   end Skip_To_End_Of_Line;
785
 
786
end Prepcomp;

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.