annotate gcc/ada/namet-sp.adb @ 144:8f4e72ab4e11

fix segmentation fault caused by nothing next cur_op to end
author Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
date Sun, 23 Dec 2018 21:23:56 +0900
parents 84e7813d76e9
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 -- N A M E T . S P --
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) 2008-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 System.WCh_Cnv; use System.WCh_Cnv;
kono
parents:
diff changeset
33
kono
parents:
diff changeset
34 with GNAT.UTF_32_Spelling_Checker;
kono
parents:
diff changeset
35
kono
parents:
diff changeset
36 package body Namet.Sp is
kono
parents:
diff changeset
37
kono
parents:
diff changeset
38 -----------------------
kono
parents:
diff changeset
39 -- Local Subprograms --
kono
parents:
diff changeset
40 -----------------------
kono
parents:
diff changeset
41
kono
parents:
diff changeset
42 procedure Get_Name_String_UTF_32
kono
parents:
diff changeset
43 (Id : Name_Id;
kono
parents:
diff changeset
44 Result : out UTF_32_String;
kono
parents:
diff changeset
45 Length : out Natural);
kono
parents:
diff changeset
46 -- This procedure is similar to Get_Decoded_Name except that the output
kono
parents:
diff changeset
47 -- is stored in the given Result array as single codes, so in particular
kono
parents:
diff changeset
48 -- any Uhh, Whhhh, or WWhhhhhhhh sequences are decoded to appear as a
kono
parents:
diff changeset
49 -- single value in the output. This call does not affect the contents of
kono
parents:
diff changeset
50 -- either Name_Buffer or Name_Len. The result is in Result (1 .. Length).
kono
parents:
diff changeset
51 -- The caller must ensure that the result buffer is long enough.
kono
parents:
diff changeset
52
kono
parents:
diff changeset
53 ----------------------------
kono
parents:
diff changeset
54 -- Get_Name_String_UTF_32 --
kono
parents:
diff changeset
55 ----------------------------
kono
parents:
diff changeset
56
kono
parents:
diff changeset
57 procedure Get_Name_String_UTF_32
kono
parents:
diff changeset
58 (Id : Name_Id;
kono
parents:
diff changeset
59 Result : out UTF_32_String;
kono
parents:
diff changeset
60 Length : out Natural)
kono
parents:
diff changeset
61 is
kono
parents:
diff changeset
62 pragma Assert (Result'First = 1);
kono
parents:
diff changeset
63
kono
parents:
diff changeset
64 SPtr : Int := Name_Entries.Table (Id).Name_Chars_Index + 1;
kono
parents:
diff changeset
65 -- Index through characters of name in Name_Chars table. Initial value
kono
parents:
diff changeset
66 -- points to first character of the name.
kono
parents:
diff changeset
67
kono
parents:
diff changeset
68 SLen : constant Nat := Nat (Name_Entries.Table (Id).Name_Len);
kono
parents:
diff changeset
69 -- Length of the name
kono
parents:
diff changeset
70
kono
parents:
diff changeset
71 SLast : constant Int := SPtr + SLen - 1;
kono
parents:
diff changeset
72 -- Last index in Name_Chars table for name
kono
parents:
diff changeset
73
kono
parents:
diff changeset
74 C : Character;
kono
parents:
diff changeset
75 -- Current character from Name_Chars table
kono
parents:
diff changeset
76
kono
parents:
diff changeset
77 procedure Store_Hex (N : Natural);
kono
parents:
diff changeset
78 -- Read and store next N characters starting at SPtr and store result
kono
parents:
diff changeset
79 -- in next character of Result. Update SPtr past characters read.
kono
parents:
diff changeset
80
kono
parents:
diff changeset
81 ---------------
kono
parents:
diff changeset
82 -- Store_Hex --
kono
parents:
diff changeset
83 ---------------
kono
parents:
diff changeset
84
kono
parents:
diff changeset
85 procedure Store_Hex (N : Natural) is
kono
parents:
diff changeset
86 T : UTF_32_Code;
kono
parents:
diff changeset
87 C : Character;
kono
parents:
diff changeset
88
kono
parents:
diff changeset
89 begin
kono
parents:
diff changeset
90 T := 0;
kono
parents:
diff changeset
91 for J in 1 .. N loop
kono
parents:
diff changeset
92 C := Name_Chars.Table (SPtr);
kono
parents:
diff changeset
93 SPtr := SPtr + 1;
kono
parents:
diff changeset
94
kono
parents:
diff changeset
95 if C in '0' .. '9' then
kono
parents:
diff changeset
96 T := 16 * T + Character'Pos (C) - Character'Pos ('0');
kono
parents:
diff changeset
97 else
kono
parents:
diff changeset
98 pragma Assert (C in 'a' .. 'f');
kono
parents:
diff changeset
99
kono
parents:
diff changeset
100 T := 16 * T + Character'Pos (C) - (Character'Pos ('a') - 10);
kono
parents:
diff changeset
101 end if;
kono
parents:
diff changeset
102 end loop;
kono
parents:
diff changeset
103
kono
parents:
diff changeset
104 Length := Length + 1;
kono
parents:
diff changeset
105 pragma Assert (Length <= Result'Length);
kono
parents:
diff changeset
106 Result (Length) := T;
kono
parents:
diff changeset
107 end Store_Hex;
kono
parents:
diff changeset
108
kono
parents:
diff changeset
109 -- Start of processing for Get_Name_String_UTF_32
kono
parents:
diff changeset
110
kono
parents:
diff changeset
111 begin
kono
parents:
diff changeset
112 Length := 0;
kono
parents:
diff changeset
113 while SPtr <= SLast loop
kono
parents:
diff changeset
114 C := Name_Chars.Table (SPtr);
kono
parents:
diff changeset
115
kono
parents:
diff changeset
116 -- Uhh encoding
kono
parents:
diff changeset
117
kono
parents:
diff changeset
118 if C = 'U'
kono
parents:
diff changeset
119 and then SPtr <= SLast - 2
kono
parents:
diff changeset
120 and then Name_Chars.Table (SPtr + 1) not in 'A' .. 'Z'
kono
parents:
diff changeset
121 then
kono
parents:
diff changeset
122 SPtr := SPtr + 1;
kono
parents:
diff changeset
123 Store_Hex (2);
kono
parents:
diff changeset
124
kono
parents:
diff changeset
125 -- Whhhh encoding
kono
parents:
diff changeset
126
kono
parents:
diff changeset
127 elsif C = 'W'
kono
parents:
diff changeset
128 and then SPtr <= SLast - 4
kono
parents:
diff changeset
129 and then Name_Chars.Table (SPtr + 1) not in 'A' .. 'Z'
kono
parents:
diff changeset
130 then
kono
parents:
diff changeset
131 SPtr := SPtr + 1;
kono
parents:
diff changeset
132 Store_Hex (4);
kono
parents:
diff changeset
133
kono
parents:
diff changeset
134 -- WWhhhhhhhh encoding
kono
parents:
diff changeset
135
kono
parents:
diff changeset
136 elsif C = 'W'
kono
parents:
diff changeset
137 and then SPtr <= SLast - 8
kono
parents:
diff changeset
138 and then Name_Chars.Table (SPtr + 1) = 'W'
kono
parents:
diff changeset
139 then
kono
parents:
diff changeset
140 SPtr := SPtr + 2;
kono
parents:
diff changeset
141 Store_Hex (8);
kono
parents:
diff changeset
142
kono
parents:
diff changeset
143 -- Q encoding (character literal)
kono
parents:
diff changeset
144
kono
parents:
diff changeset
145 elsif C = 'Q' and then SPtr < SLast then
kono
parents:
diff changeset
146
kono
parents:
diff changeset
147 -- Put apostrophes around character
kono
parents:
diff changeset
148
kono
parents:
diff changeset
149 pragma Assert (Length <= Result'Last - 3);
kono
parents:
diff changeset
150 Result (Length + 1) := UTF_32_Code'Val (Character'Pos ('''));
kono
parents:
diff changeset
151 Result (Length + 2) :=
kono
parents:
diff changeset
152 UTF_32_Code (Get_Char_Code (Name_Chars.Table (SPtr + 1)));
kono
parents:
diff changeset
153 Result (Length + 3) := UTF_32_Code'Val (Character'Pos ('''));
kono
parents:
diff changeset
154 SPtr := SPtr + 2;
kono
parents:
diff changeset
155 Length := Length + 3;
kono
parents:
diff changeset
156
kono
parents:
diff changeset
157 -- Unencoded case
kono
parents:
diff changeset
158
kono
parents:
diff changeset
159 else
kono
parents:
diff changeset
160 SPtr := SPtr + 1;
kono
parents:
diff changeset
161 Length := Length + 1;
kono
parents:
diff changeset
162 pragma Assert (Length <= Result'Last);
kono
parents:
diff changeset
163 Result (Length) := UTF_32_Code (Get_Char_Code (C));
kono
parents:
diff changeset
164 end if;
kono
parents:
diff changeset
165 end loop;
kono
parents:
diff changeset
166 end Get_Name_String_UTF_32;
kono
parents:
diff changeset
167
kono
parents:
diff changeset
168 ------------------------
kono
parents:
diff changeset
169 -- Is_Bad_Spelling_Of --
kono
parents:
diff changeset
170 ------------------------
kono
parents:
diff changeset
171
kono
parents:
diff changeset
172 function Is_Bad_Spelling_Of (Found, Expect : Name_Id) return Boolean is
kono
parents:
diff changeset
173 FL : constant Natural := Natural (Length_Of_Name (Found));
kono
parents:
diff changeset
174 EL : constant Natural := Natural (Length_Of_Name (Expect));
kono
parents:
diff changeset
175 -- Length of input names
kono
parents:
diff changeset
176
kono
parents:
diff changeset
177 FB : UTF_32_String (1 .. 2 * FL);
kono
parents:
diff changeset
178 EB : UTF_32_String (1 .. 2 * EL);
kono
parents:
diff changeset
179 -- Buffers for results, a factor of 2 is more than enough, the only
kono
parents:
diff changeset
180 -- sequence which expands is Q (character literal) by 1.5 times.
kono
parents:
diff changeset
181
kono
parents:
diff changeset
182 FBL : Natural;
kono
parents:
diff changeset
183 EBL : Natural;
kono
parents:
diff changeset
184 -- Length of decoded names
kono
parents:
diff changeset
185
kono
parents:
diff changeset
186 begin
kono
parents:
diff changeset
187 Get_Name_String_UTF_32 (Found, FB, FBL);
kono
parents:
diff changeset
188 Get_Name_String_UTF_32 (Expect, EB, EBL);
kono
parents:
diff changeset
189
kono
parents:
diff changeset
190 -- For an exact match, return False, otherwise check bad spelling. We
kono
parents:
diff changeset
191 -- need this special test because the library routine returns True for
kono
parents:
diff changeset
192 -- an exact match.
kono
parents:
diff changeset
193
kono
parents:
diff changeset
194 if FB (1 .. FBL) = EB (1 .. EBL) then
kono
parents:
diff changeset
195 return False;
kono
parents:
diff changeset
196 else
kono
parents:
diff changeset
197 return
kono
parents:
diff changeset
198 GNAT.UTF_32_Spelling_Checker.Is_Bad_Spelling_Of
kono
parents:
diff changeset
199 (FB (1 .. FBL), EB (1 .. EBL));
kono
parents:
diff changeset
200 end if;
kono
parents:
diff changeset
201 end Is_Bad_Spelling_Of;
kono
parents:
diff changeset
202
kono
parents:
diff changeset
203 end Namet.Sp;