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"];
}.