-- PackTree.Mesa Last edited by Lewis on 1-Apr-81 16:08:56
DIRECTORY
CodePackProcs USING [ModuleIndex, NullModuleIndex],
PackagerDefs USING [packtreetype],
SemanticEntry USING [STIndex],
SymTabDefs USING [HTIndex, HTNull],
Table USING [Base, Finger, Limit, Selector];
Tree: DEFINITIONS =
BEGIN
treeType: Table.Selector = PackagerDefs.packtreetype;
root: Tree.Link; -- root of package description tree (exported by TreeBuild)
Link: TYPE = RECORD [
SELECT tag: * FROM
subtree => [index: Tree.Index],
hash => [index: SymTabDefs.HTIndex],
symbol => [index: SemanticEntry.STIndex],
procs => [index: CodePackProcs.ModuleIndex], -- procs in a code pack
ENDCASE];
Null: Tree.Link = [subtree[index: Tree.NullIndex]];
NullId: Tree.Link = [hash[index: SymTabDefs.HTNull]];
NullProcs: Tree.Link = [procs[index: CodePackProcs.NullModuleIndex]];
Index: TYPE = Table.Base RELATIVE POINTER [0..Table.Limit) TO Tree.Node;
NullIndex: Tree.Index = FIRST[Tree.Index];
Node: TYPE = MACHINE DEPENDENT RECORD [
free: BOOLEAN, -- reserved for allocator
name: NodeName,
nSons: [0..MaxNSons],
info: UNSPECIFIED, -- (source file index)
cp: Tree.Index, -- enclosing code pack node if component desc
shared: BOOLEAN,
attr1: BOOLEAN, -- attr1 = EXCEPT[MAIN] if code pack node
seg: Tree.Index, -- enclosing segment node if component desc
attr2, attr3: BOOLEAN, -- attr2=superceded, 3=placed if code pack, seg
son: ARRAY [1..1) OF Tree.Link];
MaxNSons: CARDINAL = 1777B; -- largest list without null terminator
NodeName: TYPE = {
-- general tree constructor
list,
-- declarations
codeSeg,
codePack,
unnamedCodePack,
discardCodePack,
framePack,
merge,
mergeFP,
-- component descriptions
allComp, -- ComponentDesc ::= Component
compItems, -- ComponentDesc ::= Component [ItemList]
exceptItems, -- ComponentDesc ::= Component EXCEPT [ItemList]
exceptPacks, -- ComponentDesc ::= Component EXCEPT PackList
itemsExceptPacks, -- ComponentDesc ::= Component [ItemList] EXCEPT PackList
exceptPacksItems, -- ComponentDesc ::= Component EXCEPT PackList, [ItemList]
mainProcs, -- ComponentDesc ::= MAIN OF PackList
-- expressions
component,
main,
-- nil
none
};
-- tree manipulation
Id: TYPE = RECORD [baseP: Table.Finger, link: Tree.Link];
Scan: TYPE = PROC [t: Tree.Link];
Map: TYPE = PROC [t: Tree.Link] RETURNS [v: Tree.Link];
Test: TYPE = PROC [t: Tree.Link] RETURNS [BOOLEAN];
END.