<> <> <> <> <> <> DIRECTORY FS USING [OpenFile], Rope USING [ROPE], Symbols USING [SEIndex, SENull, ISEIndex, ISENull], SymbolTable USING [Base], BasicTime USING [GMT], TimeStamp USING [Stamp]; LupineSymbolTable: DEFINITIONS = BEGIN <> STBase: PRIVATE TYPE = SymbolTable.Base _ NIL | NULL; <> String: TYPE = Rope.ROPE _ StringNIL; StringNIL: String = NIL; -- Need nonNIL symbol so INLINEs compile OK. GMT: TYPE = BasicTime.GMT; VersionStamp: TYPE = TimeStamp.Stamp; TypeID: TYPE = RECORD [stamp: TimeStamp.Stamp, sei: Symbols.SEIndex]; <> <> OpenInterface: PROCEDURE [ interfaceFilename: String, interfaceCapability: FS.OpenFile ]; <> OpenError: ERROR [fileOrModuleName: String, why: OpenErrorCode]; <> OpenErrorCode: TYPE = {badFileFormat, badFileName, badFileVersion, notInterfaceModule}; CloseInterface: PROCEDURE; InterfaceInfo: TYPE = RECORD [ types, variables: BOOLEAN_FALSE, transfers: PACKED ARRAY TransferTypes OF BOOLEAN _ ALL[FALSE] ]; GetInterfaceInfo: PROCEDURE RETURNS [ contents: InterfaceInfo, moduleName, fileName: String, moduleVersion: VersionStamp, moduleCreateTime, sourceCreateTime: GMT ]; MaxVersionStampStringLength: INTEGER = 19; VersionStampString: PROCEDURE [stamp: VersionStamp] RETURNS [stampString: String]; <> SymbolHandle: TYPE = PRIVATE RECORD [ base: STBase, symbol: Symbols.ISEIndex] _ SymbolHandleNIL | NULL; SymbolHandleNIL: SymbolHandle = [NIL, Symbols.ISENull]; TypeHandle: TYPE = PRIVATE RECORD [ base: STBase, type: Symbols.SEIndex] _ TypeHandleNIL | NULL; TypeHandleNIL: TypeHandle = [NIL, Symbols.SENull]; Index: TYPE = INTEGER[0..LAST[INTEGER]]; -- Meaningful user origin is 1. <> <> DirectoryProcedure: TYPE = PROCEDURE [ moduleName, fileName: String, imported: BOOLEAN, directoryIndex: Index ] RETURNS [stop: BOOLEAN_FALSE]; EnumerateDirectory: PROCEDURE [proc: DirectoryProcedure] RETURNS [stopped: BOOLEAN_FALSE]; TransferProcedure: TYPE = PROCEDURE [ transfer: SymbolHandle, transferType: TypeHandle, kind: TransferTypes, argumentRecordType, resultRecordType: TypeHandle, transferIndex: Index] RETURNS [stop: BOOLEAN_FALSE]; EnumerateTransfers: PROCEDURE [ proc: TransferProcedure, all, procs, signals, errors: BOOLEAN _ FALSE] RETURNS [stopped: BOOLEAN_FALSE]; ComponentProcedure: TYPE = PROCEDURE [ component: SymbolHandle, componentType: TypeHandle, componentIndex: Index] RETURNS [stop: BOOLEAN_FALSE]; EnumerateRecord: PROCEDURE [ recordType: TypeHandle, proc: ComponentProcedure] RETURNS [stopped: BOOLEAN_FALSE]; VariantProcedure: TYPE = PROCEDURE [ variantTag: SymbolHandle, variantNumber: INTEGER[0..LAST[INTEGER]], -- Assigned by compiler. variantRecordType: TypeHandle, variantIndex: Index ] RETURNS [stop: BOOLEAN_FALSE]; EnumerateVariants: PROCEDURE [ variantPartType: TypeHandle, proc: VariantProcedure] RETURNS [stopped: BOOLEAN_FALSE]; <> Types: TYPE = { Definition, Basic, Transfer, Record, VariantPart, Pointer, Ref, Any, List, RelativePtr, Text, String, StringBody, Rope, Atom, Array, Descriptor, Sequence, Zone, Opaque, Null, Other}; TransferTypes: TYPE = { Procedure, Error, Signal, Port, Program, Process, Other}; BasicTypes: TYPE = { Unspecified, Integer, Cardinal, Nat, Word, Character, Boolean, Real, Subrange, Enumeration, Other}; ParamPassingMethod: TYPE = {standard, var, value, result, handle}; TypeInfo: TYPE = RECORD [ self: TypeHandle, long: BOOLEAN _ FALSE, readonly: BOOLEAN _ FALSE, passingMethod: ParamPassingMethod _ standard, info: SELECT type: Types FROM Null => [], -- Empty parameter records are Null. Definition => [], -- Not needed or implemented. Basic => [ kind: BasicTypes, origin: LONG INTEGER, -- Incorrect for Real. cardinality: LONG INTEGER], -- Incorrect for LONG INT & CARD, Real. Transfer => [ kind: TransferTypes, safe: BOOLEAN, argumentType, resultType: TypeHandle], Record => [ paramRecord, painted, monitored: BOOLEAN, uniField, hasVariants, hasSequences: BOOLEAN], VariantPart => [ tag: SELECT kind: * FROM Computed => [], Star => [name: SymbolHandle], Named => [name: SymbolHandle, type: TypeHandle], ENDCASE], Text => [], String => [], StringBody => [], Rope => [--Rope.ROPE--], Atom => [], Pointer => [referentType: TypeHandle], Ref => [referentType: TypeHandle], Any => [], List => [firstType, restType: TypeHandle], RelativePtr => [baseType, offsetType, resultType: TypeHandle], Array => [ packed: BOOLEAN, indexType, elementType: TypeHandle], Descriptor => [ packed: BOOLEAN, indexType, elementType: TypeHandle], Sequence => [ packed: BOOLEAN, indexType, elementType: TypeHandle, tagName: SELECT kind: * FROM Computed => [], Named => [name: SymbolHandle], ENDCASE], Zone => [ allocation: {Counted, Uncounted}, mdsZone: BOOLEAN ], Opaque => [lengthKnown: BOOLEAN], Other => [] ENDCASE _ Other[] ]; <> SymbolName: PROCEDURE [symbol: SymbolHandle] RETURNS [name: String]; IsAnonymous: PROCEDURE [symbol: SymbolHandle] RETURNS [yes: BOOLEAN]; <> SymbolType: PROCEDURE [symbol: SymbolHandle] RETURNS [type: TypeHandle]; SymbolUniqueID: PROCEDURE [symbol: SymbolHandle] RETURNS [uniqueID: SymbolID]; SymbolID: TYPE = LONG CARDINAL; MakeTypeID: PROC [t: TypeHandle] RETURNS [id: TypeID]; <> GetTypeInfo: PROCEDURE [type: TypeHandle] RETURNS [info: TypeInfo]; PutTypeName: PROCEDURE [ putProc: PROC[CHARACTER], type: TypeHandle, includeReadonly: BOOLEAN_TRUE, rootInterfaceOpenName: String_StringNIL, extraFirstArg: String _ NIL ]; QualifyOpenNames: PROCEDURE[qualify: BOOL] RETURNS [oldQualify: BOOL]; FullTypeName: TYPE = RECORD [module, name: String]; -- module.name. SearchTypeDefinition: PROCEDURE [ rootDef: TypeHandle, candidateDefs: LONG DESCRIPTOR FOR READONLY ARRAY OF FullTypeName ] RETURNS [indexOfMatch: INTEGER _ -1 --No match--]; <> <> <> <> <> Words: TYPE = LONG INTEGER; Size: PROCEDURE [type: TypeHandle] RETURNS [size: Words]; ComputeArraySize: PROCEDURE [index, elements: TypeHandle, packed: BOOLEAN] RETURNS [size: Words]; END. -- LupineSymbolTable.