<> <> <> <> <> DIRECTORY Commander USING [ CommandProc, Register ], FS USING [ Error, StreamOpen ], GenerateTables USING [ Bottle ], IO USING [ int, rope, RIS, STREAM, Close, EndOfStream, GetTokenRope, IDProc, PutF, PutFR ], OneCasabaParser USING [ GetReportStream, UnRecoverableSyntaxError ], Rope USING [ ROPE, Concat, Equal, Length, Replace, Substr ], SiroccoATDef USING [ ProgramNode ], SiroccoParserDef USING [ ParseOneStream ], SiroccoPrivate USING [ AquireState, Collapse, EndItAll, GenAuxDefs, GenAuxImpl, GenCImpl, GenDefs, GenSImpl, Handle, TypeGraph, Object ], ThreeC4Support USING [ GetReportStream ]; SiroccoDriver: CEDAR PROGRAM IMPORTS Commander, FS, GenerateTables, IO, OneCasabaParser, Rope, SiroccoParserDef, SiroccoPrivate, ThreeC4Support ~ { OPEN SiroccoPrivate; ROPE: TYPE ~ Rope.ROPE; debugFlags: CARDINAL _ 0; usage: ROPE ~ "\tusage: filename[.cr]"; doc: ROPE ~ Rope.Concat[" Translate Courier programs into Cedar Stubs\n", usage]; Sirocco: Commander.CommandProc ~ { h: Handle _ NEW [Object]; ProcessParseTree: PROC [ root: REF ] RETURNS [ errorFlag: BOOL _ FALSE ] ~ { pgm: SiroccoATDef.ProgramNode ~ NARROW[root]; typegraph: SiroccoPrivate.TypeGraph; [h.programName, h.programNo, h.versionNo, typegraph] _ pgm.procs.MakeSymbolTable[pgm ! OneCasabaParser.GetReportStream => { errorFlag _ TRUE; IO.PutF[cmd.out, "\nSyntax Error\nNo recovery found.\n"]; RESUME[cmd.out] }; ThreeC4Support.GetReportStream => { errorFlag _ TRUE; RESUME[cmd.out] }; EndItAll => { IO.PutF[cmd.out, "\nMission Aborted, need help.... "]; errorFlag _ TRUE; }; AquireState => { RESUME[h]; }; ]; }; errorFlag: BOOLEAN _ FALSE; specName: ROPE; root: REF; rootName: ROPE; { < IO.Close[commandLineStream];>> commandLineStream: IO.STREAM _ IO.RIS[cmd.commandLine]; rootName _ IO.GetTokenRope[commandLineStream, IO.IDProc ! IO.EndOfStream => { rootName _ NIL; CONTINUE } ].token; { len: INT ~ Rope.Length[rootName]; IF ( ( len > 3) AND ( Rope.Equal[ Rope.Substr[rootName, (len-3), 3], ".cr", FALSE ] ) ) THEN { specName _ rootName; rootName _ Rope.Substr[rootName, 0, (len-3)] } ELSE { specName _ Rope.Concat[rootName, ".cr"] }; }; IO.Close[commandLineStream]; IF ( rootName = NIL ) THEN { msg _ usage; GOTO ERRMSG2; }; }; { < IO.Close[sourceStream];>> sourceStream: IO.STREAM _ FS.StreamOpen[specName ! FS.Error => IF (error.group = user) THEN { msg _ IO.PutFR["%g", IO.rope[error.explanation]]; GOTO ERRMSG2; } ]; root _ NARROW[SiroccoParserDef.ParseOneStream[sourceStream, debugFlags, cmd.out ! OneCasabaParser.GetReportStream => { errorFlag _ TRUE; IO.PutF[cmd.out, "\nSyntax Error in %g: ", IO.rope[specName]]; RESUME[cmd.out] }; OneCasabaParser.UnRecoverableSyntaxError => { errorFlag _ TRUE; IO.PutF[cmd.out, "\nSyntax Error in %g : ", IO.rope[specName]]; GOTO ERRMSG; } ]]; IO.Close[sourceStream]; }; IF ( errorFlag ) THEN GOTO ERRMSG; IF ( ProcessParseTree[root] ) THEN GOTO ERRMSG; h.programKeyWD _ IO.PutFR["%gP%gV%g", IO.rope[h.programName], IO.int[h.programNo], IO.int[h.versionNo] ]; h.programKey _ Rope.Concat[h.programKeyWD, "."]; { ENABLE AquireState => { RESUME[h]; }; prefixLength: INT _ Rope.Length[h.programKey]; outfilePrefix: ROPE _ Rope.Replace[h.programKey, prefixLength.PRED, prefixLength]; Finished: PROC [r: ROPE] ~ { IO.PutF[cmd.out, "\t%g%g\n", IO.rope[outfilePrefix], IO.rope[r] ]; }; IO.PutF[cmd.out, "Files Written:\n"]; Collapse[]; Finished[".Tables"]; GenerateTables.Bottle[]; Finished[".coke"]; GenDefs[]; Finished[".Mesa"]; Finished["Init.Mesa"]; GenAuxDefs[]; Finished["Aux.Mesa"]; GenAuxImpl[]; Finished["AuxImpl.Mesa"]; GenCImpl[]; Finished["ClientImpl.Mesa"]; GenSImpl[]; Finished["ServerImpl.Mesa"]; }; EXITS ERRMSG => { result _ $Failure; msg _ "Call Cobra!"; }; ERRMSG2 => { result _ $Failure; }; }; Commander.Register["Sirocco", Sirocco, doc]; }.