annotate gcc/ada/stringt.adb @ 131:84e7813d76e9

gcc-8.2
author mir3636
date Thu, 25 Oct 2018 07:37:49 +0900
parents 04ced10e8804
children 1830386684a0
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 COMPILER COMPONENTS --
kono
parents:
diff changeset
4 -- --
kono
parents:
diff changeset
5 -- S T R I N G T --
kono
parents:
diff changeset
6 -- --
kono
parents:
diff changeset
7 -- B o d y --
kono
parents:
diff changeset
8 -- --
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
9 -- Copyright (C) 1992-2018, Free Software Foundation, Inc. --
111
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. --
kono
parents:
diff changeset
17 -- --
kono
parents:
diff changeset
18 -- As a special exception under Section 7 of GPL version 3, you are granted --
kono
parents:
diff changeset
19 -- additional permissions described in the GCC Runtime Library Exception, --
kono
parents:
diff changeset
20 -- version 3.1, as published by the Free Software Foundation. --
kono
parents:
diff changeset
21 -- --
kono
parents:
diff changeset
22 -- You should have received a copy of the GNU General Public License and --
kono
parents:
diff changeset
23 -- a copy of the GCC Runtime Library Exception along with this program; --
kono
parents:
diff changeset
24 -- see the files COPYING3 and COPYING.RUNTIME respectively. If not, see --
kono
parents:
diff changeset
25 -- <http://www.gnu.org/licenses/>. --
kono
parents:
diff changeset
26 -- --
kono
parents:
diff changeset
27 -- GNAT was originally developed by the GNAT team at New York University. --
kono
parents:
diff changeset
28 -- Extensive contributions were provided by Ada Core Technologies Inc. --
kono
parents:
diff changeset
29 -- --
kono
parents:
diff changeset
30 ------------------------------------------------------------------------------
kono
parents:
diff changeset
31
kono
parents:
diff changeset
32 with Alloc;
kono
parents:
diff changeset
33 with Output; use Output;
kono
parents:
diff changeset
34 with Table;
kono
parents:
diff changeset
35
kono
parents:
diff changeset
36 package body Stringt is
kono
parents:
diff changeset
37
kono
parents:
diff changeset
38 -- The following table stores the sequence of character codes for the
kono
parents:
diff changeset
39 -- stored string constants. The entries are referenced from the
kono
parents:
diff changeset
40 -- separate Strings table.
kono
parents:
diff changeset
41
kono
parents:
diff changeset
42 package String_Chars is new Table.Table (
kono
parents:
diff changeset
43 Table_Component_Type => Char_Code,
kono
parents:
diff changeset
44 Table_Index_Type => Int,
kono
parents:
diff changeset
45 Table_Low_Bound => 0,
kono
parents:
diff changeset
46 Table_Initial => Alloc.String_Chars_Initial,
kono
parents:
diff changeset
47 Table_Increment => Alloc.String_Chars_Increment,
kono
parents:
diff changeset
48 Table_Name => "String_Chars");
kono
parents:
diff changeset
49
kono
parents:
diff changeset
50 -- The String_Id values reference entries in the Strings table, which
kono
parents:
diff changeset
51 -- contains String_Entry records that record the length of each stored
kono
parents:
diff changeset
52 -- string and its starting location in the String_Chars table.
kono
parents:
diff changeset
53
kono
parents:
diff changeset
54 type String_Entry is record
kono
parents:
diff changeset
55 String_Index : Int;
kono
parents:
diff changeset
56 Length : Nat;
kono
parents:
diff changeset
57 end record;
kono
parents:
diff changeset
58
kono
parents:
diff changeset
59 package Strings is new Table.Table (
kono
parents:
diff changeset
60 Table_Component_Type => String_Entry,
kono
parents:
diff changeset
61 Table_Index_Type => String_Id'Base,
kono
parents:
diff changeset
62 Table_Low_Bound => First_String_Id,
kono
parents:
diff changeset
63 Table_Initial => Alloc.Strings_Initial,
kono
parents:
diff changeset
64 Table_Increment => Alloc.Strings_Increment,
kono
parents:
diff changeset
65 Table_Name => "Strings");
kono
parents:
diff changeset
66
kono
parents:
diff changeset
67 -- Note: it is possible that two entries in the Strings table can share
kono
parents:
diff changeset
68 -- string data in the String_Chars table, and in particular this happens
kono
parents:
diff changeset
69 -- when Start_String is called with a parameter that is the last string
kono
parents:
diff changeset
70 -- currently allocated in the table.
kono
parents:
diff changeset
71
kono
parents:
diff changeset
72 Strings_Last : String_Id := First_String_Id;
kono
parents:
diff changeset
73 String_Chars_Last : Int := 0;
kono
parents:
diff changeset
74 -- Strings_Last and String_Chars_Last are used by procedure Mark and
kono
parents:
diff changeset
75 -- Release to get a snapshot of the tables and to restore them to their
kono
parents:
diff changeset
76 -- previous situation.
kono
parents:
diff changeset
77
kono
parents:
diff changeset
78 ------------
kono
parents:
diff changeset
79 -- Append --
kono
parents:
diff changeset
80 ------------
kono
parents:
diff changeset
81
kono
parents:
diff changeset
82 procedure Append (Buf : in out Bounded_String; S : String_Id) is
kono
parents:
diff changeset
83 begin
kono
parents:
diff changeset
84 for X in 1 .. String_Length (S) loop
kono
parents:
diff changeset
85 Append (Buf, Get_Character (Get_String_Char (S, X)));
kono
parents:
diff changeset
86 end loop;
kono
parents:
diff changeset
87 end Append;
kono
parents:
diff changeset
88
kono
parents:
diff changeset
89 ----------------
kono
parents:
diff changeset
90 -- End_String --
kono
parents:
diff changeset
91 ----------------
kono
parents:
diff changeset
92
kono
parents:
diff changeset
93 function End_String return String_Id is
kono
parents:
diff changeset
94 begin
kono
parents:
diff changeset
95 return Strings.Last;
kono
parents:
diff changeset
96 end End_String;
kono
parents:
diff changeset
97
kono
parents:
diff changeset
98 ---------------------
kono
parents:
diff changeset
99 -- Get_String_Char --
kono
parents:
diff changeset
100 ---------------------
kono
parents:
diff changeset
101
kono
parents:
diff changeset
102 function Get_String_Char (Id : String_Id; Index : Int) return Char_Code is
kono
parents:
diff changeset
103 begin
kono
parents:
diff changeset
104 pragma Assert (Id in First_String_Id .. Strings.Last
kono
parents:
diff changeset
105 and then Index in 1 .. Strings.Table (Id).Length);
kono
parents:
diff changeset
106
kono
parents:
diff changeset
107 return String_Chars.Table (Strings.Table (Id).String_Index + Index - 1);
kono
parents:
diff changeset
108 end Get_String_Char;
kono
parents:
diff changeset
109
kono
parents:
diff changeset
110 ----------------
kono
parents:
diff changeset
111 -- Initialize --
kono
parents:
diff changeset
112 ----------------
kono
parents:
diff changeset
113
kono
parents:
diff changeset
114 procedure Initialize is
kono
parents:
diff changeset
115 begin
kono
parents:
diff changeset
116 String_Chars.Init;
kono
parents:
diff changeset
117 Strings.Init;
kono
parents:
diff changeset
118
kono
parents:
diff changeset
119 -- Set up the null string
kono
parents:
diff changeset
120
kono
parents:
diff changeset
121 Start_String;
kono
parents:
diff changeset
122 Null_String_Id := End_String;
kono
parents:
diff changeset
123 end Initialize;
kono
parents:
diff changeset
124
kono
parents:
diff changeset
125 ----------
kono
parents:
diff changeset
126 -- Lock --
kono
parents:
diff changeset
127 ----------
kono
parents:
diff changeset
128
kono
parents:
diff changeset
129 procedure Lock is
kono
parents:
diff changeset
130 begin
kono
parents:
diff changeset
131 String_Chars.Release;
kono
parents:
diff changeset
132 String_Chars.Locked := True;
kono
parents:
diff changeset
133 Strings.Release;
kono
parents:
diff changeset
134 Strings.Locked := True;
kono
parents:
diff changeset
135 end Lock;
kono
parents:
diff changeset
136
kono
parents:
diff changeset
137 ----------
kono
parents:
diff changeset
138 -- Mark --
kono
parents:
diff changeset
139 ----------
kono
parents:
diff changeset
140
kono
parents:
diff changeset
141 procedure Mark is
kono
parents:
diff changeset
142 begin
kono
parents:
diff changeset
143 Strings_Last := Strings.Last;
kono
parents:
diff changeset
144 String_Chars_Last := String_Chars.Last;
kono
parents:
diff changeset
145 end Mark;
kono
parents:
diff changeset
146
kono
parents:
diff changeset
147 -------------
kono
parents:
diff changeset
148 -- Release --
kono
parents:
diff changeset
149 -------------
kono
parents:
diff changeset
150
kono
parents:
diff changeset
151 procedure Release is
kono
parents:
diff changeset
152 begin
kono
parents:
diff changeset
153 Strings.Set_Last (Strings_Last);
kono
parents:
diff changeset
154 String_Chars.Set_Last (String_Chars_Last);
kono
parents:
diff changeset
155 end Release;
kono
parents:
diff changeset
156
kono
parents:
diff changeset
157 ------------------
kono
parents:
diff changeset
158 -- Start_String --
kono
parents:
diff changeset
159 ------------------
kono
parents:
diff changeset
160
kono
parents:
diff changeset
161 -- Version to start completely new string
kono
parents:
diff changeset
162
kono
parents:
diff changeset
163 procedure Start_String is
kono
parents:
diff changeset
164 begin
kono
parents:
diff changeset
165 Strings.Append ((String_Index => String_Chars.Last + 1, Length => 0));
kono
parents:
diff changeset
166 end Start_String;
kono
parents:
diff changeset
167
kono
parents:
diff changeset
168 -- Version to start from initially stored string
kono
parents:
diff changeset
169
kono
parents:
diff changeset
170 procedure Start_String (S : String_Id) is
kono
parents:
diff changeset
171 begin
kono
parents:
diff changeset
172 Strings.Increment_Last;
kono
parents:
diff changeset
173
kono
parents:
diff changeset
174 -- Case of initial string value is at the end of the string characters
kono
parents:
diff changeset
175 -- table, so it does not need copying, instead it can be shared.
kono
parents:
diff changeset
176
kono
parents:
diff changeset
177 if Strings.Table (S).String_Index + Strings.Table (S).Length =
kono
parents:
diff changeset
178 String_Chars.Last + 1
kono
parents:
diff changeset
179 then
kono
parents:
diff changeset
180 Strings.Table (Strings.Last).String_Index :=
kono
parents:
diff changeset
181 Strings.Table (S).String_Index;
kono
parents:
diff changeset
182
kono
parents:
diff changeset
183 -- Case of initial string value must be copied to new string
kono
parents:
diff changeset
184
kono
parents:
diff changeset
185 else
kono
parents:
diff changeset
186 Strings.Table (Strings.Last).String_Index :=
kono
parents:
diff changeset
187 String_Chars.Last + 1;
kono
parents:
diff changeset
188
kono
parents:
diff changeset
189 for J in 1 .. Strings.Table (S).Length loop
kono
parents:
diff changeset
190 String_Chars.Append
kono
parents:
diff changeset
191 (String_Chars.Table (Strings.Table (S).String_Index + (J - 1)));
kono
parents:
diff changeset
192 end loop;
kono
parents:
diff changeset
193 end if;
kono
parents:
diff changeset
194
kono
parents:
diff changeset
195 -- In either case the result string length is copied from the argument
kono
parents:
diff changeset
196
kono
parents:
diff changeset
197 Strings.Table (Strings.Last).Length := Strings.Table (S).Length;
kono
parents:
diff changeset
198 end Start_String;
kono
parents:
diff changeset
199
kono
parents:
diff changeset
200 -----------------------
kono
parents:
diff changeset
201 -- Store_String_Char --
kono
parents:
diff changeset
202 -----------------------
kono
parents:
diff changeset
203
kono
parents:
diff changeset
204 procedure Store_String_Char (C : Char_Code) is
kono
parents:
diff changeset
205 begin
kono
parents:
diff changeset
206 String_Chars.Append (C);
kono
parents:
diff changeset
207 Strings.Table (Strings.Last).Length :=
kono
parents:
diff changeset
208 Strings.Table (Strings.Last).Length + 1;
kono
parents:
diff changeset
209 end Store_String_Char;
kono
parents:
diff changeset
210
kono
parents:
diff changeset
211 procedure Store_String_Char (C : Character) is
kono
parents:
diff changeset
212 begin
kono
parents:
diff changeset
213 Store_String_Char (Get_Char_Code (C));
kono
parents:
diff changeset
214 end Store_String_Char;
kono
parents:
diff changeset
215
kono
parents:
diff changeset
216 ------------------------
kono
parents:
diff changeset
217 -- Store_String_Chars --
kono
parents:
diff changeset
218 ------------------------
kono
parents:
diff changeset
219
kono
parents:
diff changeset
220 procedure Store_String_Chars (S : String) is
kono
parents:
diff changeset
221 begin
kono
parents:
diff changeset
222 for J in S'First .. S'Last loop
kono
parents:
diff changeset
223 Store_String_Char (Get_Char_Code (S (J)));
kono
parents:
diff changeset
224 end loop;
kono
parents:
diff changeset
225 end Store_String_Chars;
kono
parents:
diff changeset
226
kono
parents:
diff changeset
227 procedure Store_String_Chars (S : String_Id) is
kono
parents:
diff changeset
228
kono
parents:
diff changeset
229 -- We are essentially doing this:
kono
parents:
diff changeset
230
kono
parents:
diff changeset
231 -- for J in 1 .. String_Length (S) loop
kono
parents:
diff changeset
232 -- Store_String_Char (Get_String_Char (S, J));
kono
parents:
diff changeset
233 -- end loop;
kono
parents:
diff changeset
234
kono
parents:
diff changeset
235 -- but when the string is long it's more efficient to grow the
kono
parents:
diff changeset
236 -- String_Chars table all at once.
kono
parents:
diff changeset
237
kono
parents:
diff changeset
238 S_First : constant Int := Strings.Table (S).String_Index;
kono
parents:
diff changeset
239 S_Len : constant Nat := String_Length (S);
kono
parents:
diff changeset
240 Old_Last : constant Int := String_Chars.Last;
kono
parents:
diff changeset
241 New_Last : constant Int := Old_Last + S_Len;
kono
parents:
diff changeset
242
kono
parents:
diff changeset
243 begin
kono
parents:
diff changeset
244 String_Chars.Set_Last (New_Last);
kono
parents:
diff changeset
245 String_Chars.Table (Old_Last + 1 .. New_Last) :=
kono
parents:
diff changeset
246 String_Chars.Table (S_First .. S_First + S_Len - 1);
kono
parents:
diff changeset
247 Strings.Table (Strings.Last).Length :=
kono
parents:
diff changeset
248 Strings.Table (Strings.Last).Length + S_Len;
kono
parents:
diff changeset
249 end Store_String_Chars;
kono
parents:
diff changeset
250
kono
parents:
diff changeset
251 ----------------------
kono
parents:
diff changeset
252 -- Store_String_Int --
kono
parents:
diff changeset
253 ----------------------
kono
parents:
diff changeset
254
kono
parents:
diff changeset
255 procedure Store_String_Int (N : Int) is
kono
parents:
diff changeset
256 begin
kono
parents:
diff changeset
257 if N < 0 then
kono
parents:
diff changeset
258 Store_String_Char ('-');
kono
parents:
diff changeset
259 Store_String_Int (-N);
kono
parents:
diff changeset
260
kono
parents:
diff changeset
261 else
kono
parents:
diff changeset
262 if N > 9 then
kono
parents:
diff changeset
263 Store_String_Int (N / 10);
kono
parents:
diff changeset
264 end if;
kono
parents:
diff changeset
265
kono
parents:
diff changeset
266 Store_String_Char (Character'Val (Character'Pos ('0') + N mod 10));
kono
parents:
diff changeset
267 end if;
kono
parents:
diff changeset
268 end Store_String_Int;
kono
parents:
diff changeset
269
kono
parents:
diff changeset
270 --------------------------
kono
parents:
diff changeset
271 -- String_Chars_Address --
kono
parents:
diff changeset
272 --------------------------
kono
parents:
diff changeset
273
kono
parents:
diff changeset
274 function String_Chars_Address return System.Address is
kono
parents:
diff changeset
275 begin
kono
parents:
diff changeset
276 return String_Chars.Table (0)'Address;
kono
parents:
diff changeset
277 end String_Chars_Address;
kono
parents:
diff changeset
278
kono
parents:
diff changeset
279 ------------------
kono
parents:
diff changeset
280 -- String_Equal --
kono
parents:
diff changeset
281 ------------------
kono
parents:
diff changeset
282
kono
parents:
diff changeset
283 function String_Equal (L, R : String_Id) return Boolean is
kono
parents:
diff changeset
284 Len : constant Nat := Strings.Table (L).Length;
kono
parents:
diff changeset
285
kono
parents:
diff changeset
286 begin
kono
parents:
diff changeset
287 if Len /= Strings.Table (R).Length then
kono
parents:
diff changeset
288 return False;
kono
parents:
diff changeset
289 else
kono
parents:
diff changeset
290 for J in 1 .. Len loop
kono
parents:
diff changeset
291 if Get_String_Char (L, J) /= Get_String_Char (R, J) then
kono
parents:
diff changeset
292 return False;
kono
parents:
diff changeset
293 end if;
kono
parents:
diff changeset
294 end loop;
kono
parents:
diff changeset
295
kono
parents:
diff changeset
296 return True;
kono
parents:
diff changeset
297 end if;
kono
parents:
diff changeset
298 end String_Equal;
kono
parents:
diff changeset
299
kono
parents:
diff changeset
300 -----------------------------
kono
parents:
diff changeset
301 -- String_From_Name_Buffer --
kono
parents:
diff changeset
302 -----------------------------
kono
parents:
diff changeset
303
kono
parents:
diff changeset
304 function String_From_Name_Buffer
kono
parents:
diff changeset
305 (Buf : Bounded_String := Global_Name_Buffer) return String_Id
kono
parents:
diff changeset
306 is
kono
parents:
diff changeset
307 begin
kono
parents:
diff changeset
308 Start_String;
kono
parents:
diff changeset
309 Store_String_Chars (+Buf);
kono
parents:
diff changeset
310 return End_String;
kono
parents:
diff changeset
311 end String_From_Name_Buffer;
kono
parents:
diff changeset
312
kono
parents:
diff changeset
313 -------------------
kono
parents:
diff changeset
314 -- String_Length --
kono
parents:
diff changeset
315 -------------------
kono
parents:
diff changeset
316
kono
parents:
diff changeset
317 function String_Length (Id : String_Id) return Nat is
kono
parents:
diff changeset
318 begin
kono
parents:
diff changeset
319 return Strings.Table (Id).Length;
kono
parents:
diff changeset
320 end String_Length;
kono
parents:
diff changeset
321
kono
parents:
diff changeset
322 --------------------
kono
parents:
diff changeset
323 -- String_To_Name --
kono
parents:
diff changeset
324 --------------------
kono
parents:
diff changeset
325
kono
parents:
diff changeset
326 function String_To_Name (S : String_Id) return Name_Id is
kono
parents:
diff changeset
327 Buf : Bounded_String;
kono
parents:
diff changeset
328 begin
kono
parents:
diff changeset
329 Append (Buf, S);
kono
parents:
diff changeset
330 return Name_Find (Buf);
kono
parents:
diff changeset
331 end String_To_Name;
kono
parents:
diff changeset
332
kono
parents:
diff changeset
333 ---------------------------
kono
parents:
diff changeset
334 -- String_To_Name_Buffer --
kono
parents:
diff changeset
335 ---------------------------
kono
parents:
diff changeset
336
kono
parents:
diff changeset
337 procedure String_To_Name_Buffer (S : String_Id) is
kono
parents:
diff changeset
338 begin
kono
parents:
diff changeset
339 Name_Len := 0;
kono
parents:
diff changeset
340 Append (Global_Name_Buffer, S);
kono
parents:
diff changeset
341 end String_To_Name_Buffer;
kono
parents:
diff changeset
342
kono
parents:
diff changeset
343 ---------------------
kono
parents:
diff changeset
344 -- Strings_Address --
kono
parents:
diff changeset
345 ---------------------
kono
parents:
diff changeset
346
kono
parents:
diff changeset
347 function Strings_Address return System.Address is
kono
parents:
diff changeset
348 begin
kono
parents:
diff changeset
349 return Strings.Table (First_String_Id)'Address;
kono
parents:
diff changeset
350 end Strings_Address;
kono
parents:
diff changeset
351
kono
parents:
diff changeset
352 ---------------
kono
parents:
diff changeset
353 -- Tree_Read --
kono
parents:
diff changeset
354 ---------------
kono
parents:
diff changeset
355
kono
parents:
diff changeset
356 procedure Tree_Read is
kono
parents:
diff changeset
357 begin
kono
parents:
diff changeset
358 String_Chars.Tree_Read;
kono
parents:
diff changeset
359 Strings.Tree_Read;
kono
parents:
diff changeset
360 end Tree_Read;
kono
parents:
diff changeset
361
kono
parents:
diff changeset
362 ----------------
kono
parents:
diff changeset
363 -- Tree_Write --
kono
parents:
diff changeset
364 ----------------
kono
parents:
diff changeset
365
kono
parents:
diff changeset
366 procedure Tree_Write is
kono
parents:
diff changeset
367 begin
kono
parents:
diff changeset
368 String_Chars.Tree_Write;
kono
parents:
diff changeset
369 Strings.Tree_Write;
kono
parents:
diff changeset
370 end Tree_Write;
kono
parents:
diff changeset
371
kono
parents:
diff changeset
372 ------------
kono
parents:
diff changeset
373 -- Unlock --
kono
parents:
diff changeset
374 ------------
kono
parents:
diff changeset
375
kono
parents:
diff changeset
376 procedure Unlock is
kono
parents:
diff changeset
377 begin
kono
parents:
diff changeset
378 String_Chars.Locked := False;
kono
parents:
diff changeset
379 Strings.Locked := False;
kono
parents:
diff changeset
380 end Unlock;
kono
parents:
diff changeset
381
kono
parents:
diff changeset
382 -------------------------
kono
parents:
diff changeset
383 -- Unstore_String_Char --
kono
parents:
diff changeset
384 -------------------------
kono
parents:
diff changeset
385
kono
parents:
diff changeset
386 procedure Unstore_String_Char is
kono
parents:
diff changeset
387 begin
kono
parents:
diff changeset
388 String_Chars.Decrement_Last;
kono
parents:
diff changeset
389 Strings.Table (Strings.Last).Length :=
kono
parents:
diff changeset
390 Strings.Table (Strings.Last).Length - 1;
kono
parents:
diff changeset
391 end Unstore_String_Char;
kono
parents:
diff changeset
392
kono
parents:
diff changeset
393 ---------------------
kono
parents:
diff changeset
394 -- Write_Char_Code --
kono
parents:
diff changeset
395 ---------------------
kono
parents:
diff changeset
396
kono
parents:
diff changeset
397 procedure Write_Char_Code (Code : Char_Code) is
kono
parents:
diff changeset
398
kono
parents:
diff changeset
399 procedure Write_Hex_Byte (J : Char_Code);
kono
parents:
diff changeset
400 -- Write single hex byte (value in range 0 .. 255) as two digits
kono
parents:
diff changeset
401
kono
parents:
diff changeset
402 --------------------
kono
parents:
diff changeset
403 -- Write_Hex_Byte --
kono
parents:
diff changeset
404 --------------------
kono
parents:
diff changeset
405
kono
parents:
diff changeset
406 procedure Write_Hex_Byte (J : Char_Code) is
kono
parents:
diff changeset
407 Hexd : constant array (Char_Code range 0 .. 15) of Character :=
kono
parents:
diff changeset
408 "0123456789abcdef";
kono
parents:
diff changeset
409 begin
kono
parents:
diff changeset
410 Write_Char (Hexd (J / 16));
kono
parents:
diff changeset
411 Write_Char (Hexd (J mod 16));
kono
parents:
diff changeset
412 end Write_Hex_Byte;
kono
parents:
diff changeset
413
kono
parents:
diff changeset
414 -- Start of processing for Write_Char_Code
kono
parents:
diff changeset
415
kono
parents:
diff changeset
416 begin
kono
parents:
diff changeset
417 if Code in 16#20# .. 16#7E# then
kono
parents:
diff changeset
418 Write_Char (Character'Val (Code));
kono
parents:
diff changeset
419
kono
parents:
diff changeset
420 else
kono
parents:
diff changeset
421 Write_Char ('[');
kono
parents:
diff changeset
422 Write_Char ('"');
kono
parents:
diff changeset
423
kono
parents:
diff changeset
424 if Code > 16#FF_FFFF# then
kono
parents:
diff changeset
425 Write_Hex_Byte (Code / 2 ** 24);
kono
parents:
diff changeset
426 end if;
kono
parents:
diff changeset
427
kono
parents:
diff changeset
428 if Code > 16#FFFF# then
kono
parents:
diff changeset
429 Write_Hex_Byte ((Code / 2 ** 16) mod 256);
kono
parents:
diff changeset
430 end if;
kono
parents:
diff changeset
431
kono
parents:
diff changeset
432 if Code > 16#FF# then
kono
parents:
diff changeset
433 Write_Hex_Byte ((Code / 256) mod 256);
kono
parents:
diff changeset
434 end if;
kono
parents:
diff changeset
435
kono
parents:
diff changeset
436 Write_Hex_Byte (Code mod 256);
kono
parents:
diff changeset
437 Write_Char ('"');
kono
parents:
diff changeset
438 Write_Char (']');
kono
parents:
diff changeset
439 end if;
kono
parents:
diff changeset
440 end Write_Char_Code;
kono
parents:
diff changeset
441
kono
parents:
diff changeset
442 ------------------------------
kono
parents:
diff changeset
443 -- Write_String_Table_Entry --
kono
parents:
diff changeset
444 ------------------------------
kono
parents:
diff changeset
445
kono
parents:
diff changeset
446 procedure Write_String_Table_Entry (Id : String_Id) is
kono
parents:
diff changeset
447 C : Char_Code;
kono
parents:
diff changeset
448
kono
parents:
diff changeset
449 begin
kono
parents:
diff changeset
450 if Id = No_String then
kono
parents:
diff changeset
451 Write_Str ("no string");
kono
parents:
diff changeset
452
kono
parents:
diff changeset
453 else
kono
parents:
diff changeset
454 Write_Char ('"');
kono
parents:
diff changeset
455
kono
parents:
diff changeset
456 for J in 1 .. String_Length (Id) loop
kono
parents:
diff changeset
457 C := Get_String_Char (Id, J);
kono
parents:
diff changeset
458
kono
parents:
diff changeset
459 if C = Character'Pos ('"') then
kono
parents:
diff changeset
460 Write_Str ("""""");
kono
parents:
diff changeset
461 else
kono
parents:
diff changeset
462 Write_Char_Code (C);
kono
parents:
diff changeset
463 end if;
kono
parents:
diff changeset
464
kono
parents:
diff changeset
465 -- If string is very long, quit
kono
parents:
diff changeset
466
kono
parents:
diff changeset
467 if J >= 1000 then -- arbitrary limit
kono
parents:
diff changeset
468 Write_Str ("""...etc (length = ");
kono
parents:
diff changeset
469 Write_Int (String_Length (Id));
kono
parents:
diff changeset
470 Write_Str (")");
kono
parents:
diff changeset
471 return;
kono
parents:
diff changeset
472 end if;
kono
parents:
diff changeset
473 end loop;
kono
parents:
diff changeset
474
kono
parents:
diff changeset
475 Write_Char ('"');
kono
parents:
diff changeset
476 end if;
kono
parents:
diff changeset
477 end Write_String_Table_Entry;
kono
parents:
diff changeset
478
kono
parents:
diff changeset
479 end Stringt;