-- ListSymbols.mesa; -- modified by Sandman, July 8, 1980 9:29 AM -- modified by Sweet, August 28, 1980 9:47 AM DIRECTORY AltoDefs USING [PageNumber, PageCount], CommanderDefs USING [CommandBlockHandle, AddCommand], ComData USING [definitionsOnly, errorStream], CompilerUtil USING [PrintSymbols, PrintBodies], Inline USING [LowHalf], IODefs USING [WriteString], ListerDefs USING [ IncorrectVersion, Load, MultipleModules, NoCode, NoFGT, NoSymbols, SetRoutineSymbols, WriteFileID, WriteVersions], LiteralOps USING [Initialize], OutputDefs USING [ OpenOutput, CloseOutput, outStream, PutString, PutCR, PutDecimal], SegmentDefs USING [ FileSegmentHandle, FileNameError, NewFileSegment, Read, DefaultVersion, InvalidSegmentSize, SwapError, DeleteFileSegment, NewFile], String USING [AppendString], SymbolTable USING [Acquire, Release, Base, TableForSegment], TreeOps USING [Initialize]; ListSymbols: PROGRAM IMPORTS CommanderDefs, CompilerUtil, data: ComData, Inline, IODefs, ListerDefs, LiteralOps, OutputDefs, SegmentDefs, String, SymbolTable, TreeOps EXPORTS ListerDefs = BEGIN OPEN ListerDefs; symbols: SymbolTable.Base; sseg: SegmentDefs.FileSegmentHandle; commandType: {bodies, symbols}; PrintSyms: PROCEDURE = BEGIN data.definitionsOnly ← symbols.stHandle.definitionsFile; data.errorStream ← OutputDefs.outStream; SELECT commandType FROM symbols => CompilerUtil.PrintSymbols[]; bodies => CompilerUtil.PrintBodies[]; ENDCASE; OutputDefs.CloseOutput[]; SymbolTable.Release[symbols]; SegmentDefs.DeleteFileSegment[sseg ! SegmentDefs.SwapError => CONTINUE] END; GetSymbolTable: PROCEDURE [seg: SegmentDefs.FileSegmentHandle] = BEGIN symbols ← SymbolTable.Acquire[SymbolTable.TableForSegment[seg]]; ListerDefs.SetRoutineSymbols[symbols]; TreeOps.Initialize[]; LiteralOps.Initialize[]; END; MakeBcdFilename: PROCEDURE [bcd, root: STRING] = BEGIN OPEN String; i: CARDINAL; AppendString[bcd, root]; FOR i IN [0..bcd.length) DO IF bcd[i] = '. THEN RETURN; ENDLOOP; AppendString[bcd, ".bcd"L]; END; DoSymbols: PROCEDURE [root: STRING] = BEGIN bcdFile: STRING ← [40]; MakeBcdFilename[bcdFile, root]; BEGIN [symbols: sseg] ← Load[ bcdFile ! NoCode => RESUME ; NoFGT => RESUME ; NoSymbols, IncorrectVersion, MultipleModules => BEGIN IODefs.WriteString["Bad format"]; GOTO giveup END; SegmentDefs.FileNameError => BEGIN IODefs.WriteString["File not found"]; GOTO giveup END]; GetSymbolTable[sseg]; OutputDefs.OpenOutput[root, ".sl"L]; ListerDefs.WriteFileID[]; PrintSyms[]; EXITS giveup => NULL; END; END; DoSymbolSegment: PROCEDURE [ root: STRING, base: AltoDefs.PageNumber, pages: AltoDefs.PageCount] = BEGIN OPEN SegmentDefs; bcdFile: STRING ← [40]; MakeBcdFilename[bcdFile, root]; BEGIN sseg ← NewFileSegment[ NewFile[bcdFile, Read, DefaultVersion ! FileNameError => GO TO NoFile], base, pages, Read ! InvalidSegmentSize => GO TO BadSegment]; GetSymbolTable[sseg]; OutputDefs.OpenOutput[root, ".sl"L]; OutputDefs.PutString["Symbol Table in file: "L]; OutputDefs.PutString[root]; OutputDefs.PutString[", base: "L]; OutputDefs.PutDecimal[base]; OutputDefs.PutString[", pages: "L]; OutputDefs.PutDecimal[pages]; OutputDefs.PutCR[]; ListerDefs.WriteVersions[ Inline.LowHalf[@symbols.stHandle.version], Inline.LowHalf[@symbols.stHandle.creator]]; PrintSyms[]; EXITS NoFile => IODefs.WriteString["File not found"]; BadSegment => IODefs.WriteString["Bad Segment"]; END; END; Symbols: PROCEDURE [root: STRING] = BEGIN commandType ← symbols; DoSymbols[root] END; SymbolSegment: PROCEDURE [ root: STRING, base: AltoDefs.PageNumber, pages: AltoDefs.PageCount] = BEGIN commandType ← symbols; DoSymbolSegment[root, base, pages] END; Bodies: PROCEDURE [root: STRING] = BEGIN commandType ← bodies; DoSymbols[root] END; BodySegment: PROCEDURE [ root: STRING, base: AltoDefs.PageNumber, pages: AltoDefs.PageCount] = BEGIN commandType ← bodies; DoSymbolSegment[root, base, pages] END; Init: PROCEDURE = BEGIN OPEN CommanderDefs; 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"]; END; Init[]; END...