blob: ccb0a2a0e77ebb60fc73fc73e85f46ccf2bf1c8a [file] [log] [blame]
-- C64005C.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.
--*
-- CHECK THAT NESTED SUBPROGRAMS CAN BE CALLED RECURSIVELY AND THAT
-- NON-LOCAL VARIABLES AND FORMAL PARAMETERS ARE PROPERLY ACCESSED FROM
-- WITHIN RECURSIVE INVOCATIONS. THIS TEST CHECKS THAT EVERY DISPLAY OR
-- STATIC CHAIN LEVEL CAN BE ACCESSED.
-- THIS TEST USES 3 LEVELS OF NESTED RECURSIVE PROCEDURES.
-- JRK 7/26/84
WITH REPORT; USE REPORT;
PROCEDURE C64005C IS
SUBTYPE LEVEL IS CHARACTER RANGE 'A' .. 'C';
SUBTYPE CALL IS CHARACTER RANGE '1' .. '3';
MAX_LEV : CONSTANT := LEVEL'POS (LEVEL'LAST) -
LEVEL'POS (LEVEL'FIRST) + 1;
T_LEN : CONSTANT := 2 * (1 + 3 * (MAX_LEV +
MAX_LEV*(MAX_LEV+1)/2*2)) + 1;
G_LEN : CONSTANT := 2 + 4 * MAX_LEV;
TYPE TRACE IS
RECORD
E : NATURAL := 0;
S : STRING (1 .. T_LEN);
END RECORD;
V : CHARACTER := IDENT_CHAR ('<');
L : CHARACTER := IDENT_CHAR ('>');
T : TRACE;
G : STRING (1 .. G_LEN);
PROCEDURE C64005CA (L : LEVEL; C : CALL; T : IN OUT TRACE) IS
V : STRING (1..2);
M : CONSTANT NATURAL := LEVEL'POS (L) -
LEVEL'POS (LEVEL'FIRST) + 1;
N : CONSTANT NATURAL := 2 * M + 1;
PROCEDURE C64005CB (L : LEVEL; C : CALL; T : IN OUT TRACE) IS
V : STRING (1..2);
M : CONSTANT NATURAL := LEVEL'POS (L) -
LEVEL'POS (LEVEL'FIRST) + 1;
N : CONSTANT NATURAL := 2 * M + 1;
PROCEDURE C64005CC (L : LEVEL; C : CALL;
T : IN OUT TRACE) IS
V : STRING (1..2);
M : CONSTANT NATURAL := LEVEL'POS (L) -
LEVEL'POS (LEVEL'FIRST) + 1;
N : CONSTANT NATURAL := 2 * M + 1;
BEGIN
V (1) := IDENT_CHAR (ASCII.LC_C);
V (2) := C;
-- APPEND ALL V TO T.
T.S (T.E+1 .. T.E+N) := C64005C.V & C64005CA.V &
C64005CB.V & C64005CC.V;
T.E := T.E + N;
CASE C IS
WHEN '1' =>
C64005CA (IDENT_CHAR(LEVEL'FIRST),
IDENT_CHAR('2'), T);
WHEN '2' =>
C64005CC (L, IDENT_CHAR('3'), T);
WHEN '3' =>
-- APPEND MID-POINT SYMBOL TO T.
T.S (T.E+1) := IDENT_CHAR ('=');
T.E := T.E + 1;
-- G := CATENATE ALL V, L, C;
G := C64005C.V & C64005C.L &
C64005CA.V & C64005CA.L & C64005CA.C &
C64005CB.V & C64005CB.L & C64005CB.C &
C64005CC.V & C64005CC.L & C64005CC.C;
END CASE;
-- APPEND ALL L AND C TO T IN REVERSE ORDER.
T.S (T.E+1 .. T.E+N) := C64005CC.L & C64005CC.C &
C64005CB.L & C64005CB.C &
C64005CA.L & C64005CA.C &
C64005C.L;
T.E := T.E + N;
END C64005CC;
BEGIN
V (1) := IDENT_CHAR (ASCII.LC_B);
V (2) := C;
-- APPEND ALL V TO T.
T.S (T.E+1 .. T.E+N) := C64005C.V & C64005CA.V &
C64005CB.V;
T.E := T.E + N;
CASE C IS
WHEN '1' =>
C64005CC (LEVEL'SUCC(L), IDENT_CHAR('1'), T);
WHEN '2' =>
C64005CB (L, IDENT_CHAR('3'), T);
WHEN '3' =>
C64005CC (LEVEL'SUCC(L), IDENT_CHAR('2'), T);
END CASE;
-- APPEND ALL L AND C TO T IN REVERSE ORDER.
T.S (T.E+1 .. T.E+N) := C64005CB.L & C64005CB.C &
C64005CA.L & C64005CA.C &
C64005C.L;
T.E := T.E + N;
END C64005CB;
BEGIN
V (1) := IDENT_CHAR (ASCII.LC_A);
V (2) := C;
-- APPEND ALL V TO T.
T.S (T.E+1 .. T.E+N) := C64005C.V & C64005CA.V;
T.E := T.E + N;
CASE C IS
WHEN '1' =>
C64005CB (LEVEL'SUCC(L), IDENT_CHAR('1'), T);
WHEN '2' =>
C64005CA (L, IDENT_CHAR('3'), T);
WHEN '3' =>
C64005CB (LEVEL'SUCC(L), IDENT_CHAR('2'), T);
END CASE;
-- APPEND ALL L AND C TO T IN REVERSE ORDER.
T.S (T.E+1 .. T.E+N) := C64005CA.L & C64005CA.C & C64005C.L;
T.E := T.E + N;
END C64005CA;
BEGIN
TEST ("C64005C", "CHECK THAT NON-LOCAL VARIABLES AND FORMAL " &
"PARAMETERS AT ALL LEVELS OF NESTED " &
"RECURSIVE PROCEDURES ARE ACCESSIBLE");
-- APPEND V TO T.
T.S (T.E+1) := V;
T.E := T.E + 1;
C64005CA (IDENT_CHAR(LEVEL'FIRST), IDENT_CHAR('1'), T);
-- APPEND L TO T.
T.S (T.E+1) := L;
T.E := T.E + 1;
COMMENT ("FINAL CALL TRACE LENGTH IS: " & INTEGER'IMAGE(T.E));
COMMENT ("FINAL CALL TRACE IS: " & T.S(1..T.E));
COMMENT ("GLOBAL SNAPSHOT IS: " & G);
-- CHECK THAT T AND G ARE CORRECT BY COMPUTING THEM ITERATIVELY.
DECLARE
SUBTYPE LC_LEVEL IS CHARACTER RANGE ASCII.LC_A ..
CHARACTER'VAL (CHARACTER'POS(ASCII.LC_A) + MAX_LEV - 1);
CT : TRACE;
CG : STRING (1 .. G_LEN);
BEGIN
COMMENT ("CORRECT FINAL CALL TRACE LENGTH IS: " &
INTEGER'IMAGE(T_LEN));
IF T.E /= IDENT_INT (T_LEN) THEN
FAILED ("WRONG FINAL CALL TRACE LENGTH");
ELSE CT.S (CT.E+1) := '<';
CT.E := CT.E + 1;
FOR I IN LC_LEVEL LOOP
CT.S (CT.E+1) := '<';
CT.E := CT.E + 1;
FOR J IN LC_LEVEL'FIRST .. I LOOP
CT.S (CT.E+1) := J;
CT.S (CT.E+2) := '1';
CT.E := CT.E + 2;
END LOOP;
END LOOP;
FOR I IN LC_LEVEL LOOP
CT.S (CT.E+1) := '<';
CT.E := CT.E + 1;
FOR J IN LC_LEVEL'FIRST .. LC_LEVEL'PRED(I) LOOP
CT.S (CT.E+1) := J;
CT.S (CT.E+2) := '3';
CT.E := CT.E + 2;
END LOOP;
CT.S (CT.E+1) := I;
CT.S (CT.E+2) := '2';
CT.E := CT.E + 2;
CT.S (CT.E+1) := '<';
CT.E := CT.E + 1;
FOR J IN LC_LEVEL'FIRST .. I LOOP
CT.S (CT.E+1) := J;
CT.S (CT.E+2) := '3';
CT.E := CT.E + 2;
END LOOP;
END LOOP;
CT.S (CT.E+1) := '=';
CT.E := CT.E + 1;
FOR I IN REVERSE LEVEL LOOP
FOR J IN REVERSE LEVEL'FIRST .. I LOOP
CT.S (CT.E+1) := J;
CT.S (CT.E+2) := '3';
CT.E := CT.E + 2;
END LOOP;
CT.S (CT.E+1) := '>';
CT.E := CT.E + 1;
CT.S (CT.E+1) := I;
CT.S (CT.E+2) := '2';
CT.E := CT.E + 2;
FOR J IN REVERSE LEVEL'FIRST .. LEVEL'PRED(I) LOOP
CT.S (CT.E+1) := J;
CT.S (CT.E+2) := '3';
CT.E := CT.E + 2;
END LOOP;
CT.S (CT.E+1) := '>';
CT.E := CT.E + 1;
END LOOP;
FOR I IN REVERSE LEVEL LOOP
FOR J IN REVERSE LEVEL'FIRST .. I LOOP
CT.S (CT.E+1) := J;
CT.S (CT.E+2) := '1';
CT.E := CT.E + 2;
END LOOP;
CT.S (CT.E+1) := '>';
CT.E := CT.E + 1;
END LOOP;
CT.S (CT.E+1) := '>';
CT.E := CT.E + 1;
IF CT.E /= IDENT_INT (T_LEN) THEN
FAILED ("WRONG ITERATIVE TRACE LENGTH");
ELSE COMMENT ("CORRECT FINAL CALL TRACE IS: " & CT.S);
IF T.S /= CT.S THEN
FAILED ("WRONG FINAL CALL TRACE");
END IF;
END IF;
END IF;
DECLARE
E : NATURAL := 0;
BEGIN
CG (1..2) := "<>";
E := E + 2;
FOR I IN LEVEL LOOP
CG (E+1) := LC_LEVEL'VAL (LEVEL'POS(I) -
LEVEL'POS(LEVEL'FIRST) +
LC_LEVEL'POS
(LC_LEVEL'FIRST));
CG (E+2) := '3';
CG (E+3) := I;
CG (E+4) := '3';
E := E + 4;
END LOOP;
COMMENT ("CORRECT GLOBAL SNAPSHOT IS: " & CG);
IF G /= CG THEN
FAILED ("WRONG GLOBAL SNAPSHOT");
END IF;
END;
END;
RESULT;
END C64005C;