DIRECTORY
Basics USING [bytesPerWord],
BcdDefs USING [BCD, Link, MTIndex, MTRecord, SGIndex, SGRecord, VersionStamp],
ConvertUnsafe USING [SubString],
Literals USING [LitDescriptor, LTIndex, LTNull, LTRecord, MSTIndex, STIndex, STNull],
IO USING [STREAM],
Rope USING [ROPE],
SymbolTable USING [Base],
Symbols
USING
[BitAddress, BodyRecord, BTIndex, ContextLevel, CSEIndex, CTXIndex, CTXNull, CTXRecord, ISEIndex, ISENull, lG, lL, lZ, MDIndex, Name, nullName, RootBti, SEIndex, SENull, SERecord, TransferMode, TypeClass, typeTYPE],
Tree USING [Link, NodeName];
T Y P E S & C O N S T A N T S
BCD: TYPE = BcdDefs.BCD;
BitAddress: TYPE = Symbols.BitAddress;
BTIndex: TYPE = Symbols.BTIndex;
BTRecord: TYPE = Symbols.BodyRecord;
bytesPerWord: NAT = Basics.bytesPerWord;
CSEIndex:
TYPE = Symbols.CSEIndex;
typeTYPE: CSEIndex = Symbols.typeTYPE;
ContextLevel:
TYPE = Symbols.ContextLevel;
lZ: ContextLevel = Symbols.lZ;
lG: ContextLevel = Symbols.lG;
lL: ContextLevel = Symbols.lL;
CTXIndex:
TYPE = Symbols.CTXIndex;
CTXNull: CTXIndex = Symbols.CTXNull;
CTXRecord: TYPE = Symbols.CTXRecord;
ISEIndex:
TYPE = Symbols.ISEIndex;
ISENull: ISEIndex = Symbols.ISENull;
ISERecord: TYPE = SERecord.id;
LTIndex:
TYPE = Literals.LTIndex;
LTNull: LTIndex = Literals.LTNull;
LTRecord: TYPE = Literals.LTRecord;
LitDescriptor: TYPE = Literals.LitDescriptor;
MDIndex: TYPE = Symbols.MDIndex;
MSTIndex:
TYPE = Literals.MSTIndex;
MSTNull: MSTIndex = LOOPHOLE[STNull];
MTIndex: TYPE = BcdDefs.MTIndex;
MTRecord: TYPE = BcdDefs.MTRecord;
Name:
TYPE = Symbols.Name;
nullName: Name = Symbols.nullName;
NodeName: TYPE = Tree.NodeName;
RefBCD: TYPE = REF BCD;
RefMTRecord: TYPE = REF MTRecord;
RefSGRecord: TYPE = REF SGRecord;
RootBti: BTIndex = Symbols.RootBti;
ROPE: TYPE = Rope.ROPE;
SEIndex:
TYPE = Symbols.SEIndex;
SENull: SEIndex = Symbols.SENull;
SERecord: TYPE = Symbols.SERecord;
SGIndex: TYPE = BcdDefs.SGIndex;
SGRecord: TYPE = BcdDefs.SGRecord;
STIndex:
TYPE = Literals.STIndex;
STNull: STIndex = Literals.STNull;
STREAM: TYPE = IO.STREAM;
SubString: TYPE = ConvertUnsafe.SubString;
SymbolTableBase: TYPE = SymbolTable.Base;
TransferMode: TYPE = Symbols.TransferMode;
TypeClass: TYPE = Symbols.TypeClass;
VersionStamp: TYPE = BcdDefs.VersionStamp;
OpCode types & procedures
OpCodeEntry: TYPE = RECORD [name: ROPE, push,pop,length: [0..8)];
OpCodeArray: TYPE = REF OpCodeArrayRep;
OpCodeArrayRep: TYPE = ARRAY [0..256) OF OpCodeEntry;
GetOpCodeArray: PROC RETURNS [OpCodeArray];
Bcd acquisition procedures
ReadBcd:
PROC
[fileName: ROPE] RETURNS [RefBCD];
Reads the given BCD. Allows FS.Error to fall through to the caller.
ReadMtr:
PROC
[inStream: STREAM, bcd: RefBCD, mti: MTIndex] RETURNS [RefMTRecord];
Reads the given module record.
ReadSgr:
PROC
[inStream: STREAM, bcd: RefBCD, sgi: SGIndex] RETURNS [RefSGRecord];
Reads the given segment record.
WithSegment:
PROC
[inStream: STREAM, bcd: RefBCD, sgi: SGIndex, inner: PROC [LONG POINTER]];
Reads the given segment, invoking the inner procedure with a pointer to it.
WithPages:
PROC
[inStream: STREAM, bcd: RefBCD, start,pages: CARDINAL, inner: PROC [LONG POINTER]];
Reads the given pages, invoking the inner procedure with a pointer to them.
Utility procedures
Some of these utility routines were cloned from various places to allow stream: STREAM and stb: SymbolTableBase as arguments, so we don't have to use global variables.
PrintSE:
PROC
[sei: ISEIndex, nBlanks: CARDINAL, definitionsOnly: BOOL, stream: STREAM, stb: SymbolTableBase];
Prints out the information for the given sei. The indentation level is given by nBlanks. For a definitions file, definitionsOnly = TRUE.
PrintSei:
PUBLIC
PROC [sei: ISEIndex, stream:
STREAM, stb: SymbolTableBase];
Just prints out the name for the given ISEIndex.
PrintType:
PROC [sei: SEIndex, stream:
STREAM, stb: SymbolTableBase];
Prints out the short form of the type, including its base ISEIndex.
PrintTypeInfo:
PROC
[sei: SEIndex, nBlanks: CARDINAL, stream: STREAM, stb: SymbolTableBase];
Prints out the long form of the type. The indentation level is given by nBlanks.
PrintTree:
PROC [tree: Tree.Link, nBlanks:
NAT, stream:
STREAM, stb: SymbolTableBase];
Prints out the tree. The indentation level is given by nBlanks.
PrintLiteral:
PUBLIC
PROC [t: Tree.Link.literal, stream:
STREAM, stb: SymbolTableBase];
Prints out the literal.
PrintBcdLink:
PUBLIC
PROC [link: BcdDefs.Link, stream:
STREAM];
Prints the link, distinguishing between proc, type, and var varieties.
PrintTreeLink:
PUBLIC PROC [link: Tree.Link, stream:
STREAM];
Prints the link in short form, distinguishing between subtree (default), hash, symbol, and literal varieties.
PrintName:
PUBLIC
PROC [name: Name, stream:
STREAM, stb: SymbolTableBase];
Prints the name.
WriteNodeName:
PUBLIC
PROC [n: NodeName, stream:
STREAM];
Prints the NodeName in its readable form.
WriteTypeName:
PUBLIC PROC [n: TypeClass, stream:
STREAM];
Prints the TypeClass in its readable form.
WriteModeName:
PUBLIC PROC [n: TransferMode, stream:
STREAM];
Prints the TransferMode in its readable form.
OutCtx:
PUBLIC PROC [message: Rope.
ROPE, ctx: CTXIndex, stream:
STREAM];
Prints the ctx in short form (" ctx: %g").
OutArgType:
PUBLIC PROC
[message: ROPE, sei: CSEIndex, stream: STREAM, stb: SymbolTableBase];
Prints the message and sei in short form ("%g: %g"). Special consideration for NIL and ANY.
PrintVersion:
PUBLIC
PROC
[stamp: VersionStamp, stream: STREAM, useTime: BOOL ← FALSE];
Prints the version stamp. If useTime, then the time associated with the stamp is also printed (useful only for source files).
PrintStringFromTable:
PUBLIC PROC
[index: CARDINAL, stream: STREAM, stb: SymbolTableBase];
Prints the string at the given index.
PrintString:
PUBLIC PROC [str:
LONG
STRING, stream:
STREAM];
Prints the given long string.
PrintSubString:
PUBLIC
PROC [ss: SubString, stream:
STREAM];
Prints the given substring.
PrintIndex:
PUBLIC PROC [index:
UNSPECIFIED, stream:
STREAM];
Prints the given index as a decimal unsigned number.
Indent:
PUBLIC
PROC [stream:
STREAM, nBlanks:
NAT];
Prints a '\n, followed by nBlanks blanks.
DescriptorValue:
PUBLIC PROC
[stb: SymbolTableBase, lti: LTIndex] RETURNS [LitDescriptor];
Gets the literal descriptor associated with the given LTIndex.
MasterString:
PUBLIC
PROC
[stb: SymbolTableBase, sti: STIndex] RETURNS [MSTIndex ← MSTNull];
Gets the master string for the given STIndex.
ShortName:
PUBLIC PROC [rope:
ROPE]
RETURNS [
ROPE];
Strips off version and directory information from the given file name.