1 |
149 |
jeremybenn |
-- WIDECHR.A
|
2 |
|
|
--
|
3 |
|
|
-- Grant of Unlimited Rights
|
4 |
|
|
--
|
5 |
|
|
-- Under contracts F33600-87-D-0337, F33600-84-D-0280, MDA903-79-C-0687,
|
6 |
|
|
-- F08630-91-C-0015, and DCA100-97-D-0025, the U.S. Government obtained
|
7 |
|
|
-- unlimited rights in the software and documentation contained herein.
|
8 |
|
|
-- Unlimited rights are defined in DFAR 252.227-7013(a)(19). By making
|
9 |
|
|
-- this public release, the Government intends to confer upon all
|
10 |
|
|
-- recipients unlimited rights equal to those held by the Government.
|
11 |
|
|
-- These rights include rights to use, duplicate, release or disclose the
|
12 |
|
|
-- released technical data and computer software in whole or in part, in
|
13 |
|
|
-- any manner and for any purpose whatsoever, and to have or permit others
|
14 |
|
|
-- to do so.
|
15 |
|
|
--
|
16 |
|
|
-- DISCLAIMER
|
17 |
|
|
--
|
18 |
|
|
-- ALL MATERIALS OR INFORMATION HEREIN RELEASED, MADE AVAILABLE OR
|
19 |
|
|
-- DISCLOSED ARE AS IS. THE GOVERNMENT MAKES NO EXPRESS OR IMPLIED
|
20 |
|
|
-- WARRANTY AS TO ANY MATTER WHATSOEVER, INCLUDING THE CONDITIONS OF THE
|
21 |
|
|
-- SOFTWARE, DOCUMENTATION OR OTHER INFORMATION RELEASED, MADE AVAILABLE
|
22 |
|
|
-- OR DISCLOSED, OR THE OWNERSHIP, MERCHANTABILITY, OR FITNESS FOR A
|
23 |
|
|
-- PARTICULAR PURPOSE OF SAID MATERIAL.
|
24 |
|
|
--*
|
25 |
|
|
--
|
26 |
|
|
-- DESCRIPTION:
|
27 |
|
|
--
|
28 |
|
|
-- This program reads C250001.AW and C250002.AW; translates a special
|
29 |
|
|
-- character sequence into characters and wide characters with positions
|
30 |
|
|
-- above ASCII.DEL. The resulting tests are written as C250001.A and
|
31 |
|
|
-- C250002.A respectively. This program may need to
|
32 |
|
|
-- be modified if the Wide_Character representation recognized by
|
33 |
|
|
-- your compiler differs from the Wide_Character
|
34 |
|
|
-- representation generated by the package Ada.Wide_Text_IO.
|
35 |
|
|
-- Modify this program as needed to translate that file.
|
36 |
|
|
--
|
37 |
|
|
-- A wide character is represented by an 8 character sequence:
|
38 |
|
|
--
|
39 |
|
|
-- ["abcd"]
|
40 |
|
|
--
|
41 |
|
|
-- where the character code represented is specified by four hexadecimal
|
42 |
|
|
-- digits, abcd, with letters in upper case. For example the wide
|
43 |
|
|
-- character with the code 16#AB13# is represented by the eight
|
44 |
|
|
-- character sequence:
|
45 |
|
|
--
|
46 |
|
|
-- ["AB13"]
|
47 |
|
|
--
|
48 |
|
|
-- ASSUMPTIONS:
|
49 |
|
|
--
|
50 |
|
|
-- The path for these files is specified in ImpDef.
|
51 |
|
|
--
|
52 |
|
|
-- SPECIAL REQUIREMENTS:
|
53 |
|
|
--
|
54 |
|
|
-- Compile, bind and execute this program. It will process the ".AW"
|
55 |
|
|
-- tests, "translating" them to ".A" tests.
|
56 |
|
|
--
|
57 |
|
|
-- CHANGE HISTORY:
|
58 |
|
|
-- 11 DEC 96 SAIC ACVC 2.1 Release
|
59 |
|
|
--
|
60 |
|
|
-- 11 DEC 96 Keith Constructed initial release version
|
61 |
|
|
--!
|
62 |
|
|
|
63 |
|
|
with Ada.Text_IO;
|
64 |
|
|
with Ada.Wide_Text_IO;
|
65 |
|
|
with Ada.Strings.Fixed;
|
66 |
|
|
with Impdef;
|
67 |
|
|
|
68 |
|
|
procedure WideChr is
|
69 |
|
|
|
70 |
|
|
-- Debug
|
71 |
|
|
--
|
72 |
|
|
-- To have the program generate trace/debugging information, de-comment
|
73 |
|
|
-- the call to Put_Line
|
74 |
|
|
|
75 |
|
|
procedure Debug( S: String ) is
|
76 |
|
|
begin
|
77 |
|
|
null; -- Ada.Text_IO.Put_Line(S);
|
78 |
|
|
end Debug;
|
79 |
|
|
|
80 |
|
|
package TIO renames Ada.Text_IO;
|
81 |
|
|
package WIO renames Ada.Wide_Text_IO;
|
82 |
|
|
package SF renames Ada.Strings.Fixed;
|
83 |
|
|
|
84 |
|
|
In_File : TIO.File_Type;
|
85 |
|
|
|
86 |
|
|
-- This program is actually dual-purpose. It translates the ["xxxx"]
|
87 |
|
|
-- notation to Wide_Character, as well as a similar notation ["xx"] into
|
88 |
|
|
-- Character. The intent of the latter being the ability to represent
|
89 |
|
|
-- literals in the Latin-1 character set that have position numbers
|
90 |
|
|
-- greater than ASCII.DEL. The variable Output_Mode drives the algorithms
|
91 |
|
|
-- to generate Wide_Character output (Wide) or Character output (Narrow).
|
92 |
|
|
|
93 |
|
|
type Output_Modes is ( Wide, Narrow );
|
94 |
|
|
Output_Mode : Output_Modes := Wide;
|
95 |
|
|
|
96 |
|
|
Wide_Out : WIO.File_Type;
|
97 |
|
|
Narrow_Out : TIO.File_Type;
|
98 |
|
|
|
99 |
|
|
In_Line : String(1..132); -- SB: $MAX_LINE_LENGTH
|
100 |
|
|
|
101 |
|
|
-- Index variables
|
102 |
|
|
--
|
103 |
|
|
-- the following index variables: In_Length, Front, Open_Bracket and
|
104 |
|
|
-- Close_Bracket are used by the scanning software to keep track of
|
105 |
|
|
-- what's where.
|
106 |
|
|
--
|
107 |
|
|
-- In_Length stores the value returned by Ada.Text_IO.Get_Line indicating
|
108 |
|
|
-- the position of the last "useful" character in the string In_Line.
|
109 |
|
|
--
|
110 |
|
|
-- Front retains the index of the first non-translating character in
|
111 |
|
|
-- In_Line, it is used to indicate the starting index of the portion of
|
112 |
|
|
-- the string to save without special interpretation. In the example
|
113 |
|
|
-- below, where there are two consecutive characters to translate, we see
|
114 |
|
|
-- that Front will assume three different values processing the string,
|
115 |
|
|
-- these are indicated by the digits '1', '2' & '3' in the comment
|
116 |
|
|
-- attached to the declaration. The processing software will dump
|
117 |
|
|
-- In_Line(Front..Open_Bracket-1) to the output stream. Note that in
|
118 |
|
|
-- the second case, this results in a null string, and in the third case,
|
119 |
|
|
-- where Open_Bracket does not obtain a third value, the slice
|
120 |
|
|
-- In_Line(Front..In_Length) is used instead.
|
121 |
|
|
--
|
122 |
|
|
-- Open_Bracket and Close_Bracket are used to retain the starting index
|
123 |
|
|
-- of the character pairs [" and "] respectively. For the purposes of
|
124 |
|
|
-- this software the character pairs are what are considered to be the
|
125 |
|
|
-- "brackets" enclosing the hexadecimal values to be translated.
|
126 |
|
|
-- Looking at the example below you will see where these index variables
|
127 |
|
|
-- will "point" in the first and second case.
|
128 |
|
|
|
129 |
|
|
In_Length : Natural := 0; ---> Some_["0A12"]["0B13"]_Thing
|
130 |
|
|
Front : Natural := 0; -- 1 2 3
|
131 |
|
|
Open_Bracket : Natural := 0; -- 1 2
|
132 |
|
|
Close_Bracket : Natural := 0; -- 1 2
|
133 |
|
|
|
134 |
|
|
-- Xlation
|
135 |
|
|
--
|
136 |
|
|
-- This translation table gives an easy way to translate the "decimal"
|
137 |
|
|
-- value of a hex digit (as represented by a Latin-1 character)
|
138 |
|
|
|
139 |
|
|
type Xlate is array(Character range '0'..'F') of Natural;
|
140 |
|
|
Xlation : constant Xlate :=
|
141 |
|
|
('0' => 0, '1' => 1, '2' => 2, '3' => 3, '4' => 4,
|
142 |
|
|
'5' => 5, '6' => 6, '7' => 7, '8' => 8, '9' => 9,
|
143 |
|
|
'A' => 10, 'B' => 11, 'C' => 12, 'D' => 13, 'E' => 14,
|
144 |
|
|
'F' => 15,
|
145 |
|
|
others => 0);
|
146 |
|
|
|
147 |
|
|
-- To_Ch
|
148 |
|
|
--
|
149 |
|
|
-- This function takes a string which is assumed to be trimmed to just a
|
150 |
|
|
-- hexadecimal representation of a Latin-1 character. The result of the
|
151 |
|
|
-- function is the Latin-1 character at the position designated by the
|
152 |
|
|
-- incoming hexadecimal value. (hexadecimal in human readable form)
|
153 |
|
|
|
154 |
|
|
function To_Ch( S:String ) return Character is
|
155 |
|
|
Numerical : Natural := 0;
|
156 |
|
|
begin
|
157 |
|
|
Debug("To Wide: " & S);
|
158 |
|
|
for I in S'Range loop
|
159 |
|
|
Numerical := Numerical * 16 + Xlation(S(I));
|
160 |
|
|
end loop;
|
161 |
|
|
return Character'Val(Numerical);
|
162 |
|
|
exception
|
163 |
|
|
when Constraint_Error => return '_';
|
164 |
|
|
end To_Ch;
|
165 |
|
|
|
166 |
|
|
-- To_Wide
|
167 |
|
|
--
|
168 |
|
|
-- This function takes a string which is assumed to be trimmed to just a
|
169 |
|
|
-- hexadecimal representation of a Wide_character. The result of the
|
170 |
|
|
-- function is the Wide_character at the position designated by the
|
171 |
|
|
-- incoming hexadecimal value. (hexadecimal in human readable form)
|
172 |
|
|
|
173 |
|
|
function To_Wide( S:String ) return Wide_character is
|
174 |
|
|
Numerical : Natural := 0;
|
175 |
|
|
begin
|
176 |
|
|
Debug("To Wide: " & S);
|
177 |
|
|
for I in S'Range loop
|
178 |
|
|
Numerical := Numerical * 16 + Xlation(S(I));
|
179 |
|
|
end loop;
|
180 |
|
|
return Wide_Character'Val(Numerical);
|
181 |
|
|
exception
|
182 |
|
|
when Constraint_Error => return '_';
|
183 |
|
|
end To_Wide;
|
184 |
|
|
|
185 |
|
|
-- Make_Wide
|
186 |
|
|
--
|
187 |
|
|
-- this function converts a String to a Wide_String
|
188 |
|
|
|
189 |
|
|
function Make_Wide( S: String ) return Wide_String is
|
190 |
|
|
W: Wide_String(S'Range);
|
191 |
|
|
begin
|
192 |
|
|
for I in S'Range loop
|
193 |
|
|
W(I) := Wide_Character'Val( Character'Pos(S(I)) );
|
194 |
|
|
end loop;
|
195 |
|
|
return W;
|
196 |
|
|
end Make_Wide;
|
197 |
|
|
|
198 |
|
|
-- Close_Files
|
199 |
|
|
--
|
200 |
|
|
-- Depending on which input we've processed, close the output file
|
201 |
|
|
|
202 |
|
|
procedure Close_Files is
|
203 |
|
|
begin
|
204 |
|
|
TIO.Close(In_File);
|
205 |
|
|
if Output_Mode = Wide then
|
206 |
|
|
WIO.Close(Wide_Out);
|
207 |
|
|
else
|
208 |
|
|
TIO.Close(Narrow_Out);
|
209 |
|
|
end if;
|
210 |
|
|
end Close_Files;
|
211 |
|
|
|
212 |
|
|
-- Process
|
213 |
|
|
--
|
214 |
|
|
-- for all lines in the input file
|
215 |
|
|
-- scan the file for occurrences of [" and "]
|
216 |
|
|
-- for found occurrence, attempt translation of the characters found
|
217 |
|
|
-- between the brackets. As a safeguard, unrecognizable character
|
218 |
|
|
-- sequences will be replaced with the underscore character. This
|
219 |
|
|
-- handles the cases in the tests where the test documentation includes
|
220 |
|
|
-- examples that are non-conformant: i.e. ["abcd"] or ["XXXX"]
|
221 |
|
|
|
222 |
|
|
procedure Process( Input_File_Name: String ) is
|
223 |
|
|
begin
|
224 |
|
|
TIO.Open(In_File,TIO.In_File,Input_File_Name & ".aw" );
|
225 |
|
|
|
226 |
|
|
if Output_Mode = Wide then
|
227 |
|
|
WIO.Create(Wide_Out,WIO.Out_File, Input_File_Name & ".a" );
|
228 |
|
|
else
|
229 |
|
|
TIO.Create(Narrow_Out,TIO.Out_File, Input_File_Name & ".a" );
|
230 |
|
|
end if;
|
231 |
|
|
|
232 |
|
|
File: while not TIO.End_Of_File( In_File ) loop
|
233 |
|
|
In_Line := (others => ' ');
|
234 |
|
|
TIO.Get_Line(In_File,In_Line,In_Length);
|
235 |
|
|
Debug(In_Line(1..In_Length));
|
236 |
|
|
|
237 |
|
|
Front := 1;
|
238 |
|
|
|
239 |
|
|
Line: loop
|
240 |
|
|
-- scan for next occurrence of ["abcd"]
|
241 |
|
|
Open_Bracket := SF.Index( In_Line(Front..In_Length), "[""" );
|
242 |
|
|
Close_Bracket := SF.Index( In_Line(Front..In_Length), """]" );
|
243 |
|
|
Debug( "[=" & Natural'Image(Open_Bracket) );
|
244 |
|
|
Debug( "]=" & Natural'Image(Close_Bracket) );
|
245 |
|
|
|
246 |
|
|
if Open_Bracket = 0 or Close_Bracket = 0 then
|
247 |
|
|
-- done with the line, output remaining characters and exit
|
248 |
|
|
Debug("Done with line");
|
249 |
|
|
if Output_Mode = Wide then
|
250 |
|
|
WIO.Put_Line(Wide_Out, Make_Wide(In_Line(Front..In_Length)) );
|
251 |
|
|
else
|
252 |
|
|
TIO.Put_Line(Narrow_Out, In_Line(Front..In_Length) );
|
253 |
|
|
end if;
|
254 |
|
|
exit Line;
|
255 |
|
|
else
|
256 |
|
|
-- output the "normal" stuff up to the bracket
|
257 |
|
|
if Output_Mode = Wide then
|
258 |
|
|
WIO.Put(Wide_Out, Make_Wide(In_Line(Front..Open_Bracket-1)) );
|
259 |
|
|
else
|
260 |
|
|
TIO.Put(Narrow_Out, In_Line(Front..Open_Bracket-1) );
|
261 |
|
|
end if;
|
262 |
|
|
|
263 |
|
|
-- point beyond the closing bracket
|
264 |
|
|
Front := Close_Bracket +2;
|
265 |
|
|
|
266 |
|
|
-- output the translated hexadecimal character
|
267 |
|
|
if Output_Mode = Wide then
|
268 |
|
|
WIO.Put(Wide_Out,
|
269 |
|
|
To_Wide( In_Line(Open_Bracket+2..Close_Bracket-1) ));
|
270 |
|
|
else
|
271 |
|
|
TIO.Put(Narrow_Out,
|
272 |
|
|
To_Ch( In_Line(Open_Bracket+2..Close_Bracket-1)) );
|
273 |
|
|
end if;
|
274 |
|
|
end if;
|
275 |
|
|
end loop Line;
|
276 |
|
|
|
277 |
|
|
end loop File;
|
278 |
|
|
|
279 |
|
|
Close_Files;
|
280 |
|
|
exception
|
281 |
|
|
when others =>
|
282 |
|
|
Ada.Text_IO.Put_Line("Error in processing " & Input_File_Name);
|
283 |
|
|
raise;
|
284 |
|
|
end Process;
|
285 |
|
|
|
286 |
|
|
begin
|
287 |
|
|
|
288 |
|
|
Output_Mode := Wide;
|
289 |
|
|
Process( Impdef.Wide_Character_Test );
|
290 |
|
|
|
291 |
|
|
Output_Mode := Narrow;
|
292 |
|
|
Process( Impdef.Upper_Latin_Test );
|
293 |
|
|
|
294 |
|
|
end WideChr;
|