-- ListPackageInfo.mesa -- Last modified by Sweet on September 16, 1980 9:13 AM -- Last modified by Lewis on 15-Jan-81 17:36:18 -- Last modified by Satterthwaite on May 10, 1983 12:56 pm DIRECTORY Ascii USING [SP], BcdDefs, BcdOps, CommanderOps USING [AddCommand, CommandBlockHandle], FileSegment: TYPE USING [Pages], ListerDefs USING [ IncorrectVersion, Load, LoadFromConfig, MapPages, MultipleModules, NoCode, NoFGT, NoFile, NoSymbols, PrintHti, SetRoutineSymbols, WriteFileID, WriteString], LongStorage USING [Node, Free], OutputDefs USING [ CloseOutput, NumberFormat, OpenOutput, PutChar, PutCR, PutDecimal, PutNumber, PutOctal, PutString], PackageSymbols USING [ ConstRecord, InnerPackRecord, IPIndex, IPNull, OPIndex, OuterPackRecord], PrincOps USING [CSegPrefix], Space: TYPE USING [Handle, Delete, LongPointer], Strings USING [AppendString], Symbols USING [BTIndex, HTIndex], SymbolTable USING [Acquire, Base, Release]; ListPackageInfo: PROGRAM IMPORTS CommanderOps, ListerDefs, LongStorage, OutputDefs, Space, Strings, SymbolTable = BEGIN OPEN ListerDefs, OutputDefs, Symbols, PackageSymbols; symbols: SymbolTable.Base; Decimal3: OutputDefs.NumberFormat = [base: 10, unsigned: TRUE, zerofill: FALSE, columns: 3]; Decimal5: OutputDefs.NumberFormat = [base: 10, unsigned: TRUE, zerofill: FALSE, columns: 5]; Octal5: OutputDefs.NumberFormat = [base: 8, unsigned: TRUE, zerofill: FALSE, columns: 5]; epMap: LONG POINTER TO ARRAY [0..0) OF HTIndex; CreateEpMap: PROCEDURE = BEGIN max: CARDINAL ← 0; Count: PROCEDURE [bti: BTIndex] RETURNS [stop: BOOLEAN] = BEGIN stop ← FALSE; WITH b: symbols.bb[bti] SELECT FROM Callable => IF ~b.inline THEN max ← MAX[b.entryIndex, max]; ENDCASE; END; Enter: PROCEDURE [bti: BTIndex] RETURNS [stop: BOOLEAN] = BEGIN stop ← FALSE; WITH b: symbols.bb[bti] SELECT FROM Callable => IF ~b.inline THEN epMap[b.entryIndex] ← symbols.NameForSe[b.id]; ENDCASE; END; [] ← symbols.EnumerateBodies[FIRST[BTIndex], Count]; epMap ← LongStorage.Node[max + 1]; [] ← symbols.EnumerateBodies[FIRST[BTIndex], Enter]; END; PrintOuterPackTable: PROCEDURE = BEGIN OPEN s: symbols; opb: LONG DESCRIPTOR FOR ARRAY OF OuterPackRecord ← DESCRIPTOR[ (s.stHandle + s.stHandle.outerPackBlock.offset), (s.stHandle.outerPackBlock.size / SIZE[OuterPackRecord])]; opr: OuterPackRecord; PutString["OuterPackTable"]; PutCR[]; PutCR[]; FOR i: OPIndex IN [0..LENGTH[opb]) DO opr ← opb[i]; PutNumber[i, Decimal3]; PutString[": hti:"L]; PutNumber[opr.hti, Decimal5]; PutString[" ("L]; PrintHti[opr.hti]; PutString["), ep: "]; PutOctal[opr.entryIndex]; PutString[" ("L]; PutOctal[cspp.entry[opr.entryIndex].initialpc*2]; PutString["), len: "]; PutOctal[opr.length]; IF opr.firstSon # IPNull THEN {PutString[", son: "L]; PutDecimal[opr.firstSon]}; IF opr.resident THEN PutString[", resident"L]; IF opr.placed THEN PutString[", placed"L]; IF opr.attr1 THEN PutString[", attr1"L]; IF opr.attr2 THEN PutString[", attr2"L]; PutCR[]; ENDLOOP; PutCR[]; PutCR[]; END; PrintInnerPackTable: PROCEDURE = BEGIN OPEN s: symbols; ipb: LONG DESCRIPTOR FOR ARRAY OF InnerPackRecord ← DESCRIPTOR[ (s.stHandle + s.stHandle.innerPackBlock.offset), (s.stHandle.innerPackBlock.size / SIZE[InnerPackRecord])]; ipr: InnerPackRecord; PutString["InnerPackTable"]; PutCR[]; PutCR[]; FOR i: IPIndex IN [0..LENGTH[ipb]) DO ipr ← ipb[i]; PutNumber[i, Decimal3]; PutString[": ("L]; PrintHti[epMap[ipr.entryIndex]]; PutString["), ep: "]; PutOctal[ipr.entryIndex]; PutString[" ("L]; PutOctal[cspp.entry[ipr.entryIndex].initialpc*2]; PutString["), len: "]; PutOctal[ipr.length]; IF ipr.lastSon THEN PutString[", lastSon"L]; PutCR[]; ENDLOOP; PutCR[]; PutCR[]; END; PrintConstantTable: PROCEDURE = BEGIN OPEN s: symbols; cstb: LONG DESCRIPTOR FOR ARRAY OF ConstRecord ← DESCRIPTOR[ (s.stHandle + s.stHandle.constBlock.offset), (s.stHandle.constBlock.size / SIZE[ConstRecord])]; PrintEntry: PROCEDURE [i: CARDINAL] = BEGIN cstr: ConstRecord = cstb[i]; PutNumber[cstr.offset, Octal5]; PutString["B, len:"]; PutNumber[cstr.length, Decimal3]; END; PutString["ConstantTable"]; PutCR[]; PutCR[]; PrintByColumns[PrintEntry, LENGTH[cstb], 3, 4]; PutCR[]; PutCR[]; END; PrintByColumns: PROCEDURE [ PrintOne: PROCEDURE [i: CARDINAL], nItems, nColumns, spaceBetween: CARDINAL] = BEGIN nc: CARDINAL; delta: CARDINAL ← (nItems + nColumns - 1)/nColumns; last: BOOLEAN; FOR i: CARDINAL IN [0..delta) DO nc ← 0; last ← FALSE; FOR j: CARDINAL ← i, j + delta WHILE ~last AND j < nItems DO nc ← nc + 1; last ← nc = nColumns; PrintOne[j]; IF ~last THEN THROUGH [0..spaceBetween) DO PutChar[Ascii.SP]; ENDLOOP; ENDLOOP; PutCR[]; ENDLOOP; END; cspp: LONG POINTER TO PrincOps.CSegPrefix; PackInfo: PROCEDURE [root: STRING] = BEGIN bcdFile: STRING ← [40]; cseg, sseg: FileSegment.Pages; codeSpace: Space.Handle; Strings.AppendString[bcdFile, root]; FOR i: CARDINAL IN [0..bcdFile.length) DO IF bcdFile[i] = '. THEN {bcdFile.length ← i; EXIT}; ENDLOOP; Strings.AppendString[bcdFile, ".bcd"]; [symbols: sseg, code: cseg] ← Load[bcdFile ! NoFGT => RESUME; NoCode => GO TO badformat; NoSymbols, IncorrectVersion, MultipleModules => GOTO badformat; NoFile => BEGIN ListerDefs.WriteString[" "L]; ListerDefs.WriteString[bcdFile]; ListerDefs.WriteString[" not found"L]; GOTO badname; END]; symbols ← SymbolTable.Acquire[sseg]; ListerDefs.SetRoutineSymbols[symbols]; codeSpace ← ListerDefs.MapPages[cseg]; cspp ← codeSpace.LongPointer; IF cspp.header.info.altoCode THEN ListerDefs.WriteString["Not Dstar"L] ELSE BEGIN CreateEpMap[]; OutputDefs.OpenOutput[root, ".pl"]; WriteFileID[]; PrintOuterPackTable[]; PrintInnerPackTable[]; PrintConstantTable[]; OutputDefs.CloseOutput[]; LongStorage.Free[epMap]; END; SymbolTable.Release[symbols]; Space.Delete[codeSpace]; EXITS badformat => ListerDefs.WriteString["Bad Format!"]; badname => NULL; END; PackInfoInConfig: PROCEDURE [config, module: STRING] = BEGIN bcdFile: STRING ← [40]; mti: BcdDefs.MTIndex; mth: BcdOps.MTHandle; bcd: BcdOps.BcdBase; cseg, sseg, bcdseg: FileSegment.Pages; bcdSpace, codeSpace: Space.Handle; Strings.AppendString[bcdFile, config]; FOR i: CARDINAL IN [0..bcdFile.length) DO IF bcdFile[i] = '. THEN {bcdFile.length ← i; EXIT}; ENDLOOP; Strings.AppendString[bcdFile, ".bcd"]; [symbols: sseg, code: cseg, bcd: bcdseg, mti: mti] ← LoadFromConfig[ configName: bcdFile, moduleName: module ! NoFGT => RESUME; NoCode => GO TO badformat; NoSymbols, IncorrectVersion, MultipleModules => GOTO badformat; NoFile => BEGIN ListerDefs.WriteString[" "L]; ListerDefs.WriteString[bcdFile]; ListerDefs.WriteString[" not found"L]; GOTO badname; END]; symbols ← SymbolTable.Acquire[sseg]; ListerDefs.SetRoutineSymbols[symbols]; bcdSpace ← ListerDefs.MapPages[bcdseg]; bcd ← bcdSpace.LongPointer; mth ← @LOOPHOLE[bcd + bcd.mtOffset, BcdDefs.Base][mti]; codeSpace ← ListerDefs.MapPages[cseg]; cspp ← codeSpace.LongPointer + mth.code.offset; IF cspp.header.info.altoCode THEN ListerDefs.WriteString["Not Dstar"L] ELSE BEGIN CreateEpMap[]; OutputDefs.OpenOutput[module, ".pl"]; WriteFileID[]; PrintOuterPackTable[]; PrintInnerPackTable[]; PrintConstantTable[]; OutputDefs.CloseOutput[]; LongStorage.Free[epMap]; END; SymbolTable.Release[symbols]; Space.Delete[bcdSpace]; Space.Delete[codeSpace]; EXITS badformat => ListerDefs.WriteString["Bad Format!"]; badname => NULL; END; command: CommanderOps.CommandBlockHandle; command ← CommanderOps.AddCommand["PackInfo", LOOPHOLE[PackInfo], 1]; command.params[0] ← [type: string, prompt: "Filename"]; command ← CommanderOps.AddCommand["PackInfoInConfig", LOOPHOLE[PackInfoInConfig], 2]; command.params[0] ← [type: string, prompt: "ConfigName"]; command.params[1] ← [type: string, prompt: "ModName"]; END.