annotate gcc/ada/xsnamest.adb @ 111:04ced10e8804

gcc 7
author kono
date Fri, 27 Oct 2017 22:46:09 +0900
parents
children 84e7813d76e9
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 ------------------------------------------------------------------------------
kono
parents:
diff changeset
2 -- --
kono
parents:
diff changeset
3 -- GNAT SYSTEM UTILITIES --
kono
parents:
diff changeset
4 -- --
kono
parents:
diff changeset
5 -- X S N A M E S T --
kono
parents:
diff changeset
6 -- --
kono
parents:
diff changeset
7 -- B o d y --
kono
parents:
diff changeset
8 -- --
kono
parents:
diff changeset
9 -- Copyright (C) 1992-2014, Free Software Foundation, Inc. --
kono
parents:
diff changeset
10 -- --
kono
parents:
diff changeset
11 -- GNAT is free software; you can redistribute it and/or modify it under --
kono
parents:
diff changeset
12 -- terms of the GNU General Public License as published by the Free Soft- --
kono
parents:
diff changeset
13 -- ware Foundation; either version 3, or (at your option) any later ver- --
kono
parents:
diff changeset
14 -- sion. GNAT is distributed in the hope that it will be useful, but WITH- --
kono
parents:
diff changeset
15 -- OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY --
kono
parents:
diff changeset
16 -- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License --
kono
parents:
diff changeset
17 -- for more details. You should have received a copy of the GNU General --
kono
parents:
diff changeset
18 -- Public License distributed with GNAT; see file COPYING3. If not, go to --
kono
parents:
diff changeset
19 -- http://www.gnu.org/licenses for a complete copy of the license. --
kono
parents:
diff changeset
20 -- --
kono
parents:
diff changeset
21 -- GNAT was originally developed by the GNAT team at New York University. --
kono
parents:
diff changeset
22 -- Extensive contributions were provided by Ada Core Technologies Inc. --
kono
parents:
diff changeset
23 -- --
kono
parents:
diff changeset
24 ------------------------------------------------------------------------------
kono
parents:
diff changeset
25
kono
parents:
diff changeset
26 -- This utility is used to make a new version of the Snames package when new
kono
parents:
diff changeset
27 -- names are added. This version reads a template file from snames.ads-tmpl in
kono
parents:
diff changeset
28 -- which the numbers are all written as $, and generates a new version of the
kono
parents:
diff changeset
29 -- spec file snames.ads (written to snames.ns). It also reads snames.adb-tmpl
kono
parents:
diff changeset
30 -- and generates an updated body (written to snames.nb), and snames.h-tmpl and
kono
parents:
diff changeset
31 -- generates an updated C header file (written to snames.nh).
kono
parents:
diff changeset
32
kono
parents:
diff changeset
33 with Ada.Strings.Unbounded; use Ada.Strings.Unbounded;
kono
parents:
diff changeset
34 with Ada.Strings.Unbounded.Text_IO; use Ada.Strings.Unbounded.Text_IO;
kono
parents:
diff changeset
35 with Ada.Strings.Maps; use Ada.Strings.Maps;
kono
parents:
diff changeset
36 with Ada.Strings.Maps.Constants; use Ada.Strings.Maps.Constants;
kono
parents:
diff changeset
37 with Ada.Text_IO; use Ada.Text_IO;
kono
parents:
diff changeset
38 with Ada.Streams.Stream_IO; use Ada.Streams.Stream_IO;
kono
parents:
diff changeset
39
kono
parents:
diff changeset
40 with GNAT.Spitbol; use GNAT.Spitbol;
kono
parents:
diff changeset
41 with GNAT.Spitbol.Patterns; use GNAT.Spitbol.Patterns;
kono
parents:
diff changeset
42
kono
parents:
diff changeset
43 with XUtil; use XUtil;
kono
parents:
diff changeset
44
kono
parents:
diff changeset
45 procedure XSnamesT is
kono
parents:
diff changeset
46
kono
parents:
diff changeset
47 subtype VString is GNAT.Spitbol.VString;
kono
parents:
diff changeset
48
kono
parents:
diff changeset
49 InS : Ada.Text_IO.File_Type;
kono
parents:
diff changeset
50 InB : Ada.Text_IO.File_Type;
kono
parents:
diff changeset
51 InH : Ada.Text_IO.File_Type;
kono
parents:
diff changeset
52
kono
parents:
diff changeset
53 OutS : Ada.Streams.Stream_IO.File_Type;
kono
parents:
diff changeset
54 OutB : Ada.Streams.Stream_IO.File_Type;
kono
parents:
diff changeset
55 OutH : Ada.Streams.Stream_IO.File_Type;
kono
parents:
diff changeset
56
kono
parents:
diff changeset
57 A, B : VString := Nul;
kono
parents:
diff changeset
58 Line : VString := Nul;
kono
parents:
diff changeset
59 Name0 : VString := Nul;
kono
parents:
diff changeset
60 Name1 : VString := Nul;
kono
parents:
diff changeset
61 Oval : VString := Nul;
kono
parents:
diff changeset
62 Restl : VString := Nul;
kono
parents:
diff changeset
63
kono
parents:
diff changeset
64 Name_Ref : constant Pattern := Span (' ') * A & Break (' ') * Name0
kono
parents:
diff changeset
65 & Span (' ') * B
kono
parents:
diff changeset
66 & ": constant Name_Id := N + $;"
kono
parents:
diff changeset
67 & Rest * Restl;
kono
parents:
diff changeset
68
kono
parents:
diff changeset
69 Get_Name : constant Pattern := "Name_" & Rest * Name1;
kono
parents:
diff changeset
70 Chk_Low : constant Pattern := Pos (0) & Any (Lower_Set) & Rest & Pos (1);
kono
parents:
diff changeset
71 Findu : constant Pattern := Span ('u') * A;
kono
parents:
diff changeset
72
kono
parents:
diff changeset
73 Val : Natural;
kono
parents:
diff changeset
74
kono
parents:
diff changeset
75 Xlate_U_Und : constant Character_Mapping := To_Mapping ("u", "_");
kono
parents:
diff changeset
76
kono
parents:
diff changeset
77 M : Match_Result;
kono
parents:
diff changeset
78
kono
parents:
diff changeset
79 type Header_Symbol is (None, Name, Attr, Conv, Prag);
kono
parents:
diff changeset
80 -- A symbol in the header file
kono
parents:
diff changeset
81
kono
parents:
diff changeset
82 procedure Output_Header_Line (S : Header_Symbol);
kono
parents:
diff changeset
83 -- Output header line
kono
parents:
diff changeset
84
kono
parents:
diff changeset
85 Header_Name : aliased String := "Name";
kono
parents:
diff changeset
86 Header_Attr : aliased String := "Attr";
kono
parents:
diff changeset
87 Header_Conv : aliased String := "Convention";
kono
parents:
diff changeset
88 Header_Prag : aliased String := "Pragma";
kono
parents:
diff changeset
89 -- Prefixes used in the header file
kono
parents:
diff changeset
90
kono
parents:
diff changeset
91 type String_Ptr is access all String;
kono
parents:
diff changeset
92 Header_Prefix : constant array (Header_Symbol) of String_Ptr :=
kono
parents:
diff changeset
93 (null,
kono
parents:
diff changeset
94 Header_Name'Access,
kono
parents:
diff changeset
95 Header_Attr'Access,
kono
parents:
diff changeset
96 Header_Conv'Access,
kono
parents:
diff changeset
97 Header_Prag'Access);
kono
parents:
diff changeset
98
kono
parents:
diff changeset
99 -- Patterns used in the spec file
kono
parents:
diff changeset
100
kono
parents:
diff changeset
101 Get_Attr : constant Pattern := Span (' ') & "Attribute_"
kono
parents:
diff changeset
102 & Break (",)") * Name1;
kono
parents:
diff changeset
103 Get_Conv : constant Pattern := Span (' ') & "Convention_"
kono
parents:
diff changeset
104 & Break (",)") * Name1;
kono
parents:
diff changeset
105 Get_Prag : constant Pattern := Span (' ') & "Pragma_"
kono
parents:
diff changeset
106 & Break (",)") * Name1;
kono
parents:
diff changeset
107
kono
parents:
diff changeset
108 type Header_Symbol_Counter is array (Header_Symbol) of Natural;
kono
parents:
diff changeset
109 Header_Counter : Header_Symbol_Counter := (0, 0, 0, 0, 0);
kono
parents:
diff changeset
110
kono
parents:
diff changeset
111 Header_Current_Symbol : Header_Symbol := None;
kono
parents:
diff changeset
112 Header_Pending_Line : VString := Nul;
kono
parents:
diff changeset
113
kono
parents:
diff changeset
114 ------------------------
kono
parents:
diff changeset
115 -- Output_Header_Line --
kono
parents:
diff changeset
116 ------------------------
kono
parents:
diff changeset
117
kono
parents:
diff changeset
118 procedure Output_Header_Line (S : Header_Symbol) is
kono
parents:
diff changeset
119 function Make_Value (V : Integer) return String;
kono
parents:
diff changeset
120 -- Build the definition for the current macro (Names are integers
kono
parents:
diff changeset
121 -- offset to N, while other items are enumeration values).
kono
parents:
diff changeset
122
kono
parents:
diff changeset
123 ----------------
kono
parents:
diff changeset
124 -- Make_Value --
kono
parents:
diff changeset
125 ----------------
kono
parents:
diff changeset
126
kono
parents:
diff changeset
127 function Make_Value (V : Integer) return String is
kono
parents:
diff changeset
128 begin
kono
parents:
diff changeset
129 if S = Name then
kono
parents:
diff changeset
130 return "(First_Name_Id + 256 + " & V & ")";
kono
parents:
diff changeset
131 else
kono
parents:
diff changeset
132 return "" & V;
kono
parents:
diff changeset
133 end if;
kono
parents:
diff changeset
134 end Make_Value;
kono
parents:
diff changeset
135
kono
parents:
diff changeset
136 -- Start of processing for Output_Header_Line
kono
parents:
diff changeset
137
kono
parents:
diff changeset
138 begin
kono
parents:
diff changeset
139 -- Skip all the #define for S-prefixed symbols in the header.
kono
parents:
diff changeset
140 -- Of course we are making implicit assumptions:
kono
parents:
diff changeset
141 -- (1) No newline between symbols with the same prefix.
kono
parents:
diff changeset
142 -- (2) Prefix order is the same as in snames.ads.
kono
parents:
diff changeset
143
kono
parents:
diff changeset
144 if Header_Current_Symbol /= S then
kono
parents:
diff changeset
145 declare
kono
parents:
diff changeset
146 Name2 : VString;
kono
parents:
diff changeset
147 Pat : constant Pattern := "#define "
kono
parents:
diff changeset
148 & Header_Prefix (S).all
kono
parents:
diff changeset
149 & Break (' ') * Name2;
kono
parents:
diff changeset
150 In_Pat : Boolean := False;
kono
parents:
diff changeset
151
kono
parents:
diff changeset
152 begin
kono
parents:
diff changeset
153 if Header_Current_Symbol /= None then
kono
parents:
diff changeset
154 Put_Line (OutH, Header_Pending_Line);
kono
parents:
diff changeset
155 end if;
kono
parents:
diff changeset
156
kono
parents:
diff changeset
157 loop
kono
parents:
diff changeset
158 Line := Get_Line (InH);
kono
parents:
diff changeset
159
kono
parents:
diff changeset
160 if Match (Line, Pat) then
kono
parents:
diff changeset
161 In_Pat := True;
kono
parents:
diff changeset
162 elsif In_Pat then
kono
parents:
diff changeset
163 Header_Pending_Line := Line;
kono
parents:
diff changeset
164 exit;
kono
parents:
diff changeset
165 else
kono
parents:
diff changeset
166 Put_Line (OutH, Line);
kono
parents:
diff changeset
167 end if;
kono
parents:
diff changeset
168 end loop;
kono
parents:
diff changeset
169
kono
parents:
diff changeset
170 Header_Current_Symbol := S;
kono
parents:
diff changeset
171 end;
kono
parents:
diff changeset
172 end if;
kono
parents:
diff changeset
173
kono
parents:
diff changeset
174 -- Now output the line
kono
parents:
diff changeset
175
kono
parents:
diff changeset
176 -- Note that we must ensure at least one space between macro name and
kono
parents:
diff changeset
177 -- parens, otherwise the parenthesized value gets treated as an argument
kono
parents:
diff changeset
178 -- specification.
kono
parents:
diff changeset
179
kono
parents:
diff changeset
180 Put_Line (OutH, "#define " & Header_Prefix (S).all
kono
parents:
diff changeset
181 & "_" & Name1
kono
parents:
diff changeset
182 & (30 - Natural'Min (29, Length (Name1))) * ' '
kono
parents:
diff changeset
183 & Make_Value (Header_Counter (S)));
kono
parents:
diff changeset
184 Header_Counter (S) := Header_Counter (S) + 1;
kono
parents:
diff changeset
185 end Output_Header_Line;
kono
parents:
diff changeset
186
kono
parents:
diff changeset
187 -- Start of processing for XSnames
kono
parents:
diff changeset
188
kono
parents:
diff changeset
189 begin
kono
parents:
diff changeset
190 Open (InS, In_File, "snames.ads-tmpl");
kono
parents:
diff changeset
191 Open (InB, In_File, "snames.adb-tmpl");
kono
parents:
diff changeset
192 Open (InH, In_File, "snames.h-tmpl");
kono
parents:
diff changeset
193
kono
parents:
diff changeset
194 -- Note that we do not generate snames.{ads,adb,h} directly. Instead
kono
parents:
diff changeset
195 -- we output them to snames.n{s,b,h} so that Makefiles can use
kono
parents:
diff changeset
196 -- move-if-change to not touch previously generated files if the
kono
parents:
diff changeset
197 -- new ones are identical.
kono
parents:
diff changeset
198
kono
parents:
diff changeset
199 Create (OutS, Out_File, "snames.ns");
kono
parents:
diff changeset
200 Create (OutB, Out_File, "snames.nb");
kono
parents:
diff changeset
201 Create (OutH, Out_File, "snames.nh");
kono
parents:
diff changeset
202
kono
parents:
diff changeset
203 Put_Line (OutH, "#ifdef __cplusplus");
kono
parents:
diff changeset
204 Put_Line (OutH, "extern ""C"" {");
kono
parents:
diff changeset
205 Put_Line (OutH, "#endif");
kono
parents:
diff changeset
206
kono
parents:
diff changeset
207 Anchored_Mode := True;
kono
parents:
diff changeset
208 Val := 0;
kono
parents:
diff changeset
209
kono
parents:
diff changeset
210 loop
kono
parents:
diff changeset
211 Line := Get_Line (InB);
kono
parents:
diff changeset
212 exit when Match (Line, " Preset_Names");
kono
parents:
diff changeset
213 Put_Line (OutB, Line);
kono
parents:
diff changeset
214 end loop;
kono
parents:
diff changeset
215
kono
parents:
diff changeset
216 Put_Line (OutB, Line);
kono
parents:
diff changeset
217
kono
parents:
diff changeset
218 LoopN : while not End_Of_File (InS) loop
kono
parents:
diff changeset
219 Line := Get_Line (InS);
kono
parents:
diff changeset
220
kono
parents:
diff changeset
221 if not Match (Line, Name_Ref) then
kono
parents:
diff changeset
222 Put_Line (OutS, Line);
kono
parents:
diff changeset
223
kono
parents:
diff changeset
224 if Match (Line, Get_Attr) then
kono
parents:
diff changeset
225 Output_Header_Line (Attr);
kono
parents:
diff changeset
226 elsif Match (Line, Get_Conv) then
kono
parents:
diff changeset
227 Output_Header_Line (Conv);
kono
parents:
diff changeset
228 elsif Match (Line, Get_Prag) then
kono
parents:
diff changeset
229 Output_Header_Line (Prag);
kono
parents:
diff changeset
230 end if;
kono
parents:
diff changeset
231 else
kono
parents:
diff changeset
232
kono
parents:
diff changeset
233 if Match (Name0, "Last_") then
kono
parents:
diff changeset
234 Oval := Lpad (V (Val - 1), 3, '0');
kono
parents:
diff changeset
235 else
kono
parents:
diff changeset
236 Oval := Lpad (V (Val), 3, '0');
kono
parents:
diff changeset
237 end if;
kono
parents:
diff changeset
238
kono
parents:
diff changeset
239 Put_Line
kono
parents:
diff changeset
240 (OutS, A & Name0 & B & ": constant Name_Id := N + "
kono
parents:
diff changeset
241 & Oval & ';' & Restl);
kono
parents:
diff changeset
242
kono
parents:
diff changeset
243 if Match (Name0, Get_Name) then
kono
parents:
diff changeset
244 Name0 := Name1;
kono
parents:
diff changeset
245 Val := Val + 1;
kono
parents:
diff changeset
246
kono
parents:
diff changeset
247 if Match (Name0, Findu, M) then
kono
parents:
diff changeset
248 Replace (M, Translate (A, Xlate_U_Und));
kono
parents:
diff changeset
249 Translate (Name0, Lower_Case_Map);
kono
parents:
diff changeset
250
kono
parents:
diff changeset
251 elsif not Match (Name0, "Op_", "") then
kono
parents:
diff changeset
252 Translate (Name0, Lower_Case_Map);
kono
parents:
diff changeset
253
kono
parents:
diff changeset
254 else
kono
parents:
diff changeset
255 Name0 := 'O' & Translate (Name0, Lower_Case_Map);
kono
parents:
diff changeset
256 end if;
kono
parents:
diff changeset
257
kono
parents:
diff changeset
258 if not Match (Name0, Chk_Low) then
kono
parents:
diff changeset
259 Put_Line (OutB, " """ & Name0 & "#"" &");
kono
parents:
diff changeset
260 end if;
kono
parents:
diff changeset
261
kono
parents:
diff changeset
262 Output_Header_Line (Name);
kono
parents:
diff changeset
263 end if;
kono
parents:
diff changeset
264 end if;
kono
parents:
diff changeset
265 end loop LoopN;
kono
parents:
diff changeset
266
kono
parents:
diff changeset
267 loop
kono
parents:
diff changeset
268 Line := Get_Line (InB);
kono
parents:
diff changeset
269 exit when Match (Line, " ""#"";");
kono
parents:
diff changeset
270 end loop;
kono
parents:
diff changeset
271
kono
parents:
diff changeset
272 Put_Line (OutB, Line);
kono
parents:
diff changeset
273
kono
parents:
diff changeset
274 while not End_Of_File (InB) loop
kono
parents:
diff changeset
275 Line := Get_Line (InB);
kono
parents:
diff changeset
276 Put_Line (OutB, Line);
kono
parents:
diff changeset
277 end loop;
kono
parents:
diff changeset
278
kono
parents:
diff changeset
279 Put_Line (OutH, Header_Pending_Line);
kono
parents:
diff changeset
280 while not End_Of_File (InH) loop
kono
parents:
diff changeset
281 Line := Get_Line (InH);
kono
parents:
diff changeset
282 Put_Line (OutH, Line);
kono
parents:
diff changeset
283 end loop;
kono
parents:
diff changeset
284
kono
parents:
diff changeset
285 Put_Line (OutH, "#ifdef __cplusplus");
kono
parents:
diff changeset
286 Put_Line (OutH, "}");
kono
parents:
diff changeset
287 Put_Line (OutH, "#endif");
kono
parents:
diff changeset
288 end XSnamesT;