-- REPBODY.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. --* -- -- HISTORY: -- DCB 04/27/80 -- JRK 6/10/80 -- JRK 11/12/80 -- JRK 8/6/81 -- JRK 10/27/82 -- JRK 6/1/84 -- JRK 11/18/85 ADDED PRAGMA ELABORATE. -- PWB 07/29/87 ADDED STATUS ACTION_REQUIRED AND -- PROCEDURE SPECIAL_ACTION. -- TBN 08/20/87 ADDED FUNCTION LEGAL_FILE_NAME. -- BCB 05/17/90 MODIFIED TO ALLOW OUTPUT TO DIRECT_IO FILE. -- ADDED TIME-STAMP. -- LDC 05/17/90 REMOVED OUTPUT TO DIRECT_IO FILE. -- WMC 08/11/92 UPDATED ACVC VERSION STRING TO "9X BASIC". -- DTN 07/05/92 UPDATED ACVC VERSION STRING TO -- "ACVC 2.0 JULY 6 1993 DRAFT". -- WMC 01/24/94 MODIFIED LEGAL_FILE_NAME TO ALLOW FIVE POSSIBLE -- FILE NAMES (INCREASED RANGE OF TYPE FILE_NUM TO 1..5). -- WMC 11/06/94 UPDATED ACVC VERSION STRING TO -- "ACVC 2.0 NOVEMBER 6 1994 DRAFT". -- DTN 12/04/94 UPDATED ACVC VERSION STRING TO -- "ACVC 2.0". -- KAS 06/19/95 ADDED FUNCTION IDENT_WIDE_CHAR. -- KAS 06/19/95 ADDED FUNCTION IDENT_WIDE_STR. -- DTN 11/21/95 UPDATED ACVC VERSION STRING TO -- "ACVC 2.0.1". -- DTN 12/14/95 UPDATED ACVC VERSION STRING TO -- "ACVC 2.1". -- EDS 12/17/97 UPDATED ACVC VERSION STRING TO -- "2.2". -- RLB 3/16/00 UPDATED ACATS VERSION STRING TO "2.3". -- CHANGED VARIOUS STRINGS TO READ "ACATS". -- RLB 3/22/01 UPDATED ACATS VERSION STRING TO "2.4". WITH TEXT_IO, CALENDAR; USE TEXT_IO, CALENDAR; PRAGMA ELABORATE (TEXT_IO, CALENDAR); PACKAGE BODY REPORT IS TYPE STATUS IS (PASS, FAIL, DOES_NOT_APPLY, ACTION_REQUIRED, UNKNOWN); TYPE TIME_INTEGER IS RANGE 0 .. 86_400; TEST_STATUS : STATUS := FAIL; MAX_NAME_LEN : CONSTANT := 15; -- MAXIMUM TEST NAME LENGTH. TEST_NAME : STRING (1..MAX_NAME_LEN); NO_NAME : CONSTANT STRING (1..7) := "NO_NAME"; TEST_NAME_LEN : INTEGER RANGE 0..MAX_NAME_LEN := 0; ACATS_VERSION : CONSTANT STRING := "2.4"; -- VERSION OF ACATS BEING RUN (X.XX). PROCEDURE PUT_MSG (MSG : STRING) IS -- WRITE MESSAGE. LONG MESSAGES ARE FOLDED (AND INDENTED). MAX_LEN : CONSTANT INTEGER RANGE 50..150 := 72; -- MAXIMUM -- OUTPUT LINE LENGTH. INDENT : CONSTANT INTEGER := TEST_NAME_LEN + 9; -- AMOUNT TO -- INDENT CONTINUATION LINES. I : INTEGER := 0; -- CURRENT INDENTATION. M : INTEGER := MSG'FIRST; -- START OF MESSAGE SLICE. N : INTEGER; -- END OF MESSAGE SLICE. BEGIN LOOP IF I + (MSG'LAST-M+1) > MAX_LEN THEN N := M + (MAX_LEN-I) - 1; IF MSG (N) /= ' ' THEN WHILE N >= M AND THEN MSG (N+1) /= ' ' LOOP N := N - 1; END LOOP; IF N < M THEN N := M + (MAX_LEN-I) - 1; END IF; END IF; ELSE N := MSG'LAST; END IF; SET_COL (STANDARD_OUTPUT, TEXT_IO.COUNT (I+1)); PUT_LINE (STANDARD_OUTPUT, MSG (M..N)); I := INDENT; M := N + 1; WHILE M <= MSG'LAST AND THEN MSG (M) = ' ' LOOP M := M + 1; END LOOP; EXIT WHEN M > MSG'LAST; END LOOP; END PUT_MSG; FUNCTION TIME_STAMP RETURN STRING IS TIME_NOW : CALENDAR.TIME; YEAR, MONTH, DAY, HOUR, MINUTE, SECOND : TIME_INTEGER := 1; FUNCTION CONVERT (NUMBER : TIME_INTEGER) RETURN STRING IS STR : STRING (1..2) := (OTHERS => '0'); DEC_DIGIT : CONSTANT STRING := "0123456789"; NUM : TIME_INTEGER := NUMBER; BEGIN IF NUM = 0 THEN RETURN STR; ELSE NUM := NUM MOD 100; STR (2) := DEC_DIGIT (INTEGER (NUM MOD 10 + 1)); NUM := NUM / 10; STR (1) := DEC_DIGIT (INTEGER (NUM + 1)); RETURN STR; END IF; END CONVERT; BEGIN TIME_NOW := CALENDAR.CLOCK; SPLIT (TIME_NOW, YEAR_NUMBER (YEAR), MONTH_NUMBER (MONTH), DAY_NUMBER (DAY), DAY_DURATION (SECOND)); HOUR := SECOND / 3600; SECOND := SECOND MOD 3600; MINUTE := SECOND / 60; SECOND := SECOND MOD 60; RETURN (CONVERT (TIME_INTEGER (YEAR)) & "-" & CONVERT (TIME_INTEGER (MONTH)) & "-" & CONVERT (TIME_INTEGER (DAY)) & " " & CONVERT (TIME_INTEGER (HOUR)) & ":" & CONVERT (TIME_INTEGER (MINUTE)) & ":" & CONVERT (TIME_INTEGER (SECOND))); END TIME_STAMP; PROCEDURE TEST (NAME : STRING; DESCR : STRING) IS BEGIN TEST_STATUS := PASS; IF NAME'LENGTH <= MAX_NAME_LEN THEN TEST_NAME_LEN := NAME'LENGTH; ELSE TEST_NAME_LEN := MAX_NAME_LEN; END IF; TEST_NAME (1..TEST_NAME_LEN) := NAME (NAME'FIRST .. NAME'FIRST+TEST_NAME_LEN-1); PUT_MSG (""); PUT_MSG (",.,. " & TEST_NAME (1..TEST_NAME_LEN) & " " & "ACATS " & ACATS_VERSION & " " & TIME_STAMP); PUT_MSG ("---- " & TEST_NAME (1..TEST_NAME_LEN) & " " & DESCR & "."); END TEST; PROCEDURE COMMENT (DESCR : STRING) IS BEGIN PUT_MSG (" - " & TEST_NAME (1..TEST_NAME_LEN) & " " & DESCR & "."); END COMMENT; PROCEDURE FAILED (DESCR : STRING) IS BEGIN TEST_STATUS := FAIL; PUT_MSG (" * " & TEST_NAME (1..TEST_NAME_LEN) & " " & DESCR & "."); END FAILED; PROCEDURE NOT_APPLICABLE (DESCR : STRING) IS BEGIN IF TEST_STATUS = PASS OR TEST_STATUS = ACTION_REQUIRED THEN TEST_STATUS := DOES_NOT_APPLY; END IF; PUT_MSG (" + " & TEST_NAME (1..TEST_NAME_LEN) & " " & DESCR & "."); END NOT_APPLICABLE; PROCEDURE SPECIAL_ACTION (DESCR : STRING) IS BEGIN IF TEST_STATUS = PASS THEN TEST_STATUS := ACTION_REQUIRED; END IF; PUT_MSG (" ! " & TEST_NAME (1..TEST_NAME_LEN) & " " & DESCR & "."); END SPECIAL_ACTION; PROCEDURE RESULT IS BEGIN CASE TEST_STATUS IS WHEN PASS => PUT_MSG ("==== " & TEST_NAME (1..TEST_NAME_LEN) & " PASSED ============================."); WHEN DOES_NOT_APPLY => PUT_MSG ("++++ " & TEST_NAME (1..TEST_NAME_LEN) & " NOT-APPLICABLE ++++++++++++++++++++."); WHEN ACTION_REQUIRED => PUT_MSG ("!!!! " & TEST_NAME (1..TEST_NAME_LEN) & " TENTATIVELY PASSED !!!!!!!!!!!!!!!!."); PUT_MSG ("!!!! " & (1..TEST_NAME_LEN => ' ') & " SEE '!' COMMENTS FOR SPECIAL NOTES!!"); WHEN OTHERS => PUT_MSG ("**** " & TEST_NAME (1..TEST_NAME_LEN) & " FAILED ****************************."); END CASE; TEST_STATUS := FAIL; TEST_NAME_LEN := NO_NAME'LENGTH; TEST_NAME (1..TEST_NAME_LEN) := NO_NAME; END RESULT; FUNCTION IDENT_INT (X : INTEGER) RETURN INTEGER IS BEGIN IF EQUAL (X, X) THEN -- ALWAYS EQUAL. RETURN X; -- ALWAYS EXECUTED. END IF; RETURN 0; -- NEVER EXECUTED. END IDENT_INT; FUNCTION IDENT_CHAR (X : CHARACTER) RETURN CHARACTER IS BEGIN IF EQUAL (CHARACTER'POS(X), CHARACTER'POS(X)) THEN -- ALWAYS -- EQUAL. RETURN X; -- ALWAYS EXECUTED. END IF; RETURN '0'; -- NEVER EXECUTED. END IDENT_CHAR; FUNCTION IDENT_WIDE_CHAR (X : WIDE_CHARACTER) RETURN WIDE_CHARACTER IS BEGIN IF EQUAL (WIDE_CHARACTER'POS(X), WIDE_CHARACTER'POS(X)) THEN -- ALWAYS EQUAL. RETURN X; -- ALWAYS EXECUTED. END IF; RETURN '0'; -- NEVER EXECUTED. END IDENT_WIDE_CHAR; FUNCTION IDENT_BOOL (X : BOOLEAN) RETURN BOOLEAN IS BEGIN IF EQUAL (BOOLEAN'POS(X), BOOLEAN'POS(X)) THEN -- ALWAYS -- EQUAL. RETURN X; -- ALWAYS EXECUTED. END IF; RETURN FALSE; -- NEVER EXECUTED. END IDENT_BOOL; FUNCTION IDENT_STR (X : STRING) RETURN STRING IS BEGIN IF EQUAL (X'LENGTH, X'LENGTH) THEN -- ALWAYS EQUAL. RETURN X; -- ALWAYS EXECUTED. END IF; RETURN ""; -- NEVER EXECUTED. END IDENT_STR; FUNCTION IDENT_WIDE_STR (X : WIDE_STRING) RETURN WIDE_STRING IS BEGIN IF EQUAL (X'LENGTH, X'LENGTH) THEN -- ALWAYS EQUAL. RETURN X; -- ALWAYS EXECUTED. END IF; RETURN ""; -- NEVER EXECUTED. END IDENT_WIDE_STR; FUNCTION EQUAL (X, Y : INTEGER) RETURN BOOLEAN IS REC_LIMIT : CONSTANT INTEGER RANGE 1..100 := 3; -- RECURSION -- LIMIT. Z : BOOLEAN; -- RESULT. BEGIN IF X < 0 THEN IF Y < 0 THEN Z := EQUAL (-X, -Y); ELSE Z := FALSE; END IF; ELSIF X > REC_LIMIT THEN Z := EQUAL (REC_LIMIT, Y-X+REC_LIMIT); ELSIF X > 0 THEN Z := EQUAL (X-1, Y-1); ELSE Z := Y = 0; END IF; RETURN Z; EXCEPTION WHEN OTHERS => RETURN X = Y; END EQUAL; FUNCTION LEGAL_FILE_NAME (X : FILE_NUM := 1; NAM : STRING := "") RETURN STRING IS SUFFIX : STRING (2..6); BEGIN IF NAM = "" THEN SUFFIX := TEST_NAME(3..7); ELSE SUFFIX := NAM(3..7); END IF; CASE X IS WHEN 1 => RETURN ('X' & SUFFIX); WHEN 2 => RETURN ('Y' & SUFFIX); WHEN 3 => RETURN ('Z' & SUFFIX); WHEN 4 => RETURN ('V' & SUFFIX); WHEN 5 => RETURN ('W' & SUFFIX); END CASE; END LEGAL_FILE_NAME; BEGIN TEST_NAME_LEN := NO_NAME'LENGTH; TEST_NAME (1..TEST_NAME_LEN) := NO_NAME; END REPORT;