<> <> <> <> <> DIRECTORY BcdDefs: TYPE USING [VersionStamp], CommanderOps: TYPE USING [CommandBlockHandle, AddCommand], CompilerUtil: TYPE USING [PrintSymbols, PrintBodies], Environment: TYPE USING [PageNumber, PageCount], FileSegment: TYPE USING [Pages], Heap: TYPE USING [systemZone], ListerDefs: TYPE USING [ IncorrectVersion, Load, MultipleModules, NoCode, NoFGT, NoFile, NoSymbols, SetRoutineSymbols, WriteFileID, WriteString, WriteVersions], LiteralOps: TYPE USING [Initialize, Finalize], OSMiscOps: TYPE USING [FindFile, FileError], OutputDefs: TYPE USING [OpenOutput, CloseOutput, PutString, PutCR, PutDecimal], Strings: TYPE USING [AppendString], SymbolTable: TYPE USING [Acquire, Base, Release, SetCacheSize], TreeOps: TYPE USING [Finalize, Initialize]; ListSymbols: PROGRAM IMPORTS CommanderOps, CompilerUtil, ListerDefs, Heap, LiteralOps, OSMiscOps, OutputDefs, Strings, SymbolTable, TreeOps = { OPEN ListerDefs; CommandOption: TYPE = {bodies, symbols}; SymbolSeg: TYPE = RECORD [ base: Environment.PageNumber, pages: Environment.PageCount]; PrintSyms: PROC [ sseg: FileSegment.Pages, option: CommandOption, versions: BOOLEAN] = { symbols: SymbolTable.Base; SymbolTable.SetCacheSize[0]; -- flush cache symbols _ SymbolTable.Acquire[sseg]; ListerDefs.SetRoutineSymbols[symbols]; IF versions THEN { version, creator: BcdDefs.VersionStamp; version _ symbols.stHandle.version; creator _ symbols.stHandle.creator; ListerDefs.WriteVersions[@version, @creator]}; TreeOps.Initialize[NIL, NIL]; LiteralOps.Initialize[NIL, Heap.systemZone]; SELECT option FROM symbols => CompilerUtil.PrintSymbols[NIL, symbols.stHandle.definitionsFile]; bodies => CompilerUtil.PrintBodies[NIL]; ENDCASE; OutputDefs.CloseOutput[]; LiteralOps.Finalize[]; TreeOps.Finalize[]; SymbolTable.Release[symbols]}; MakeBcdFilename: PROC [bcd, root: STRING] = { Strings.AppendString[bcd, root]; FOR i: CARDINAL IN [0..bcd.length) DO IF bcd[i] = '. THEN RETURN ENDLOOP; Strings.AppendString[bcd, ".bcd"L]}; DoSymbols: PROC [root: STRING, option: CommandOption] = { bcdFile: STRING _ [40]; sseg: FileSegment.Pages; MakeBcdFilename[bcdFile, root]; [symbols: sseg] _ Load[bcdFile ! NoCode => {RESUME}; NoFGT => {RESUME}; NoSymbols, IncorrectVersion, MultipleModules => { WriteString["Bad format"]; GOTO giveup}; NoFile => {WriteString["File not found"]; GOTO giveup}]; OutputDefs.OpenOutput[root, ".sl"L]; ListerDefs.WriteFileID[]; PrintSyms[sseg, option, FALSE]; EXITS giveup => NULL}; DoSymbolSegment: PROC [ root: STRING, pages: SymbolSeg, option: CommandOption] = { bcdFile: STRING _ [40]; sseg: FileSegment.Pages; MakeBcdFilename[bcdFile, root]; sseg _ [ file: OSMiscOps.FindFile[bcdFile ! OSMiscOps.FileError => {GO TO NoFile}], span: [pages.base, pages.pages] --! SwapProblem[] => {GO TO BadSegment}--]; OutputDefs.OpenOutput[root, ".sl"L]; OutputDefs.PutString["Symbol Table in file: "L]; OutputDefs.PutString[root]; OutputDefs.PutString[", base: "L]; OutputDefs.PutDecimal[pages.base]; OutputDefs.PutString[", pages: "L]; OutputDefs.PutDecimal[pages.pages]; OutputDefs.PutCR[]; PrintSyms[sseg, option, TRUE]; EXITS NoFile => WriteString["File not found"L]; --BadSegment => WriteString["Bad Segment"L]--}; Symbols: PROC [root: STRING] = {DoSymbols[root, symbols]}; SymbolSegment: PROC [ root: STRING, base: Environment.PageNumber, pages: Environment.PageCount] = { DoSymbolSegment[root, [base, pages], symbols]}; Bodies: PROC [root: STRING] = {DoSymbols[root, bodies]}; BodySegment: PROC [ root: STRING, base: Environment.PageNumber, pages: Environment.PageCount] = { DoSymbolSegment[root, [base, pages], bodies]}; Init: PROC = { OPEN CommanderOps; command: CommandBlockHandle; command _ AddCommand["Symbols", LOOPHOLE[Symbols], 1]; command.params[0] _ [type: string, prompt: "Filename"]; command _ AddCommand["SymbolSegment", LOOPHOLE[SymbolSegment], 3]; command.params[0] _ [type: string, prompt: "Filename"]; command.params[1] _ [type: numeric, prompt: "Base"]; command.params[2] _ [type: numeric, prompt: "Pages"]; command _ AddCommand["Bodies", LOOPHOLE[Bodies], 1]; command.params[0] _ [type: string, prompt: "Filename"]; command _ AddCommand["BodySegment", LOOPHOLE[BodySegment], 3]; command.params[0] _ [type: string, prompt: "Filename"]; command.params[1] _ [type: numeric, prompt: "Base"]; command.params[2] _ [type: numeric, prompt: "Pages"]}; Init[]; }.