-- STDebugTrees.mesa Edited by Sweet, May 21, 1980 9:38 AM -- Edited by Bruce, October 13, 1980 1:46 PM DIRECTORY Ascii USING [SP, TAB], Literals USING [ LitRecord, LTIndex, LTRecord, ltType, STIndex, STRecord, stType], RESOut USING [ Log10, Log8, PChar, PCr, PNext, PNextUnsigned, POctal, PString, PUnsigned], STDebugDefs USING [ HashForSei, LockSymbols, PSTString, PutHashString, PutNodeName, showLinks, STCopyRead, STRead, TableBase, UnlockSymbols], String USING [InvalidNumber, StringToDecimal], Symbols USING [HTIndex], Table USING [Base], Tree USING [Index, Link, Node, Null, treeType]; STDebugTrees: PROGRAM IMPORTS RESOut, String, STDebugDefs EXPORTS STDebugDefs = BEGIN OPEN RESOut, STDebugDefs; depthString: PUBLIC STRING ← NIL; PutAsTree: PUBLIC PROCEDURE [t: Tree.Link] = BEGIN ENABLE UNWIND => UnlockSymbols[]; maxDepth: CARDINAL ← 0; IF depthString # NIL THEN maxDepth ← String.StringToDecimal[depthString ! String.InvalidNumber => CONTINUE]; LockSymbols[]; PutSubTree[t, 0, maxDepth]; UnlockSymbols[]; END; PutSubTree: PROCEDURE [t: Tree.Link, depth, remaining: CARDINAL] = BEGIN OPEN Tree; overflow: CARDINAL = 2*depth+1; PCr[]; THROUGH [0..depth/4) DO PChar[Ascii.TAB]; ENDLOOP; THROUGH [0.. depth MOD 4) DO PChar[Ascii.SP]; PChar[Ascii.SP] ENDLOOP; WITH tt: t SELECT FROM literal => BEGIN PutLiteral[tt, overflow]; IF showLinks THEN BEGIN extra: CARDINAL ← 6 + Log10[(WITH tt.info SELECT FROM word => LOOPHOLE[index], string => LOOPHOLE[index], ENDCASE => ERROR)]; PNext["("L, extra, overflow]; WITH tt.info SELECT FROM word => BEGIN PString["lti: "L]; PUnsigned[LOOPHOLE[index]] END; string => BEGIN PString["sti: "L]; PUnsigned[LOOPHOLE[index]] END; ENDCASE; PChar[')]; END; END; -- of literal arm symbol => BEGIN hti: Symbols.HTIndex ← HashForSei[tt.index]; PutHashString[hti]; IF showLinks THEN BEGIN extra: CARDINAL ← Log10[LOOPHOLE[tt.index]]+1; PNext["(sei: "L, extra, overflow]; PUnsigned[LOOPHOLE[tt.index]]; PChar[')]; END; END; -- of symbol arm hash => BEGIN PutHashString[tt.index]; IF showLinks THEN BEGIN extra: CARDINAL ← Log10[tt.index]+1; PNext["(hti: "L, extra, overflow]; PUnsigned[tt.index]; PChar[')]; END; END; -- of hash arm subtree => IF t = Tree.Null THEN BEGIN PString["<empty>"L]; END ELSE BEGIN tb: Table.Base ← TableBase[treeType]; tn: Tree.Node; STCopyRead[to: @tn, from: @tb[tt.index], nwords: SIZE [Tree.Node]]; PChar['[]; PUnsigned[LOOPHOLE[tt.index]]; PString["] "L]; IF tn.free THEN BEGIN PString["FREE!"L]; GO TO done END; PutNodeName[tn.name]; PNextUnsigned["info"L, tn.info, overflow]; IF tn.attr1 OR tn.attr2 OR tn.attr3 THEN BEGIN PNext["attr: "L, 3, overflow]; IF tn.attr1 THEN PChar['1]; IF tn.attr2 THEN PChar['2]; IF tn.attr3 THEN PChar['3]; END; IF tn.shared THEN PNext["shared"L,,overflow]; IF remaining # 0 THEN BEGIN EndIndex: Tree.Index = LAST[Tree.Index]; EndMark: Tree.Link = [subtree[index: EndIndex]]; son: Tree.Link; p: POINTER ← @tb[tt.index].son[1]; IF tn.name # list OR tn.nSons # 0 THEN THROUGH [0..tn.nSons) DO son ← STRead[p]; PutSubTree[son, depth+1, remaining-1]; p ← p+1; ENDLOOP ELSE DO son ← STRead[p]; IF son = EndMark THEN EXIT; PutSubTree[son, depth+1, remaining-1]; p ← p+1; ENDLOOP; END; EXITS done => NULL; END; -- of subtree arm ENDCASE; END; PutAsLti: PUBLIC PROCEDURE [lti: Literals.LitRecord] = BEGIN ENABLE UNWIND => UnlockSymbols[]; LockSymbols[]; PCr[]; WITH lti SELECT FROM word => BEGIN PString["ltb["L]; PUnsigned[LOOPHOLE[index]] END; string => BEGIN PString["stb["L]; PUnsigned[LOOPHOLE[index]] END; ENDCASE; PString["] = "L]; PutLiteral[[literal[lti]], 2]; UnlockSymbols[]; END; PutLiteral: PROCEDURE[t: literal Tree.Link, overflow: CARDINAL] = BEGIN OPEN Literals; WITH t.info SELECT FROM word => PutWordLiteral[index, overflow]; string => PutStringLiteral[index]; ENDCASE; END; PutWordLiteral: PROCEDURE [lti: Literals.LTIndex, overflow: CARDINAL] = BEGIN OPEN Literals; ltr: LTRecord; ltb: Table.Base; ltb ← TableBase[ltType]; STCopyRead[to: @ltr, from: @ltb[lti], nwords: SIZE[LTRecord]]; WITH ltr SELECT FROM short => POctal[value]; long => BEGIN i, w: CARDINAL; p: POINTER ← @(LOOPHOLE[ltb[lti], long LTRecord]).value; PChar['[]; FOR i IN [0..length) DO w ← STRead[p+i]; IF i # 0 THEN PNext[""L, Log8[w], overflow]; POctal[w]; ENDLOOP; PChar[']]; END; ENDCASE; END; PutStringLiteral: PROCEDURE [sti: Literals.STIndex] = BEGIN OPEN Literals; stb: Table.Base; str: STRecord; stb ← TableBase[stType]; DO -- until a master string (at most twice) STCopyRead[to: @str, from: @stb[sti], nwords: SIZE[STRecord]]; WITH str SELECT FROM copy => sti ← link; master => BEGIN PChar['"]; PSTString[@(LOOPHOLE[ stb[sti], master STRecord]).string]; PChar['"]; IF local THEN PChar['L]; EXIT; END; ENDCASE; ENDLOOP; END; END.