-- FramePackModulesImpl.Mesa Last edited by Lewis on 2-Apr-81 14:45:27
-- last edited by Levin on July 6, 1982 3:49 pm
DIRECTORY
Alloc USING [AddNotify, DropNotify, Handle, Notifier],
BcdDefs USING [MTIndex],
FramePackModules,
PackagerDefs USING [globalData, packtreetype, packsttype, packctreetype],
SemanticEntry USING [STIndex],
SourceBcd USING [EnumerateModulesInConfig],
Strings USING [SubString],
SymTabDefs USING [HTIndex],
SymTabOps USING [SubStringForHash],
Table USING [Base],
Tree: FROM "PackTree" USING [Index, Link, root, Scan, Test],
TreeOps: FROM "PackTreeOps" USING [ScanList, SearchList];
FramePackModulesImpl: PROGRAM
IMPORTS Alloc, PackagerDefs, SymTabOps, SourceBcd, Tree, TreeOps
EXPORTS FramePackModules =
BEGIN
FPerror: PROC = {ERROR FramePackModulesError};
FramePackModulesError: ERROR = CODE;
-- Parse tree, semantic entry, and config tree allocator table bases
table: Alloc.Handle ← NIL;
tb, stb, ctreeb: Table.Base;
UpdateBases: Alloc.Notifier =
BEGIN
tb ← base[PackagerDefs.packtreetype];
stb ← base[PackagerDefs.packsttype];
ctreeb ← base[PackagerDefs.packctreetype];
END;
-- ******************* Frame Pack Module Enumeration ********************
EnumerateFramePacks: PUBLIC PROC [
userProc: PROC [fpNode: Tree.Index] RETURNS [stop: BOOLEAN]] =
BEGIN
OutputOneFramePack: Tree.Test =
BEGIN
WITH t SELECT FROM
subtree =>
BEGIN treeNode: Tree.Index = index;
SELECT tb[treeNode].name FROM
framePack, mergeFP =>
IF ~tb[treeNode].attr2 THEN -- not superceded
{IF userProc[treeNode] THEN RETURN[TRUE]}; -- stop enumeration
ENDCASE;
END;
ENDCASE => FPerror[];
RETURN[FALSE];
END;
table ← PackagerDefs.globalData.ownTable;
table.AddNotify[UpdateBases];
TreeOps.SearchList[Tree.root, OutputOneFramePack];
table.DropNotify[UpdateBases];
table ← NIL;
END;
SubStringForFramePackNode: PUBLIC PROC [
ss: Strings.SubString, fpNode: Tree.Index] =
BEGIN
WITH tb[fpNode].son[1] SELECT FROM
hash =>
BEGIN framePackHti: SymTabDefs.HTIndex = index;
SymTabOps.SubStringForHash[ss, framePackHti];
END;
ENDCASE => FPerror[];
END;
DoneEnumeratingModules: SIGNAL = CODE;
EnumerateModules: PUBLIC PROC [
fpNode: Tree.Index,
userProc: PROC [mti: BcdDefs.MTIndex] RETURNS [stop: BOOLEAN]] =
BEGIN
SELECT tb[fpNode].name FROM
framePack, mergeFP =>
IF tb[fpNode].attr2 THEN FPerror[]; -- superceded
ENDCASE => FPerror[];
OutputModules[fpNode, userProc ! DoneEnumeratingModules => CONTINUE];
END;
OutputModules: PROC [ -- called recursively when multiple layers of FP merging
fpNode: Tree.Index,
userProc: PROC [mti: BcdDefs.MTIndex] RETURNS [stop: BOOLEAN]] =
BEGIN
SELECT tb[fpNode].name FROM
framePack => -- fpNode is a "normal" frame pack
OutputFPModules[cdList: tb[fpNode].son[2], userProc: userProc];
mergeFP => -- fpNode is a merged frame pack
OutputModulesOfMergedOldFPs[
oldFPList: tb[fpNode].son[2], userProc: userProc];
ENDCASE => FPerror[];
END;
OutputModulesOfMergedOldFPs: PROC [
oldFPList: Tree.Link,
userProc: PROC [
mti: BcdDefs.MTIndex] RETURNS [stop: BOOLEAN]] =
BEGIN
OutputModulesOfOneOldFP: Tree.Scan =
BEGIN
WITH t SELECT FROM
symbol =>
BEGIN oldFPSE: SemanticEntry.STIndex = index;
WITH stb[oldFPSE] SELECT FROM
framePack =>
BEGIN oldFPNode: Tree.Index = treeNode;
OutputModules[fpNode: oldFPNode, userProc: userProc]
END;
ENDCASE;
END;
ENDCASE => FPerror[];
END;
TreeOps.ScanList[oldFPList, OutputModulesOfOneOldFP];
END;
OutputFPModules: PROC [
cdList: Tree.Link,
userProc: PROC [
mti: BcdDefs.MTIndex] RETURNS [stop: BOOLEAN]] =
BEGIN
OutputModulesInOneCD: Tree.Test =
BEGIN
WITH t SELECT FROM
subtree =>
BEGIN cdNode: Tree.Index = index;
SELECT tb[cdNode].name FROM
allComp =>
OutputAllModulesOfComponent[tb[cdNode].son[1], userProc];
compItems =>
OutputModulesOfComponentItems[tb[cdNode].son[2], userProc];
ENDCASE;
END;
ENDCASE => FPerror[];
RETURN[FALSE];
END;
TreeOps.SearchList[cdList, OutputModulesInOneCD];
END;
OutputAllModulesOfComponent: PROC [
compSeLink: Tree.Link,
userProc: PROC [mti: BcdDefs.MTIndex] RETURNS [stop: BOOLEAN]] =
BEGIN -- ComponentDesc ::= Component (all global frames of component)
OutputOneComponentModule: PROC [mti: BcdDefs.MTIndex] RETURNS [stop: BOOLEAN] =
BEGIN
IF userProc[mti] THEN SIGNAL DoneEnumeratingModules;
RETURN[FALSE];
END;
WITH compSeLink SELECT FROM
symbol =>
BEGIN compSE: SemanticEntry.STIndex = index;
WITH stb[compSE] SELECT FROM
module =>
IF userProc[mti] THEN SIGNAL DoneEnumeratingModules;
config =>
SourceBcd.EnumerateModulesInConfig[
instance, cNode, OutputOneComponentModule];
ENDCASE;
END;
ENDCASE => FPerror[];
END;
OutputModulesOfComponentItems: PROC [
itemList: Tree.Link,
userProc: PROC [mti: BcdDefs.MTIndex] RETURNS [stop: BOOLEAN]] =
BEGIN -- ComponentDesc ::= Component [ItemList] (frames of component's items)
OutputModulesOfOneItem: Tree.Scan =
{OutputAllModulesOfComponent[t, userProc]};
TreeOps.ScanList[itemList, OutputModulesOfOneItem];
END;
END.