-- IncludesSymTablesImpl.Mesa
-- Last modified by Sandman on July 8, 1980 9:16 AM
-- Last modified by Lewis on 10-Apr-81 12:22:117
-- Last modified by Paul Rovner on June 16, 1982 3:21 pm
DIRECTORY
Environment USING [PageCount, PageNumber],
IncludesSymTables USING [],
Segments USING [
DeleteSegment, FHandle, NewSegment, Read, SegmentAddress,
SHandle, SwapIn, Unlock],
SymbolSegment USING [BlockDescriptor, STHeader, VersionID],
Symbols USING [HTIndex, HTRecord, MDIndex],
IncludeCheckerTable USING [Base];
IncludesSymTablesImpl: PROGRAM
IMPORTS Segments
EXPORTS IncludesSymTables =
BEGIN
ObsoleteSymbolTable: PUBLIC ERROR = CODE;
mdb: PUBLIC IncludeCheckerTable.Base;
mdLimit: PUBLIC Symbols.MDIndex;
ssb: PUBLIC LONG STRING;
ht: PUBLIC LONG DESCRIPTOR FOR ARRAY Symbols.HTIndex OF Symbols.HTRecord;
symFileSeg: Segments.SHandle ← NIL;
moduleTableDesc: SymbolSegment.BlockDescriptor;
stringDesc: SymbolSegment.BlockDescriptor;
hashTableDesc: SymbolSegment.BlockDescriptor;
LoadSymTables: PUBLIC PROC [
symFile: Segments.FHandle,
symSegBase, symSegSize: Environment.PageNumber] =
BEGIN
header: LONG POINTER TO SymbolSegment.STHeader;
IF symFileSeg # NIL THEN ReleaseSymTables[];
symFileSeg ← Segments.NewSegment[
file: symFile, base: symSegBase, pages: symSegSize, access: Segments.Read];
Segments.SwapIn[symFileSeg];
header ← Segments.SegmentAddress[symFileSeg];
IF header.versionIdent # SymbolSegment.VersionID THEN
ERROR ObsoleteSymbolTable[ ! UNWIND => ReleaseSymTables[]];
moduleTableDesc ← header.mdBlock;
stringDesc ← header.ssBlock;
hashTableDesc ← header.htBlock;
ht ← DESCRIPTOR[
(Segments.SegmentAddress[symFileSeg] + hashTableDesc.offset),
hashTableDesc.size/SIZE[Symbols.HTRecord]];
ssb ← Segments.SegmentAddress[symFileSeg] + stringDesc.offset;
mdb ← LOOPHOLE[Segments.SegmentAddress[symFileSeg], IncludeCheckerTable.Base] + moduleTableDesc.offset;
mdLimit ← LOOPHOLE[moduleTableDesc.size];
END;
ReleaseSymTables: PUBLIC PROC = {
IF symFileSeg # NIL THEN {
Segments.Unlock[symFileSeg]; Segments.DeleteSegment[symFileSeg]; symFileSeg ← NIL}};
END.