Trailing-Edge
-
PDP-10 Archives
-
decuslib20-03
-
decus/20-0078/libsim/zimset.sim
There is 1 other file named zimset.sim in the archive. Click here to see a list.
OPTIONS(/E/C/-W);
EXTERNAL TEXT PROCEDURE upcase,conc,today,daytime;
CLASS zimset;
!;PROTECTED traceon_zimset,traceoff_zimset;
!;HIDDEN PROTECTED trace;
!;VIRTUAL: TEXT PROCEDURE now;
BEGIN
CLASS linkage;
PROTECTED i_suc,i_pred;
VIRTUAL: TEXT PROCEDURE title;
BEGIN
REF (linkage) i_suc,i_pred;
TEXT PROCEDURE title;;
REF (link) PROCEDURE suc;
IF i_suc IN link THEN suc:- i_suc;
REF (link) PROCEDURE pred;
IF i_pred IN link THEN pred:- i_pred;
REF (linkage) PROCEDURE prev;
prev:- i_pred;
END of linkage;
linkage CLASS link;
HIDDEN i_suc,i_pred;
BEGIN
REF (Head) PROCEDURE sethead;
! Test if last;
INSPECT i_suc WHEN head DO
sethead:- THIS head
OTHERWISE ! Move forward;
BEGIN REF (linkage) x;
x:- THIS link.i_pred;
WHILE x IN link DO x:- x.i_pred;
INSPECT x WHEN head DO
sethead:- THIS head;
END of sethead;
PROCEDURE out;
IF i_suc =/= NONE THEN
BEGIN
!; TEXT t;
!; t:- title;
!; IF (IF trace[1] THEN t =/= NOTEXT ELSE FALSE) THEN
!; report(' ',t,conc(" Leaving Set ",sethead.title));
i_suc.i_pred:- i_pred;
i_pred.i_suc:- i_suc;
i_suc:- i_pred:- NONE
END of out;
PROCEDURE follow(x); REF (linkage) x;
BEGIN out;
IF x =/= NONE THEN
BEGIN
IF x.i_suc =/= NONE THEN
BEGIN
i_pred:- x;
i_suc:- x.i_suc;
i_suc.i_pred:- x.i_suc:- THIS linkage;
!; IF (IF trace[2] THEN title =/= NOTEXT ELSE FALSE) THEN
!; report(' ',title,
!; IF x IN head THEN
!; conc(" Into (First in) Set ",x.title) ELSE
!; conc(" Follows ",x.title," of Set ",
!; x QUA link.sethead.title));
END
ELSE !;
!; report('?',title,conc(" Couldn't Follow Non-Set member ",x.title));
END
ELSE report('?',title," Couldn't Follow NONE"); !;
END of follow;
PROCEDURE precede(x); REF (linkage) x;
BEGIN out;
IF x =/= NONE THEN
BEGIN
IF x.i_suc =/= NONE THEN
BEGIN
!; TEXT t;
i_suc:- x;
i_pred:- x.i_pred;
i_pred.i_suc:- x.i_pred:- THIS linkage;
!; t:- title;
!; IF (IF trace[3] THEN t =/= NOTEXT ELSE FALSE) THEN
!; report(' ',t,
!; IF x IN head THEN
!; conc(" Into (Last in) Set ",x.title) ELSE
!; conc(" Precedes ",x.title," of Set ",
!; x QUA link.sethead.title));
END
ELSE !;
!; report('?',title,conc(" Couldn't Precede Non-Set member ",x.title));
END
ELSE report('?',title," Couldn't Precede NONE"); !;
END of precede;
PROCEDURE into(s); REF (head) s;
!; IF s == NONE THEN
!; BEGIN out;
!; report('?',title," Couldn't move Into NONE")
!; END ELSE
precede(s);
END of link;
linkage CLASS head;
HIDDEN i_suc,i_pred;
BEGIN
REF (link) PROCEDURE first; first:- suc;
REF (link) PROCEDURE last; last:- pred;
BOOLEAN PROCEDURE empty; empty:= i_suc == THIS linkage;
INTEGER PROCEDURE cardinal;
BEGIN INTEGER i; REF (linkage) x;
x:- THIS linkage;
FOR x:- x.suc WHILE x =/= NONE DO i:= i + 1;
cardinal:= i;
!; IF (IF trace[4] THEN title =/= NOTEXT ELSE FALSE) THEN
!; BEGIN TEXT t; t:- Blanks(5); t.Putint(i);
!; report(' ',title,conc(" Cardinal ",t));
!; END trace;
END of cardinal;
PROCEDURE clear;
BEGIN REF (link) x;
FOR x:- first WHILE x =/= NONE DO x.out;
!; IF (IF trace[4] THEN title =/= NOTEXT ELSE FALSE) THEN
!; report(' ',title," Cleared");
END of clear;
i_suc:- i_pred:- THIS linkage
END of head;
!; PROCEDURE setlist(s); REF (head) s;
!; IF tracefile =/= NONE THEN
!; BEGIN
!; tracefile.Outimage;
!; IF s == NONE THEN
!; report('?',NOTEXT," SETLIST Called for NONE") ELSE
!; BEGIN REF (link) x; INTEGER p; TEXT t;
!; report(':',s.title," Set Member List ----");
!; x:- s.first;
!; WHILE x =/= NONE DO
!; BEGIN t:- x.title;
!; report(':',IF t == NOTEXT THEN Copy("Link Object") ELSE t,NOTEXT);
!; x:- x.suc
!; END loop;
!; report(':',Copy("-----------")," End of List ----");
!; END s not none;
!; tracefile.Outimage;
!; END of setlist;
!;
!; PROCEDURE traceon(filespec,dotrace);
!; VALUE filespec,dotrace; TEXT filespec,dotrace;
!; BEGIN CHARACTER c;
!; INSPECT tracefile DO
!; BEGIN Outimage; Close END;
!; IF filespec == NOTEXT THEN tracefile:- Sysout ELSE
!; IF upcase(filespec) = "SYSOUT" THEN
!; tracefile:- Sysout ELSE
!; BEGIN
!; tracefile:- NEW Outfile(conc(filespec,"/ACCESS:APPEND"));
!; tracefile.Open(Blanks(80));
!; END not Sysout;
!; IF dotrace = "*" THEN
!; BEGIN dotrace.Setpos(0); ! Inhibit WHILE loop on dotrace;
!; trace[1]:= trace[2]:= trace[3]:= trace[4]:= TRUE
!; END set all ELSE upcase(dotrace);
!; WHILE dotrace.More DO
!; BEGIN c:= dotrace.Getchar;
!; IF c = 'O' THEN trace[1]:= TRUE ELSE
!; IF c = 'F' THEN trace[2]:= TRUE ELSE
!; IF c = 'I' THEN trace[3]:= TRUE ELSE
!; IF c = 'Q' THEN trace[4]:= TRUE;
!; END loop;
!;
!; INSPECT tracefile DO
!; BEGIN Outimage;
!; Outtext("*** Trace generated ");
!; Outtext(today); Outtext(" at ");
!; Outtext(daytime); Outtext(" ***");
!; Outtext(" Trace Codes: ");
!; Outtext(IF dotrace = "*" THEN Copy("All") ELSE dotrace);
!; Outimage; Outimage
!; END inspect tracefile;
!; END trace on;
!;
!; PROCEDURE traceon_zimset(t1,t2); TEXT t1,t2;
!; traceon(t1,t2);
!;
!; PROCEDURE traceoff;
!; BEGIN INTEGER i;
!; IF tracefile =/= Sysout THEN
!; INSPECT tracefile DO Close;
!; tracefile:- NONE;
!; FOR i:= 1 STEP 1 UNTIL 4 DO
!; trace[i]:= FALSE;
!; END of trace off;
!;
!; PROCEDURE traceoff_zimset;
!; traceoff;
!;
!; BOOLEAN ARRAY trace[1:4];
!;
!; PROCEDURE report(warn,objtitle,t); NAME t; TEXT t,objtitle;
!; CHARACTER warn;
!; INSPECT tracefile DO
!; BEGIN INTEGER p;
!; Outchar(warn); Outtext(now);
!; p:= Pos; Outtext(objtitle);
!; Setpos(p+12);
!; Outtext(t); Outimage;
!; END of report;
!;
!; TEXT PROCEDURE now; ;
!;
!; REF (Outfile) tracefile;
END of zimset;