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.