ListInterface.mesa
modified by Bruce, 13-Jan-81 11:04:10
modified by Satterthwaite, September 20, 1982 1:39 pm
DIRECTORY
Ascii USING [CR],
CommanderOps USING [AddCommand, CommandBlockHandle],
FileSegment: TYPE USING [Pages, nullPages],
ListerDefs USING [
IncorrectVersion, Load, MultipleModules, NoCode, NoFGT, NoFile,
NoSymbols, PrintSei, SetRoutineSymbols, WriteFileID, WriteString],
OutputDefs USING [
CloseOutput, NumberFormat, OpenOutput, PutChar, PutNumber, PutString],
Strings USING [AppendString],
Symbols USING [ISEIndex, ISENull, TransferMode],
SymbolTable USING [Acquire, Base, Release];
ListInterface: PROGRAM
IMPORTS
CommanderOps, ListerDefs, OutputDefs, Strings, SymbolTable = {
OPEN ListerDefs, OutputDefs, Symbols;
symbols: SymbolTable.Base;
PrintInterface: PROC = {
OPEN symbols;
sei: ISEIndex;
FOR sei ← FirstCtxSe[stHandle.outerCtx], NextSe[sei] UNTIL sei = ISENull DO
SELECT LinkMode[sei] FROM
val => {
PutValue[seb[sei].idValue, sei];
PutModeName[XferMode[seb[sei].idType]];
PutChar[Ascii.CR]};
ref => {
PutValue[seb[sei].idValue, sei];
PutString["EXPORTED Variable"L];
PutChar[Ascii.CR]};
manifest => NULL; -- constant
ENDCASE;
ENDLOOP};
PutValue: PROC [u: UNSPECIFIED, sei: ISEIndex] = {
number: NumberFormat = NumberFormat[10, FALSE, FALSE, 4];
PutNumber[u, number];
PutString[" -- "L];
PrintSei[sei];
PutString[": "L]};
ModePrintName: ARRAY TransferMode OF STRING = [
"PROC"L, "PORT"L, "SIGNAL"L, "ERROR"L, "PROCESS"L, "PROGRAM"L, "NONE"L];
PutModeName: PROC [n: TransferMode] = {PutString[ModePrintName[n]]};
Interface: PROC [root: STRING] = {
bcdFile: STRING ← [100];
sseg, cseg: FileSegment.Pages;
Strings.AppendString[bcdFile, root];
FOR i: CARDINAL IN [0..bcdFile.length) DO
IF bcdFile[i] = '. THEN EXIT;
REPEAT FINISHED => Strings.AppendString[bcdFile, ".bcd"L];
ENDLOOP;
BEGIN
[code: cseg, symbols: sseg] ← Load[bcdFile
! NoFGT => {RESUME};
NoCode => {RESUME};
NoSymbols, IncorrectVersion, MultipleModules => {GOTO badformat};
NoFile => {GOTO badname}];
IF cseg # FileSegment.nullPages THEN GOTO badformat;
symbols ← SymbolTable.Acquire[sseg];
ListerDefs.SetRoutineSymbols[symbols];
OpenOutput[root, ".il"];
WriteFileID[];
PrintInterface[];
SymbolTable.Release[symbols];
CloseOutput[];
EXITS
badformat => ListerDefs.WriteString["Bad Format!"];
badname => ListerDefs.WriteString["File Not Found!"];
END};
command: CommanderOps.CommandBlockHandle;
command ← CommanderOps.AddCommand["Interface", LOOPHOLE[Interface], 1];
command.params[0] ← [type: string, prompt: "Filename"];
}.