| -- 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; |