GGFileOpsImpl.mesa
Copyright Ó 1986, 1988, 1989, 1990, 1992 by Xerox Corporation. All rights reserved.
Contents: Routines that manipulate file names or open and close files.
Pier, June 24, 1992 10:25 am PDT
Bier, March 10, 1990 5:34:06 pm PST
Doug Wyatt, April 9, 1992 5:04 pm PDT
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;
Generic File Name Operations
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] = {
code copied from CommandTool.OtherCommandsImpl.mesa
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];
};
Convenience File Name Operations for Gargoyle Use
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];
};
Generic File Opening Operations
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 !
IPInterpreter.Error will no longer be raised, but expect a NIL master to be returned. KAP. June 24, 1992
IPInterpreter.Error => { -- raised if the file is non-existant
Feedback.PutFL[router, oneLiner, $Complaint, "%g failed: %g for %g",
LIST[[rope[opRope]], [rope[explanation]], [rope[fullName]]] ];
GOTO Quit;
};
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.