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

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-dev/] [or1k-gcc/] [gcc/] [ada/] [alfa_test.adb] - Blame information for rev 716

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 706 jeremybenn
------------------------------------------------------------------------------
2
--                                                                          --
3
--                          GNAT SYSTEM UTILITIES                           --
4
--                                                                          --
5
--                            A L F A _ T E S T                             --
6
--                                                                          --
7
--                                 B o d y                                  --
8
--                                                                          --
9
--            Copyright (C) 2011, 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
--  This utility program is used to test proper operation of the Get_Alfa and
27
--  Put_Alfa units. To run it, compile any source file with switch -gnatd.E or
28
--  -gnatd.F to get an ALI file file.ALI containing Alfa information. Then run
29
--  this utility using:
30
 
31
--     Alfa_Test file.ali
32
 
33
--  This test will read the Alfa information from the ALI file, and use
34
--  Get_Alfa to store this in binary form in the internal tables in Alfa. Then
35
--  Put_Alfa is used to write the information from these tables back into text
36
--  form. This output is compared with the original Alfa information in the ALI
37
--  file and the two should be identical. If not an error message is output.
38
 
39
with Get_Alfa;
40
with Put_Alfa;
41
 
42
with Alfa;  use Alfa;
43
with Types; use Types;
44
 
45
with Ada.Command_Line;      use Ada.Command_Line;
46
with Ada.Streams;           use Ada.Streams;
47
with Ada.Streams.Stream_IO; use Ada.Streams.Stream_IO;
48
with Ada.Text_IO;
49
 
50
with GNAT.OS_Lib; use GNAT.OS_Lib;
51
 
52
procedure Alfa_Test is
53
   Infile    : File_Type;
54
   Name1     : String_Access;
55
   Outfile_1 : File_Type;
56
   Name2     : String_Access;
57
   Outfile_2 : File_Type;
58
   C         : Character;
59
 
60
   Stop : exception;
61
   --  Terminate execution
62
 
63
   Diff_Exec   : constant String_Access := Locate_Exec_On_Path ("diff");
64
   Diff_Result : Integer;
65
 
66
   use ASCII;
67
 
68
begin
69
   if Argument_Count /= 1 then
70
      Ada.Text_IO.Put_Line ("Usage: alfa_test FILE.ali");
71
      raise Stop;
72
   end if;
73
 
74
   Name1 := new String'(Argument (1) & ".1");
75
   Name2 := new String'(Argument (1) & ".2");
76
 
77
   Open   (Infile,    In_File,  Argument (1));
78
   Create (Outfile_1, Out_File, Name1.all);
79
   Create (Outfile_2, Out_File, Name2.all);
80
 
81
   --  Read input file till we get to first 'F' line
82
 
83
   Process : declare
84
      Output_Col : Positive := 1;
85
 
86
      function Get_Char (F : File_Type) return Character;
87
      --  Read one character from specified  file
88
 
89
      procedure Put_Char (F : File_Type; C : Character);
90
      --  Write one character to specified file
91
 
92
      function Get_Output_Col return Positive;
93
      --  Return current column in output file, where each line starts at
94
      --  column 1 and terminate with LF, and HT is at columns 1, 9, etc.
95
      --  All output is supposed to be carried through Put_Char.
96
 
97
      --------------
98
      -- Get_Char --
99
      --------------
100
 
101
      function Get_Char (F : File_Type) return Character is
102
         Item : Stream_Element_Array (1 .. 1);
103
         Last : Stream_Element_Offset;
104
 
105
      begin
106
         Read (F, Item, Last);
107
 
108
         if Last /= 1 then
109
            return Types.EOF;
110
         else
111
            return Character'Val (Item (1));
112
         end if;
113
      end Get_Char;
114
 
115
      --------------------
116
      -- Get_Output_Col --
117
      --------------------
118
 
119
      function Get_Output_Col return Positive is
120
      begin
121
         return Output_Col;
122
      end Get_Output_Col;
123
 
124
      --------------
125
      -- Put_Char --
126
      --------------
127
 
128
      procedure Put_Char (F : File_Type; C : Character) is
129
         Item : Stream_Element_Array (1 .. 1);
130
 
131
      begin
132
         if C /= CR and then C /= EOF then
133
            if C = LF then
134
               Output_Col := 1;
135
            elsif C = HT then
136
               Output_Col := ((Output_Col + 6) / 8) * 8 + 1;
137
            else
138
               Output_Col := Output_Col + 1;
139
            end if;
140
 
141
            Item (1) := Character'Pos (C);
142
            Write (F, Item);
143
         end if;
144
      end Put_Char;
145
 
146
      --  Subprograms used by Get_Alfa (these also copy the output to Outfile_1
147
      --  for later comparison with the output generated by Put_Alfa).
148
 
149
      function  Getc  return Character;
150
      function  Nextc return Character;
151
      procedure Skipc;
152
 
153
      ----------
154
      -- Getc --
155
      ----------
156
 
157
      function Getc  return Character is
158
         C : Character;
159
      begin
160
         C := Get_Char (Infile);
161
         Put_Char (Outfile_1, C);
162
         return C;
163
      end Getc;
164
 
165
      -----------
166
      -- Nextc --
167
      -----------
168
 
169
      function Nextc return Character is
170
         C : Character;
171
 
172
      begin
173
         C := Get_Char (Infile);
174
 
175
         if C /= EOF then
176
            Set_Index (Infile, Index (Infile) - 1);
177
         end if;
178
 
179
         return C;
180
      end Nextc;
181
 
182
      -----------
183
      -- Skipc --
184
      -----------
185
 
186
      procedure Skipc is
187
         C : Character;
188
         pragma Unreferenced (C);
189
      begin
190
         C := Getc;
191
      end Skipc;
192
 
193
      --  Subprograms used by Put_Alfa, which write information to Outfile_2
194
 
195
      function Write_Info_Col return Positive;
196
      procedure Write_Info_Char (C : Character);
197
      procedure Write_Info_Initiate (Key : Character);
198
      procedure Write_Info_Nat (N : Nat);
199
      procedure Write_Info_Terminate;
200
 
201
      --------------------
202
      -- Write_Info_Col --
203
      --------------------
204
 
205
      function Write_Info_Col return Positive is
206
      begin
207
         return Get_Output_Col;
208
      end Write_Info_Col;
209
 
210
      ---------------------
211
      -- Write_Info_Char --
212
      ---------------------
213
 
214
      procedure Write_Info_Char (C : Character) is
215
      begin
216
         Put_Char (Outfile_2, C);
217
      end Write_Info_Char;
218
 
219
      -------------------------
220
      -- Write_Info_Initiate --
221
      -------------------------
222
 
223
      procedure Write_Info_Initiate (Key : Character) is
224
      begin
225
         Write_Info_Char (Key);
226
      end Write_Info_Initiate;
227
 
228
      --------------------
229
      -- Write_Info_Nat --
230
      --------------------
231
 
232
      procedure Write_Info_Nat (N : Nat) is
233
      begin
234
         if N > 9 then
235
            Write_Info_Nat (N / 10);
236
         end if;
237
 
238
         Write_Info_Char (Character'Val (48 + N mod 10));
239
      end Write_Info_Nat;
240
 
241
      --------------------------
242
      -- Write_Info_Terminate --
243
      --------------------------
244
 
245
      procedure Write_Info_Terminate is
246
      begin
247
         Write_Info_Char (LF);
248
      end Write_Info_Terminate;
249
 
250
      --  Local instantiations of Put_Alfa and Get_Alfa
251
 
252
      procedure Get_Alfa_Info is new Get_Alfa;
253
      procedure Put_Alfa_Info is new Put_Alfa;
254
 
255
   --  Start of processing for Process
256
 
257
   begin
258
      --  Loop to skip till first 'F' line
259
 
260
      loop
261
         C := Get_Char (Infile);
262
 
263
         if C = EOF then
264
            raise Stop;
265
 
266
         elsif C = LF or else C = CR then
267
            loop
268
               C := Get_Char (Infile);
269
               exit when C /= LF and then C /= CR;
270
            end loop;
271
 
272
            exit when C = 'F';
273
         end if;
274
      end loop;
275
 
276
      --  Position back to initial 'F' of first 'F' line
277
 
278
      Set_Index (Infile, Index (Infile) - 1);
279
 
280
      --  Read Alfa information to internal Alfa tables, also copying Alfa info
281
      --  to Outfile_1.
282
 
283
      Initialize_Alfa_Tables;
284
      Get_Alfa_Info;
285
 
286
      --  Write Alfa information from internal Alfa tables to Outfile_2
287
 
288
      Put_Alfa_Info;
289
 
290
      --  Junk blank line (see comment at end of Lib.Writ)
291
 
292
      Write_Info_Terminate;
293
 
294
      --  Flush to disk
295
 
296
      Close (Outfile_1);
297
      Close (Outfile_2);
298
 
299
      --  Now Outfile_1 and Outfile_2 should be identical
300
 
301
      Diff_Result :=
302
        Spawn (Diff_Exec.all,
303
               Argument_String_To_List
304
                 ("-u " & Name1.all & " " & Name2.all).all);
305
 
306
      if Diff_Result /= 0 then
307
         Ada.Text_IO.Put_Line ("diff(1) exit status" & Diff_Result'Img);
308
      end if;
309
 
310
      OS_Exit (Diff_Result);
311
 
312
   end Process;
313
 
314
exception
315
   when Stop =>
316
      null;
317
end Alfa_Test;

powered by: WebSVN 2.1.0

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