<> <> <> DIRECTORY ThreeC4Support USING[GetReportStream], ThreeC4BaseDecl1Def USING[NameNode], ThreeC4BaseDecl2Def USING[ContextNode], ThreeC4BasicAbTypesDef USING[FindParseTree, WholeFileNode], ThreeC4PrimImplDefs USING[GetNameIds, RecordParseTree, IsErrorName, UnrecoveredError, GlobalEnvHandle, GetGlobalEnv], ThreeC4CentralDef USING[ParseOneStream], FS USING[StreamOpen], IO USING[Close, PutF, rope, STREAM], Rope USING[Cat, ROPE]; ThreeC4PrimImpl5: CEDAR PROGRAM IMPORTS ThreeC4Support, ThreeC4BasicAbTypesDef, ThreeC4PrimImplDefs, ThreeC4CentralDef, FS, IO, Rope EXPORTS ThreeC4BasicAbTypesDef, ThreeC4PrimImplDefs = BEGIN OPEN ThreeC4BaseDecl1Def, ThreeC4BaseDecl2Def, ThreeC4BasicAbTypesDef, ThreeC4PrimImplDefs; sourceFNSuffix: Rope.ROPE _ NIL; -- normal running state = ".7Casaba" targetFNPrefix: Rope.ROPE _ NIL; -- normal running state = "" SetMode: PUBLIC PROC[targetFilesNamePrefix: Rope.ROPE, sourceFilesNameSuffix: Rope.ROPE] = {sourceFNSuffix _ sourceFilesNameSuffix; targetFNPrefix _ targetFilesNamePrefix}; ReadModeInfo: PUBLIC PROC RETURNS[targetFilesNamePrefix: Rope.ROPE, sourceFilesNameSuffix: Rope.ROPE] = {RETURN[targetFNPrefix, sourceFNSuffix]}; ClearMode: PUBLIC PROC = {sourceFNSuffix _ targetFNPrefix _ NIL}; -- parse call ReadAndParseFile: PUBLIC PROC[name: Rope.ROPE] RETURNS[WholeFileNode] = BEGIN sourceStream: IO.STREAM _ FS.StreamOpen[Rope.Cat[name, sourceFNSuffix]]; root: REF ANY _ ThreeC4CentralDef.ParseOneStream[sourceStream, 0, NIL]; IO.Close[sourceStream]; RETURN[NARROW[root]]; END; FindOrReadAndParseTree: PUBLIC PROC[context: ContextNode, name: NameNode] RETURNS[ContextNode, WholeFileNode] = BEGIN tree: WholeFileNode; IF IsErrorName[name] THEN ERROR UnrecoveredError; tree _ FindParseTree[context, name]; IF tree = NIL THEN -- we have to read and parse it BEGIN tree _ ReadAndParseFile[GetNameIds[name].id1.text]; context _ RecordParseTree[context, name, tree]; END; RETURN[context, tree]; END; -- some error handling stuff ReportError: PUBLIC PROC[msg: Rope.ROPE] = BEGIN globalEnv: GlobalEnvHandle; IO.PutF[ThreeC4Support.GetReportStream[], "\N(%g..%g): %g\N", IO.rope[msg]]; globalEnv _ GetGlobalEnv[]; globalEnv.errorCount _ globalEnv.errorCount + 1; END; <<>> END..