annotate gcc/ada/casing.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 COMPILER COMPONENTS --
kono
parents:
diff changeset
4 -- --
kono
parents:
diff changeset
5 -- C A S I N G --
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-2015, 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. --
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 Csets; use Csets;
kono
parents:
diff changeset
33 with Opt; use Opt;
kono
parents:
diff changeset
34 with Widechar; use Widechar;
kono
parents:
diff changeset
35
kono
parents:
diff changeset
36 package body Casing is
kono
parents:
diff changeset
37
kono
parents:
diff changeset
38 ----------------------
kono
parents:
diff changeset
39 -- Determine_Casing --
kono
parents:
diff changeset
40 ----------------------
kono
parents:
diff changeset
41
kono
parents:
diff changeset
42 function Determine_Casing (Ident : Text_Buffer) return Casing_Type is
kono
parents:
diff changeset
43
kono
parents:
diff changeset
44 All_Lower : Boolean := True;
kono
parents:
diff changeset
45 -- Set False if upper case letter found
kono
parents:
diff changeset
46
kono
parents:
diff changeset
47 All_Upper : Boolean := True;
kono
parents:
diff changeset
48 -- Set False if lower case letter found
kono
parents:
diff changeset
49
kono
parents:
diff changeset
50 Mixed : Boolean := True;
kono
parents:
diff changeset
51 -- Set False if exception to mixed case rule found (lower case letter
kono
parents:
diff changeset
52 -- at start or after underline, or upper case letter elsewhere).
kono
parents:
diff changeset
53
kono
parents:
diff changeset
54 Decisive : Boolean := False;
kono
parents:
diff changeset
55 -- Set True if at least one instance of letter not after underline
kono
parents:
diff changeset
56
kono
parents:
diff changeset
57 After_Und : Boolean := True;
kono
parents:
diff changeset
58 -- True at start of string, and after an underline character
kono
parents:
diff changeset
59
kono
parents:
diff changeset
60 begin
kono
parents:
diff changeset
61 -- A special exception, consider SPARK_Mode to be mixed case
kono
parents:
diff changeset
62
kono
parents:
diff changeset
63 if Ident = "SPARK_Mode" then
kono
parents:
diff changeset
64 return Mixed_Case;
kono
parents:
diff changeset
65 end if;
kono
parents:
diff changeset
66
kono
parents:
diff changeset
67 -- Proceed with normal determination
kono
parents:
diff changeset
68
kono
parents:
diff changeset
69 for S in Ident'Range loop
kono
parents:
diff changeset
70 if Ident (S) = '_' or else Ident (S) = '.' then
kono
parents:
diff changeset
71 After_Und := True;
kono
parents:
diff changeset
72
kono
parents:
diff changeset
73 elsif Is_Lower_Case_Letter (Ident (S)) then
kono
parents:
diff changeset
74 All_Upper := False;
kono
parents:
diff changeset
75
kono
parents:
diff changeset
76 if not After_Und then
kono
parents:
diff changeset
77 Decisive := True;
kono
parents:
diff changeset
78 else
kono
parents:
diff changeset
79 After_Und := False;
kono
parents:
diff changeset
80 Mixed := False;
kono
parents:
diff changeset
81 end if;
kono
parents:
diff changeset
82
kono
parents:
diff changeset
83 elsif Is_Upper_Case_Letter (Ident (S)) then
kono
parents:
diff changeset
84 All_Lower := False;
kono
parents:
diff changeset
85
kono
parents:
diff changeset
86 if not After_Und then
kono
parents:
diff changeset
87 Decisive := True;
kono
parents:
diff changeset
88 Mixed := False;
kono
parents:
diff changeset
89 else
kono
parents:
diff changeset
90 After_Und := False;
kono
parents:
diff changeset
91 end if;
kono
parents:
diff changeset
92 end if;
kono
parents:
diff changeset
93 end loop;
kono
parents:
diff changeset
94
kono
parents:
diff changeset
95 -- Now we can figure out the result from the flags we set in that loop
kono
parents:
diff changeset
96
kono
parents:
diff changeset
97 if All_Lower then
kono
parents:
diff changeset
98 return All_Lower_Case;
kono
parents:
diff changeset
99
kono
parents:
diff changeset
100 elsif not Decisive then
kono
parents:
diff changeset
101 return Unknown;
kono
parents:
diff changeset
102
kono
parents:
diff changeset
103 elsif All_Upper then
kono
parents:
diff changeset
104 return All_Upper_Case;
kono
parents:
diff changeset
105
kono
parents:
diff changeset
106 elsif Mixed then
kono
parents:
diff changeset
107 return Mixed_Case;
kono
parents:
diff changeset
108
kono
parents:
diff changeset
109 else
kono
parents:
diff changeset
110 return Unknown;
kono
parents:
diff changeset
111 end if;
kono
parents:
diff changeset
112 end Determine_Casing;
kono
parents:
diff changeset
113
kono
parents:
diff changeset
114 ------------------------
kono
parents:
diff changeset
115 -- Set_All_Upper_Case --
kono
parents:
diff changeset
116 ------------------------
kono
parents:
diff changeset
117
kono
parents:
diff changeset
118 procedure Set_All_Upper_Case is
kono
parents:
diff changeset
119 begin
kono
parents:
diff changeset
120 Set_Casing (All_Upper_Case);
kono
parents:
diff changeset
121 end Set_All_Upper_Case;
kono
parents:
diff changeset
122
kono
parents:
diff changeset
123 ----------------
kono
parents:
diff changeset
124 -- Set_Casing --
kono
parents:
diff changeset
125 ----------------
kono
parents:
diff changeset
126
kono
parents:
diff changeset
127 procedure Set_Casing
kono
parents:
diff changeset
128 (Buf : in out Bounded_String;
kono
parents:
diff changeset
129 C : Casing_Type;
kono
parents:
diff changeset
130 D : Casing_Type := Mixed_Case)
kono
parents:
diff changeset
131 is
kono
parents:
diff changeset
132 Ptr : Natural;
kono
parents:
diff changeset
133
kono
parents:
diff changeset
134 Actual_Casing : Casing_Type;
kono
parents:
diff changeset
135 -- Set from C or D as appropriate
kono
parents:
diff changeset
136
kono
parents:
diff changeset
137 After_Und : Boolean := True;
kono
parents:
diff changeset
138 -- True at start of string, and after an underline character or after
kono
parents:
diff changeset
139 -- any other special character that is not a normal identifier char).
kono
parents:
diff changeset
140
kono
parents:
diff changeset
141 begin
kono
parents:
diff changeset
142 if C /= Unknown then
kono
parents:
diff changeset
143 Actual_Casing := C;
kono
parents:
diff changeset
144 else
kono
parents:
diff changeset
145 Actual_Casing := D;
kono
parents:
diff changeset
146 end if;
kono
parents:
diff changeset
147
kono
parents:
diff changeset
148 Ptr := 1;
kono
parents:
diff changeset
149
kono
parents:
diff changeset
150 while Ptr <= Buf.Length loop
kono
parents:
diff changeset
151
kono
parents:
diff changeset
152 -- Wide character. Note that we do nothing with casing in this case.
kono
parents:
diff changeset
153 -- In Ada 2005 mode, required folding of lower case letters happened
kono
parents:
diff changeset
154 -- as the identifier was scanned, and we do not attempt any further
kono
parents:
diff changeset
155 -- messing with case (note that in any case we do not know how to
kono
parents:
diff changeset
156 -- fold upper case to lower case in wide character mode). We also
kono
parents:
diff changeset
157 -- do not bother with recognizing punctuation as equivalent to an
kono
parents:
diff changeset
158 -- underscore. There is nothing functional at this stage in doing
kono
parents:
diff changeset
159 -- the requested casing operation, beyond folding to upper case
kono
parents:
diff changeset
160 -- when it is mandatory, which does not involve underscores.
kono
parents:
diff changeset
161
kono
parents:
diff changeset
162 if Buf.Chars (Ptr) = ASCII.ESC
kono
parents:
diff changeset
163 or else Buf.Chars (Ptr) = '['
kono
parents:
diff changeset
164 or else (Upper_Half_Encoding
kono
parents:
diff changeset
165 and then Buf.Chars (Ptr) in Upper_Half_Character)
kono
parents:
diff changeset
166 then
kono
parents:
diff changeset
167 Skip_Wide (Buf.Chars, Ptr);
kono
parents:
diff changeset
168 After_Und := False;
kono
parents:
diff changeset
169
kono
parents:
diff changeset
170 -- Underscore, or non-identifer character (error case)
kono
parents:
diff changeset
171
kono
parents:
diff changeset
172 elsif Buf.Chars (Ptr) = '_'
kono
parents:
diff changeset
173 or else not Identifier_Char (Buf.Chars (Ptr))
kono
parents:
diff changeset
174 then
kono
parents:
diff changeset
175 After_Und := True;
kono
parents:
diff changeset
176 Ptr := Ptr + 1;
kono
parents:
diff changeset
177
kono
parents:
diff changeset
178 -- Lower case letter
kono
parents:
diff changeset
179
kono
parents:
diff changeset
180 elsif Is_Lower_Case_Letter (Buf.Chars (Ptr)) then
kono
parents:
diff changeset
181 if Actual_Casing = All_Upper_Case
kono
parents:
diff changeset
182 or else (After_Und and then Actual_Casing = Mixed_Case)
kono
parents:
diff changeset
183 then
kono
parents:
diff changeset
184 Buf.Chars (Ptr) := Fold_Upper (Buf.Chars (Ptr));
kono
parents:
diff changeset
185 end if;
kono
parents:
diff changeset
186
kono
parents:
diff changeset
187 After_Und := False;
kono
parents:
diff changeset
188 Ptr := Ptr + 1;
kono
parents:
diff changeset
189
kono
parents:
diff changeset
190 -- Upper case letter
kono
parents:
diff changeset
191
kono
parents:
diff changeset
192 elsif Is_Upper_Case_Letter (Buf.Chars (Ptr)) then
kono
parents:
diff changeset
193 if Actual_Casing = All_Lower_Case
kono
parents:
diff changeset
194 or else (not After_Und and then Actual_Casing = Mixed_Case)
kono
parents:
diff changeset
195 then
kono
parents:
diff changeset
196 Buf.Chars (Ptr) := Fold_Lower (Buf.Chars (Ptr));
kono
parents:
diff changeset
197 end if;
kono
parents:
diff changeset
198
kono
parents:
diff changeset
199 After_Und := False;
kono
parents:
diff changeset
200 Ptr := Ptr + 1;
kono
parents:
diff changeset
201
kono
parents:
diff changeset
202 -- Other identifier character (must be digit)
kono
parents:
diff changeset
203
kono
parents:
diff changeset
204 else
kono
parents:
diff changeset
205 After_Und := False;
kono
parents:
diff changeset
206 Ptr := Ptr + 1;
kono
parents:
diff changeset
207 end if;
kono
parents:
diff changeset
208 end loop;
kono
parents:
diff changeset
209 end Set_Casing;
kono
parents:
diff changeset
210
kono
parents:
diff changeset
211 procedure Set_Casing (C : Casing_Type; D : Casing_Type := Mixed_Case) is
kono
parents:
diff changeset
212 begin
kono
parents:
diff changeset
213 Set_Casing (Global_Name_Buffer, C, D);
kono
parents:
diff changeset
214 end Set_Casing;
kono
parents:
diff changeset
215
kono
parents:
diff changeset
216 end Casing;