macrosub.ada
来自「用于进行gcc测试」· ADA 代码 · 共 549 行 · 第 1/2 页
ADA
549 行
-- MACROSUB.ADA---- 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.--*--------------------------------------------------------------------------- ---- THIS PROGRAM IS CALLED MACROSUB. IT IS USED TO REPLACE THE ---- MACROS IN THE ACVC TEST SUITE WITH THEIR PROPER VALUES. THE ---- STEPS LISTED BELOW SHOULD BE FOLLOWED TO ENSURE PROPER RUNNING ---- OF THE MACROSUB PROGRAM: ---- ---- 1) Edit the file MACRO.DFS (included with the testtape) ---- and insert your macro values. The macros which use ---- the value of MAX_IN_LEN are calculated automatically ---- and do not need to be entered. ---- ---- 2) Create a file called TSTTESTS.DAT which includes all ---- of the .TST test file names and their directory ---- specifications, if necessary. If a different name ---- other than TSTTESTS.DAT is used, this name must be ---- substituted in the MACROSUB.ADA file. ---- ---- 3) Compile and link MACROSUB. ---- ---- 4) Run the MACROSUB program. ---- ---- WHEN THE PROGRAM FINISHES RUNNING, THE MACROS WILL HAVE BEEN ---- REPLACED WITH THE APPROPRIATE VALUES FROM MACRO.DFS. ---- ---- ---- ---- HISTORY: ---- BCB 04/17/90 CHANGED MODE OF CALC_MAX_VALS TO OUT. CHANGED ---- VALUE OF MAX_VAL_LENGTH FROM 512 TO 400. ADDED ---- EXCEPTION HANDLER SO PROGRAM DOES NOT CRASH IF ---- AN EXCEPTION IS RAISED. ADDED MESSAGES TO ---- REPORT PROGRESS OF PROGRAM. CHANGED PROGRAM SO ---- IT DOES NOT ABORT IF A FILE CANNOT BE FOUND. ---- MODIFIED PROGRAM SO IT ACCEPTS FILENAMES WITH ---- VERSION NUMBERS. -------------------------------------------------------------------------WITH TEXT_IO;USE TEXT_IO;PACKAGE DEFS IS------------------------------------------------------------------------- ---- THIS PACKAGE IS USED BY MACROSUB.ADA, PARSEMAC.ADA, AND BY ---- GETSUBS.ADA. THE PACKAGE CONTAINS VARIABLE DECLARATIONS WHICH ---- NEED TO BE KNOWN BY ALL OF THE PROCEDURES AND PACKAGES WHICH ---- MAKE UP THE PROGRAM. ---- ------------------------------------------------------------------------- MAX_VAL_LENGTH : CONSTANT INTEGER := 400; SUBTYPE VAL_STRING IS STRING (1..MAX_VAL_LENGTH); TYPE REC_TYPE IS RECORD MACRO_NAME : STRING (1..80); NAME_LENGTH, VALUE_LENGTH : INTEGER; MACRO_VALUE : VAL_STRING; END RECORD; TYPE TABLE_TYPE IS ARRAY (1..100) OF REC_TYPE; SYMBOL_TABLE : TABLE_TYPE; NUM_MACROS : INTEGER;END DEFS;WITH TEXT_IO;USE TEXT_IO;WITH DEFS;USE DEFS;PACKAGE GETSUBS IS-------------------------------------------------------------------------- ---- THIS PACKAGE IS USED BY MACROSUB.ADA FOR READING FROM MACRO.DFS ---- THE VALUES FOR THE MACRO SUBSTITUTIONS FOR A TEST TAPE. ---- -------------------------------------------------------------------------- MAC_FILE, LINE_LEN : EXCEPTION; PROCEDURE CALC_MAX_VALS(INDEX, LENGTH, MAX_IN_LEN : IN INTEGER; CALCULATED : OUT BOOLEAN); PROCEDURE FILL_TABLE;END GETSUBS;PACKAGE BODY GETSUBS IS------------------------------------------------------------------------- ---- PROCEDURE CALC_MAX_VALS CALCULATES THE VALUE FOR THE MACRO ---- READ FROM MACRO.DFS IF ITS LENGTH IS EQUAL OR NEARLY EQUAL TO ---- MAX_IN_LEN. IT THEN RETURNS A FLAG SET TO TRUE IF A VALUE WAS ---- CALCULATED, FALSE IF ONE WAS NOT. ---- ------------------------------------------------------------------------- PROCEDURE CALC_MAX_VALS(INDEX, LENGTH, MAX_IN_LEN : IN INTEGER; CALCULATED : OUT BOOLEAN) IS BEGIN IF SYMBOL_TABLE (INDEX).MACRO_NAME (1..LENGTH) = "BIG_ID1" THEN SYMBOL_TABLE (INDEX).MACRO_VALUE (1..MAX_IN_LEN) := (1..(MAX_IN_LEN-1) => 'A') & "1"; CALCULATED := TRUE; ELSIF SYMBOL_TABLE (INDEX).MACRO_NAME (1..LENGTH) = "BIG_ID2" THEN SYMBOL_TABLE (INDEX).MACRO_VALUE (1..MAX_IN_LEN) := (1..(MAX_IN_LEN-1) => 'A') & "2"; CALCULATED := TRUE; ELSIF SYMBOL_TABLE (INDEX).MACRO_NAME (1..LENGTH) = "BIG_ID3" THEN SYMBOL_TABLE (INDEX).MACRO_VALUE (1..MAX_IN_LEN) := (1..(MAX_IN_LEN + 1)/2 => 'A') & "3" & ((MAX_IN_LEN + 1)/2 + 2..MAX_IN_LEN => 'A'); CALCULATED := TRUE; ELSIF SYMBOL_TABLE (INDEX).MACRO_NAME (1..LENGTH) = "BIG_ID4" THEN SYMBOL_TABLE (INDEX).MACRO_VALUE (1..MAX_IN_LEN) := (1..(MAX_IN_LEN + 1)/2 => 'A') & "4" & ((MAX_IN_LEN + 1)/2 + 2..MAX_IN_LEN => 'A'); CALCULATED := TRUE; ELSIF SYMBOL_TABLE (INDEX).MACRO_NAME (1..LENGTH) = "BIG_STRING1" THEN SYMBOL_TABLE (INDEX).MACRO_VALUE (1..(MAX_IN_LEN + 1)/2 + 2) := '"' & (1..(MAX_IN_LEN + 1)/2 => 'A') & '"'; CALCULATED := TRUE; ELSIF SYMBOL_TABLE (INDEX).MACRO_NAME (1..LENGTH) = "BIG_STRING2" THEN SYMBOL_TABLE (INDEX).MACRO_VALUE (1..MAX_IN_LEN - (MAX_IN_LEN + 1)/2 + 2) := '"' & (2..MAX_IN_LEN - (MAX_IN_LEN + 1)/2 => 'A') & '1' & '"'; CALCULATED := TRUE; ELSIF SYMBOL_TABLE (INDEX).MACRO_NAME (1..LENGTH) = "MAX_STRING_LITERAL" THEN SYMBOL_TABLE (INDEX). MACRO_VALUE (1..MAX_IN_LEN) := '"' & (1..MAX_IN_LEN-2 => 'A') & '"'; CALCULATED := TRUE; ELSIF SYMBOL_TABLE (INDEX).MACRO_NAME (1..LENGTH) = "BIG_INT_LIT" THEN SYMBOL_TABLE (INDEX).MACRO_VALUE (1..MAX_IN_LEN) := (1..MAX_IN_LEN-3 => '0') & "298"; CALCULATED := TRUE; ELSIF SYMBOL_TABLE (INDEX).MACRO_NAME (1..LENGTH) = "BIG_REAL_LIT" THEN SYMBOL_TABLE (INDEX).MACRO_VALUE (1..MAX_IN_LEN) := (1..MAX_IN_LEN-5 => '0') & "690.0"; CALCULATED := TRUE; ELSIF SYMBOL_TABLE (INDEX).MACRO_NAME (1..LENGTH) = "MAX_LEN_INT_BASED_LITERAL" THEN SYMBOL_TABLE (INDEX). MACRO_VALUE (1..MAX_IN_LEN) := "2:" & (1..MAX_IN_LEN - 5 => '0') & "11:"; CALCULATED := TRUE; ELSIF SYMBOL_TABLE (INDEX).MACRO_NAME (1..LENGTH) = "MAX_LEN_REAL_BASED_LITERAL" THEN SYMBOL_TABLE (INDEX). MACRO_VALUE (1..MAX_IN_LEN) := "16:" & (1..MAX_IN_LEN - 7 => '0') & "F.E:"; CALCULATED := TRUE; ELSIF SYMBOL_TABLE (INDEX).MACRO_NAME (1..LENGTH) = "BLANKS" THEN SYMBOL_TABLE (INDEX).MACRO_VALUE (1..MAX_IN_LEN-20) := (1..MAX_IN_LEN-20 => ' '); CALCULATED := TRUE; ELSE CALCULATED := FALSE; END IF; IF SYMBOL_TABLE (INDEX).MACRO_NAME (1..LENGTH) = "BLANKS" THEN SYMBOL_TABLE (INDEX).VALUE_LENGTH := MAX_IN_LEN - 20; ELSIF SYMBOL_TABLE (INDEX).MACRO_NAME (1..LENGTH) = "BIG_STRING1" THEN SYMBOL_TABLE (INDEX).VALUE_LENGTH := (MAX_IN_LEN + 1)/2 + 2; ELSIF SYMBOL_TABLE (INDEX).MACRO_NAME (1..LENGTH) = "BIG_STRING2" THEN SYMBOL_TABLE (INDEX).VALUE_LENGTH := MAX_IN_LEN - (MAX_IN_LEN + 1)/2 + 2; ELSE SYMBOL_TABLE (INDEX).VALUE_LENGTH := MAX_IN_LEN; END IF; END CALC_MAX_VALS;------------------------------------------------------------------------- ---- PROCEDURE FILL_TABLE READS THE MACRO NAMES AND MACRO VALUES IN ---- FROM MACRO.DFS AND STORES THEM IN THE SYMBOL TABLE. PROCEDURE ---- CALC_MAX_VALS IS CALLED TO DETERMINE IF THE MACRO VALUE SHOULD ---- BE CALCULATED OR READ FROM MACRO.DFS. ---- ------------------------------------------------------------------------- PROCEDURE FILL_TABLE IS INFILE1 : FILE_TYPE; MACRO_FILE : CONSTANT STRING := "MACRO.DFS"; A_LINE : VAL_STRING; I, INDEX, LENGTH, HOLD, A_LENGTH, NAME : INTEGER; MAX_IN_LEN : INTEGER := 1; CALCULATED : BOOLEAN; BEGIN INDEX := 1; BEGIN OPEN (INFILE1, IN_FILE, MACRO_FILE); EXCEPTION WHEN NAME_ERROR => PUT_LINE ("** ERROR: MACRO FILE " & MACRO_FILE & " NOT FOUND."); RAISE MAC_FILE; END; WHILE NOT END_OF_FILE (INFILE1) LOOP GET_LINE (INFILE1, A_LINE, A_LENGTH); IF A_LENGTH > 0 AND A_LINE (1..2) /= "--" AND A_LINE (1) /= ' ' AND A_LINE (1) /= ASCII.HT THEN I := 1; WHILE I <= A_LENGTH AND THEN ((A_LINE (I) IN 'A'..'Z') OR (A_LINE (I) IN '0'..'9') OR A_LINE (I) = '_') LOOP I := I + 1; END LOOP; I := I - 1; LENGTH := I; BEGIN SYMBOL_TABLE (INDEX).MACRO_NAME (1..LENGTH) := A_LINE (1..I); EXCEPTION WHEN CONSTRAINT_ERROR => PUT_LINE ("** ERROR: LINE LENGTH IS " & "GREATER THAN MAX_VAL_LENGTH."); RAISE LINE_LEN; END; SYMBOL_TABLE (INDEX).NAME_LENGTH := I; CALC_MAX_VALS (INDEX, LENGTH, MAX_IN_LEN, CALCULATED); IF NOT CALCULATED THEN I := I + 1; WHILE A_LINE (I) = ' ' OR A_LINE (I) = ASCII.HT LOOP I := I + 1; IF SYMBOL_TABLE (INDEX).MACRO_NAME (1..LENGTH) = "BLANKS" THEN EXIT; END IF; END LOOP; HOLD := I;-- MACRO VALUE BEGINS AT POSITION HOLD.
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?