-- SourceBcd.Mesa Last edited by Lewis on 30-Dec-80 10:12:07
DIRECTORY
BcdDefs USING [CTIndex, MTIndex, MTRecord, NameRecord],
BcdUtilDefs USING [BcdBases, BcdLimits],
PackEnviron USING [BcdHandle],
Strings USING [SubString],
SymTabDefs USING [HTIndex],
Table USING [Base, Limit];
SourceBcd: DEFINITIONS =
BEGIN
-- Source Bcd is obsolete, already repackaged, or was compiled for Alto
BadSourceBcd: ERROR;
-- ************************* BCD Table Information *************************
bcdHeader: PackEnviron.BcdHandle;
bcdBases: LONG POINTER TO BcdBaseRec;
BcdBaseRec: TYPE = BcdUtilDefs.BcdBases; -- source bcd table bases
bcdLimits: LONG POINTER TO BcdLimitRec;
BcdLimitRec: TYPE = BcdUtilDefs.BcdLimits; -- last indices in table bases
moduleCount: CARDINAL;
mtiArray: LONG DESCRIPTOR FOR ARRAY ModuleNum OF BcdMTIndex;
-- allow general comparisons between BcdDefs.MTIndex values
BcdMTIndex: TYPE = Table.Base RELATIVE ORDERED POINTER [0..Table.Limit) TO BcdDefs.MTRecord;
ModuleNum: TYPE = CARDINAL;
NullModuleNum: ModuleNum = LAST[CARDINAL];
-- Interface
Load, Unload: PROC;
EnumerateConfigs: PROC [
userProc: PROC [BcdDefs.CTIndex] RETURNS [stop: BOOLEAN]];
EnumerateModules: PROC [
userProc: PROC [BcdDefs.MTIndex] RETURNS [stop: BOOLEAN]];
IsTableCompiled: PROC [mti: BcdDefs.MTIndex] RETURNS [reply: BOOLEAN];
ModuleNumForMti: PROC [ -- map i-th module index to i
mti: BcdDefs.MTIndex] RETURNS [mNum: ModuleNum];
SubStringForName: PROC [ss: Strings.SubString, name: BcdDefs.NameRecord];
EqualIdAndName: PROC [
id: SymTabDefs.HTIndex, name: BcdDefs.NameRecord]
RETURNS [equal: BOOLEAN];
-- *************************** Configuration Tree ***************************
configTreeRoot: CTreeIndex;
ComponentKind: TYPE = {instance, prototype};
CTreeIndex: TYPE = Table.Base RELATIVE POINTER [0..Table.Limit) TO ConfigTreeNode;
NullCTreeIndex: CTreeIndex = LAST[CTreeIndex];
ConfigTreeNode: TYPE = RECORD [
father: CTreeIndex, -- containing config
brother: CTreeIndex, -- next config/module in containing config
firstSon: CTreeIndex, -- first contained config/module
prototypeName: BcdDefs.NameRecord,
anotherNodeWSameProtoName: BOOLEAN,
instanceLink, prototypeLink: CTreeIndex, -- links nodes w = hash values
instancePrev, prototypePrev: CTreeIndex, -- links nodes w = ids
index: BcdTableLoc, -- module or config table index
body: SELECT kind: ComponentKind FROM
instance => [instanceName: BcdDefs.NameRecord],
prototype => [], -- for prototypes, instanceName = prototypeName
ENDCASE];
BcdTableLoc: TYPE = RECORD [
SELECT kind: * FROM
config => [cti: BcdDefs.CTIndex],
module => [mti: BcdDefs.MTIndex],
ENDCASE];
-- Conceptually, all components (modules and configurations) stored in the
-- Configuration Tree have names of the form [instanceName prototypeName].
-- If the component is a prototype, however, only the prototype name is
-- actually stored; its instance name is the same as the prototype name.
-- Interface
BuildConfigTree, DestroyConfigTree: PROC;
EnumerateModulesInConfig: PROC [
kind: ComponentKind, -- if prototype, no duplications appear in output
configTreeNode: CTreeIndex,
userProc: PROC [mti: BcdDefs.MTIndex] RETURNS [stop: BOOLEAN]];
FindModuleOrConfig: PROC [
kind: ComponentKind,
ResetIdStream: PROC,
FirstQualId, NextQualId: PROC RETURNS [id: SymTabDefs.HTIndex]]
RETURNS [component: CTreeIndex];
IsModuleInConfig: PROC [
kind: ComponentKind,
mti: BcdDefs.MTIndex,
configTreeNode: CTreeIndex]
RETURNS [yes: BOOLEAN];
-- find first node with given instance/prototype id
-- (others with same id are found along first node's prev chain)
LookupId: PROC [
id: SymTabDefs.HTIndex, kind: ComponentKind]
RETURNS [firstTreeLoc: CTreeIndex];
LookupName: PROC [
name: BcdDefs.NameRecord, kind: ComponentKind]
RETURNS [firstTreeLoc: CTreeIndex];
LookupSS: PROC [
idSS: Strings.SubString, kind: ComponentKind]
RETURNS [firstTreeLoc: CTreeIndex];
END.