blob: 2eac588b890bf71ea007138e799b1693a47616d2 [file] [log] [blame]
-- WIDECHR.A
--
-- Grant of Unlimited Rights
--
-- Under contracts F33600-87-D-0337, F33600-84-D-0280, MDA903-79-C-0687,
-- F08630-91-C-0015, and DCA100-97-D-0025, the U.S. Government obtained
-- unlimited rights in the software and documentation contained herein.
-- Unlimited rights are defined in DFAR 252.227-7013(a)(19). By making
-- this public release, the Government intends to confer upon all
-- recipients unlimited rights equal to those held by the Government.
-- These rights include rights to use, duplicate, release or disclose the
-- released technical data and computer software in whole or in part, in
-- any manner and for any purpose whatsoever, and to have or permit others
-- to do so.
--
-- DISCLAIMER
--
-- ALL MATERIALS OR INFORMATION HEREIN RELEASED, MADE AVAILABLE OR
-- DISCLOSED ARE AS IS. THE GOVERNMENT MAKES NO EXPRESS OR IMPLIED
-- WARRANTY AS TO ANY MATTER WHATSOEVER, INCLUDING THE CONDITIONS OF THE
-- SOFTWARE, DOCUMENTATION OR OTHER INFORMATION RELEASED, MADE AVAILABLE
-- OR DISCLOSED, OR THE OWNERSHIP, MERCHANTABILITY, OR FITNESS FOR A
-- PARTICULAR PURPOSE OF SAID MATERIAL.
--*
--
-- DESCRIPTION:
--
-- This program reads C250001.AW and C250002.AW; translates a special
-- character sequence into characters and wide characters with positions
-- above ASCII.DEL. The resulting tests are written as C250001.A and
-- C250002.A respectively. This program may need to
-- be modified if the Wide_Character representation recognized by
-- your compiler differs from the Wide_Character
-- representation generated by the package Ada.Wide_Text_IO.
-- Modify this program as needed to translate that file.
--
-- A wide character is represented by an 8 character sequence:
--
-- ["abcd"]
--
-- where the character code represented is specified by four hexadecimal
-- digits, abcd, with letters in upper case. For example the wide
-- character with the code 16#AB13# is represented by the eight
-- character sequence:
--
-- ["AB13"]
--
-- ASSUMPTIONS:
--
-- The path for these files is specified in ImpDef.
--
-- SPECIAL REQUIREMENTS:
--
-- Compile, bind and execute this program. It will process the ".AW"
-- tests, "translating" them to ".A" tests.
--
-- CHANGE HISTORY:
-- 11 DEC 96 SAIC ACVC 2.1 Release
--
-- 11 DEC 96 Keith Constructed initial release version
--!
with Ada.Text_IO;
with Ada.Wide_Text_IO;
with Ada.Strings.Fixed;
with Impdef;
procedure WideChr is
-- Debug
--
-- To have the program generate trace/debugging information, de-comment
-- the call to Put_Line
procedure Debug( S: String ) is
begin
null; -- Ada.Text_IO.Put_Line(S);
end Debug;
package TIO renames Ada.Text_IO;
package WIO renames Ada.Wide_Text_IO;
package SF renames Ada.Strings.Fixed;
In_File : TIO.File_Type;
-- This program is actually dual-purpose. It translates the ["xxxx"]
-- notation to Wide_Character, as well as a similar notation ["xx"] into
-- Character. The intent of the latter being the ability to represent
-- literals in the Latin-1 character set that have position numbers
-- greater than ASCII.DEL. The variable Output_Mode drives the algorithms
-- to generate Wide_Character output (Wide) or Character output (Narrow).
type Output_Modes is ( Wide, Narrow );
Output_Mode : Output_Modes := Wide;
Wide_Out : WIO.File_Type;
Narrow_Out : TIO.File_Type;
In_Line : String(1..132); -- SB: $MAX_LINE_LENGTH
-- Index variables
--
-- the following index variables: In_Length, Front, Open_Bracket and
-- Close_Bracket are used by the scanning software to keep track of
-- what's where.
--
-- In_Length stores the value returned by Ada.Text_IO.Get_Line indicating
-- the position of the last "useful" character in the string In_Line.
--
-- Front retains the index of the first non-translating character in
-- In_Line, it is used to indicate the starting index of the portion of
-- the string to save without special interpretation. In the example
-- below, where there are two consecutive characters to translate, we see
-- that Front will assume three different values processing the string,
-- these are indicated by the digits '1', '2' & '3' in the comment
-- attached to the declaration. The processing software will dump
-- In_Line(Front..Open_Bracket-1) to the output stream. Note that in
-- the second case, this results in a null string, and in the third case,
-- where Open_Bracket does not obtain a third value, the slice
-- In_Line(Front..In_Length) is used instead.
--
-- Open_Bracket and Close_Bracket are used to retain the starting index
-- of the character pairs [" and "] respectively. For the purposes of
-- this software the character pairs are what are considered to be the
-- "brackets" enclosing the hexadecimal values to be translated.
-- Looking at the example below you will see where these index variables
-- will "point" in the first and second case.
In_Length : Natural := 0; ---> Some_["0A12"]["0B13"]_Thing
Front : Natural := 0; -- 1 2 3
Open_Bracket : Natural := 0; -- 1 2
Close_Bracket : Natural := 0; -- 1 2
-- Xlation
--
-- This translation table gives an easy way to translate the "decimal"
-- value of a hex digit (as represented by a Latin-1 character)
type Xlate is array(Character range '0'..'F') of Natural;
Xlation : constant Xlate :=
('0' => 0, '1' => 1, '2' => 2, '3' => 3, '4' => 4,
'5' => 5, '6' => 6, '7' => 7, '8' => 8, '9' => 9,
'A' => 10, 'B' => 11, 'C' => 12, 'D' => 13, 'E' => 14,
'F' => 15,
others => 0);
-- To_Ch
--
-- This function takes a string which is assumed to be trimmed to just a
-- hexadecimal representation of a Latin-1 character. The result of the
-- function is the Latin-1 character at the position designated by the
-- incoming hexadecimal value. (hexadecimal in human readable form)
function To_Ch( S:String ) return Character is
Numerical : Natural := 0;
begin
Debug("To Wide: " & S);
for I in S'Range loop
Numerical := Numerical * 16 + Xlation(S(I));
end loop;
return Character'Val(Numerical);
exception
when Constraint_Error => return '_';
end To_Ch;
-- To_Wide
--
-- This function takes a string which is assumed to be trimmed to just a
-- hexadecimal representation of a Wide_character. The result of the
-- function is the Wide_character at the position designated by the
-- incoming hexadecimal value. (hexadecimal in human readable form)
function To_Wide( S:String ) return Wide_character is
Numerical : Natural := 0;
begin
Debug("To Wide: " & S);
for I in S'Range loop
Numerical := Numerical * 16 + Xlation(S(I));
end loop;
return Wide_Character'Val(Numerical);
exception
when Constraint_Error => return '_';
end To_Wide;
-- Make_Wide
--
-- this function converts a String to a Wide_String
function Make_Wide( S: String ) return Wide_String is
W: Wide_String(S'Range);
begin
for I in S'Range loop
W(I) := Wide_Character'Val( Character'Pos(S(I)) );
end loop;
return W;
end Make_Wide;
-- Close_Files
--
-- Depending on which input we've processed, close the output file
procedure Close_Files is
begin
TIO.Close(In_File);
if Output_Mode = Wide then
WIO.Close(Wide_Out);
else
TIO.Close(Narrow_Out);
end if;
end Close_Files;
-- Process
--
-- for all lines in the input file
-- scan the file for occurrences of [" and "]
-- for found occurrence, attempt translation of the characters found
-- between the brackets. As a safeguard, unrecognizable character
-- sequences will be replaced with the underscore character. This
-- handles the cases in the tests where the test documentation includes
-- examples that are non-conformant: i.e. ["abcd"] or ["XXXX"]
procedure Process( Input_File_Name: String ) is
begin
TIO.Open(In_File,TIO.In_File,Input_File_Name & ".aw" );
if Output_Mode = Wide then
WIO.Create(Wide_Out,WIO.Out_File, Input_File_Name & ".a" );
else
TIO.Create(Narrow_Out,TIO.Out_File, Input_File_Name & ".a" );
end if;
File: while not TIO.End_Of_File( In_File ) loop
In_Line := (others => ' ');
TIO.Get_Line(In_File,In_Line,In_Length);
Debug(In_Line(1..In_Length));
Front := 1;
Line: loop
-- scan for next occurrence of ["abcd"]
Open_Bracket := SF.Index( In_Line(Front..In_Length), "[""" );
Close_Bracket := SF.Index( In_Line(Front..In_Length), """]" );
Debug( "[=" & Natural'Image(Open_Bracket) );
Debug( "]=" & Natural'Image(Close_Bracket) );
if Open_Bracket = 0 or Close_Bracket = 0 then
-- done with the line, output remaining characters and exit
Debug("Done with line");
if Output_Mode = Wide then
WIO.Put_Line(Wide_Out, Make_Wide(In_Line(Front..In_Length)) );
else
TIO.Put_Line(Narrow_Out, In_Line(Front..In_Length) );
end if;
exit Line;
else
-- output the "normal" stuff up to the bracket
if Output_Mode = Wide then
WIO.Put(Wide_Out, Make_Wide(In_Line(Front..Open_Bracket-1)) );
else
TIO.Put(Narrow_Out, In_Line(Front..Open_Bracket-1) );
end if;
-- point beyond the closing bracket
Front := Close_Bracket +2;
-- output the translated hexadecimal character
if Output_Mode = Wide then
WIO.Put(Wide_Out,
To_Wide( In_Line(Open_Bracket+2..Close_Bracket-1) ));
else
TIO.Put(Narrow_Out,
To_Ch( In_Line(Open_Bracket+2..Close_Bracket-1)) );
end if;
end if;
end loop Line;
end loop File;
Close_Files;
exception
when others =>
Ada.Text_IO.Put_Line("Error in processing " & Input_File_Name);
raise;
end Process;
begin
Output_Mode := Wide;
Process( Impdef.Wide_Character_Test );
Output_Mode := Narrow;
Process( Impdef.Upper_Latin_Test );
end WideChr;