<> <> <> <> <> <> <<>> DIRECTORY Feedback, FeedbackTypes, FileNames, FS, GGFileOps, Imager, InterpressInterpreter, IO, IPMaster, PFS, Rope, SystemNames; GGFileOpsImpl: CEDAR PROGRAM IMPORTS Feedback, FileNames, FS, Imager, InterpressInterpreter, IO, IPMaster, PFS, Rope, SystemNames EXPORTS GGFileOps = BEGIN MsgRouter: TYPE = FeedbackTypes.MsgRouter; <> GetGenericFileName: PUBLIC PROC [opRope, fileName, wDir, defaultExt: Rope.ROPE, illegalExts: LIST OF Rope.ROPE, router: MsgRouter, emergency: BOOL ¬ FALSE] RETURNS [fullName: Rope.ROPE ¬ NIL, success: BOOL ¬ TRUE, versionSpecified: BOOL ¬ FALSE] = { cp: FS.ComponentPositions; extRope: Rope.ROPE; versionSpecified ¬ Rope.SkipTo[s: fileName, skip: "!"]#Rope.Length[fileName]; IF Rope.Equal[fileName, NIL] THEN { success ¬ FALSE; IF NOT emergency THEN Feedback.PutF[router, oneLiner, $Complaint, "%g failed: no file name specified", [rope[opRope]] ]; RETURN; }; [fullName, cp, ] ¬ FS.ExpandName[fileName, wDir ! FS.Error => { success ¬ FALSE; IF NOT emergency THEN Feedback.PutFL[router, oneLiner, $Complaint, "%g failed: FS Error during name expansion of %g", LIST[[rope[opRope]], [rope[fileName]]] ]; CONTINUE; } ]; IF NOT success THEN RETURN; extRope ¬ Rope.Substr[base: fullName, start: cp.ext.start, len: cp.ext.length]; FOR ropeList: LIST OF Rope.ROPE ¬ illegalExts, ropeList.rest UNTIL ropeList=NIL DO IF Rope.Equal[ropeList.first, extRope, FALSE] THEN { success ¬ FALSE; IF NOT emergency THEN Feedback.PutFL[router, oneLiner, $Complaint, "%g failed: %g extension for %g files not allowed", LIST[[rope[opRope]], [rope[extRope]], [rope[defaultExt]]] ]; RETURN; }; ENDLOOP; IF cp.ext.length=0 THEN fullName ¬ Rope.Cat[fullName, ".", defaultExt]; fullName ¬ FileNames.ResolveRelativePath[fullName]; }; FNameToGName: PUBLIC PROC [name: Rope.ROPE] RETURNS [Rope.ROPE] = { <> gHost, gDir: Rope.ROPE; IF Rope.Match["[]*", name] THEN { gHost ¬ Rope.Cat["[", SystemNames.MachineName[], "]"]; gDir ¬ Rope.Cat[gHost, "<", --File.GetVolumeName[File.SystemVolume[]],-- ">"]; IF Rope.Match["[]<>*", name] THEN RETURN [Rope.Replace[base: name, start: 0, len: 4, with: gDir]] ELSE RETURN [Rope.Replace[base: name, start: 0, len: 2, with: gHost]]; }; RETURN [name]; }; PeriodBreakProc: SAFE PROC [char: CHAR] RETURNS [IO.CharClass] = { SELECT char FROM '. => RETURN[sepr]; ENDCASE => RETURN[other]; }; FilenameMinusExtension: PUBLIC PROC [wholeName: Rope.ROPE] RETURNS [firstPart: Rope.ROPE] = { wholeStream: IO.STREAM ¬ IO.RIS[wholeName]; [firstPart, ----] ¬ IO.GetTokenRope[wholeStream, PeriodBreakProc]; }; <> GetInterpressFileName: PUBLIC PROC [opRope, ipName: Rope.ROPE, currentWDir: Rope.ROPE, router: MsgRouter] RETURNS [fullName: Rope.ROPE ¬ NIL, success: BOOL ¬ TRUE] = { [fullName, success, ----] ¬ GetGenericFileName[opRope, ipName, currentWDir, "ip", LIST["gargoyle", "script", "mesa", "tioga"], router]; }; GetGargoyleFileName: PUBLIC PROC [opRope, ggName: Rope.ROPE, currentWDir: Rope.ROPE, router: MsgRouter, emergency: BOOL ¬ FALSE] RETURNS [fullName: Rope.ROPE ¬ NIL, success: BOOL ¬ TRUE, versionSpecified: BOOL ¬ FALSE] = { [fullName, success, versionSpecified] ¬ GetGenericFileName[opRope, ggName, currentWDir, "gargoyle", LIST["ip", "interpress", "script", "mesa", "tioga"], router, emergency]; }; GetScriptFileName: PUBLIC PROC [opRope, scriptName: Rope.ROPE, currentWDir: Rope.ROPE, router: MsgRouter] RETURNS [fullName: Rope.ROPE ¬ NIL, success: BOOL ¬ TRUE] = { [fullName, success, ----] ¬ GetGenericFileName[opRope, scriptName, currentWDir, "script", LIST["gargoyle", "ip", "interpress", "mesa", "tioga"], router]; }; <> OpenInterpressOrComplain: PUBLIC PROC [opRope: Rope.ROPE, router: MsgRouter, fullName: Rope.ROPE] RETURNS [ipMaster: InterpressInterpreter.Master, success: BOOL ¬ TRUE] = { LogIt: InterpressInterpreter.LogProc = { Feedback.PutFL[router, oneLiner, $Log, "%g: %g", LIST[[rope[opRope]], [rope[explanation]]] ]; }; ipMaster ¬ InterpressInterpreter.Open[fileName: fullName, log: LogIt ! <> < { -- raised if the file is non-existant>> <> <> <<};>> FS.Error => { Feedback.PutFL[router, oneLiner, $Complaint, "%g failed: %g for %g", LIST[[rope[opRope]], [rope[error.explanation]], [rope[fullName]]] ]; GOTO Quit; }; PFS.Error => { -- yuck: maybe InterpressInterpreter.Open shouldn't raise either FS or PFS errors! Feedback.PutFL[router, oneLiner, $Complaint, "%g failed: %g for %g", LIST[[rope[opRope]], [rope[error.explanation]], [rope[fullName]]] ]; GOTO Quit; }; IPMaster.Error => { -- ErrorDesc: TYPE = RECORD[code: ATOM, explanation: ROPE] Feedback.PutFL[router, oneLiner, $Complaint, "%g failed: %g for %g", LIST[[rope[opRope]], [rope[error.explanation]], [rope[fullName]]] ]; GOTO Quit; }; -- need this even with LogProc#NIL Imager.Error => { -- ErrorDesc: TYPE = RECORD [code: ATOM, explanation: ROPE] Feedback.PutFL[router, oneLiner, $Complaint, "%g failed: %g for %g", LIST[[rope[opRope]], [rope[error.explanation]], [rope[fullName]]] ]; GOTO Quit; }; IO.Error, IO.EndOfStream => { Feedback.PutFL[router, oneLiner, $Complaint, "%g failed: IO Stream Error for %g", LIST[[rope[opRope]], [rope[fullName]]] ]; GOTO Quit; }; ]; IF ipMaster=NIL THEN { Feedback.PutFL[router, oneLiner, $Complaint, "%g failed: missing file or IO error for %g", LIST[[rope[opRope]], [rope[fullName]]] ]; GOTO Quit; }; IF ipMaster.pages=0 THEN { Feedback.PutFL[router, oneLiner, $Complaint, "%g failed: zero pages in %g", LIST[[rope[opRope]], [rope[fullName]]] ]; GOTO Quit; }; EXITS Quit => success ¬ FALSE; }; END.