DIRECTORY
Exec USING [AddCommand, ExecProc, FreeTokenString, GetToken,
OutputProc],
Format USING [StringProc, Text, CR],
MStream USING [Handle, ReadOnly, WriteOnly, Error],
Stream USING [Delete, PutString],
PrintingDefs USING [],
SymbolTableDefs USING [InitializeSymbolTable, FinalizeSymbolTable,
echoSymbolTables],
ParseDefs USING [Parse];
Main: PROGRAM
IMPORTS Exec, Format, MStream, Stream, ParseDefs, SymbolTableDefs
EXPORTS PrintingDefs =
BEGIN
inStream, outStream: MStream.Handle;
ExecOutProc: Format.StringProc;
outProc: PUBLIC POINTER TO Format.StringProc;
inFile: LONG STRING ← NIL;
outFile: LONG STRING ← [60];
echoSource: PUBLIC BOOLEAN; -- echo input as Mesa comments
echoOutput: PUBLIC BOOLEAN; -- echo output to executive
ParseIt: Exec.ExecProc = -- PROC [h: Exec.Handle]
BEGIN
i: CARDINAL;
switches: LONG STRING;
reverse: BOOLEAN;
FileOutputProc: Format.StringProc ←
BEGIN
IF echoOutput THEN Format.Text[ExecOutProc, s];
Stream.PutString[outStream, s];
END;
outProc ← @FileOutputProc;
ExecOutProc ← Exec.OutputProc[h];
SymbolTableDefs.InitializeSymbolTable[];
-- get input file name
[token: inFile, switches: switches] ← Exec.GetToken[h];
IF inFile = NIL THEN RETURN;
-- process the switches
echoSource ← FALSE;
echoOutput ← FALSE;
SymbolTableDefs.echoSymbolTables ← FALSE;
reverse ← TRUE;
IF switches # NIL THEN
FOR i IN [0..switches.length) DO
SELECT switches.text[i] FROM
'~ => reverse ← FALSE;
'c, 's => {
echoSource ← reverse;
reverse ← TRUE; };
'e => {
echoOutput ← reverse;
reverse ← TRUE; };
't => {
SymbolTableDefs.echoSymbolTables ← reverse;
reverse ← TRUE; };
ENDCASE => NULL;
ENDLOOP;
-- construct output file name from input file name,
-- change sufix to ".mesa"
i ← 0;
DO
outFile.text[i] ← inFile.text[i];
i ← i + 1;
-- look for the end of string or a period ('.)
IF i >= inFile.length OR inFile.text[i] = '. THEN EXIT
ENDLOOP;
outFile.text[i] ← '.; outFile.text[i+1] ← 'm; outFile.text[i+2] ← 'e;
outFile.text[i+3] ← 's; outFile.text[i+4] ← 'a; outFile.length ← i + 5;
-- open the input and output files
inStream ← MStream.ReadOnly[name: inFile, release: [] !
MStream.Error => {
Format.Text[ExecOutProc, "Error opening input file: "L];
Format.Text[ExecOutProc, inFile];
Format.CR[ExecOutProc];
GO TO BadFile; }; ];
outStream ← MStream.WriteOnly[name: outFile, release: [], type: text !
MStream.Error => {
Format.Text[ExecOutProc, "Error opening output file: "L];
Format.Text[ExecOutProc, outFile];
Format.CR[ExecOutProc];
GO TO BadFile; }; ];
ParseDefs.Parse[inStream];
Stream.Delete[inStream];
Stream.Delete[outStream];
SymbolTableDefs.FinalizeSymbolTable[];
inFile ← Exec.FreeTokenString[inFile];
switches ← Exec.FreeTokenString[switches];
EXITS
BadFile => NULL;
END;
Exec.AddCommand["CToMesa.~", ParseIt];
END.