-- FramePackModulesImpl.mesa
-- last edited by JGS on 17-Sep-82 14:10:00
-- last edited by Satterthwaite, December 29, 1982 12:41 pm
DIRECTORY
Alloc USING [AddNotify, DropNotify, Handle, Notifier],
BcdDefs USING [MTIndex],
FramePackModules,
HashOps USING [HTIndex, SubStringForHash],
PackagerDefs USING [globalData, packtreetype, packsttype],
SemanticEntry USING [STIndex],
SourceBcd USING [EnumerateModulesInConfig],
String USING [SubString],
Table USING [Base],
Tree: FROM "PackTree" USING [Index, Link, Scan, Test],
TreeOps: FROM "PackTreeOps" USING [ScanList, SearchList];
FramePackModulesImpl: PROGRAM
IMPORTS Alloc, HashOps, PackagerDefs, SourceBcd, TreeOps
EXPORTS FramePackModules =
BEGIN
FPerror: PROC = {ERROR FramePackModulesError};
FramePackModulesError: ERROR = CODE;
table: Alloc.Handle ← NIL;
tb, stb: Table.Base;
UpdateBases: Alloc.Notifier = {
tb ← base[PackagerDefs.packtreetype];
stb ← base[PackagerDefs.packsttype]};
-- ******************* Frame Pack Module Enumeration ********************
EnumerateFramePacks: PUBLIC PROC [
userProc: PROC [fpNode: Tree.Index] RETURNS [stop: BOOLEAN]] = {
OutputOneFramePack: Tree.Test = {
WITH t SELECT FROM
subtree => {
treeNode: Tree.Index = index;
SELECT tb[treeNode].name FROM
framePack, mergeFP =>
IF ~tb[treeNode].attrs[$superceded] THEN {
IF userProc[treeNode] THEN RETURN[TRUE]}; -- stop enumeration
ENDCASE};
ENDCASE => FPerror[];
RETURN[FALSE]};
table ← PackagerDefs.globalData.ownTable;
table.AddNotify[UpdateBases];
TreeOps.SearchList[PackagerDefs.globalData.root, OutputOneFramePack];
table.DropNotify[UpdateBases];
table ← NIL};
SubStringForFramePackNode: PUBLIC PROC [
ss: String.SubString, fpNode: Tree.Index] =
BEGIN
WITH tb[fpNode].son[1] SELECT FROM
hash =>
BEGIN framePackHti: HashOps.HTIndex = index;
HashOps.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].attrs[$superceded] THEN FPerror[];
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[
cNode, $instance, 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.