/* Example of a traceback program, by R. A. Vowels. */ TCEBAK: PROCEDURE OPTIONS (MAIN); DECLARE 1 Trace CONTROLLED EXTERNAL, 2 Name CHARACTER (31), 2 Place FIXED BINARY (31); ALLOCATE Trace; Name = PROCEDURENAME (); CALL P (SOURCELINE () ); FREE Trace; P: PROCEDURE (Where); DECLARE Where FIXED BINARY (31); ALLOCATE Trace; Name = PROCEDURENAME (); Place = Where; CALL Q (SOURCELINE() ); FREE Trace; END P; Q: PROCEDURE (Where); DECLARE Where FIXED BINARY (31); ALLOCATE Trace; Name = PROCEDURENAME (); Place = Where; CALL TRACEBACK; CALL TRACEBACK; FREE Trace; END Q; TRACEBACK: PROCEDURE; DECLARE 1 Trace_History (ALLOCATION(Trace)), 2 Name CHARACTER (31), 2 Place FIXED BINARY (31); DECLARE J FIXED BINARY; DO J = 1 TO ALLOCATION (Trace); Trace_History(J) = Trace; /* Save the history. */ PUT SKIP EDIT ('Procedure ', TRIM(Trace.Name)) (A); IF ALLOCATION(Trace) ^= 1 THEN PUT EDIT (' was called from line ', TRIM (Trace.Place), ' in ...') (A); FREE Trace; END; /* Restore the traceback history. */ DO J = HBOUND(Trace_History, 1) TO 1 BY -1; ALLOCATE Trace; Trace = Trace_History(J); END; END TRACEBACK; END TCEBAK;