-- SExecOpsImpl.mesa; Edited by McGregor on 14-Apr-82 9:43:14
DIRECTORY
ConvertUnsafe USING [ToRope],
CVExecutive USING [AddCommand, CommandProc, GetToken,
UserName, UserPassword],
Directory USING [DeleteFile, Error, ignore, Lookup, GetProps],
ExecOps USING [Outcome], -- [Igor]<PreCascade>Utilities>
Feedback USING [BeginItemProc, CreateProc, DestroyProc, FinishItemProc,
NoteProgressProc, Procs], -- [Igor]<PreCascade>Compiler>
File USING [Capability],
PrincOps, -- <APilot>Mesa>Public>
Rope USING [Compare, Concat, Ref, Int, Size, Substr, ToString],
Runtime USING [ConfigError, IsBound, RunConfig],
SExecOps,
TemporarySpecialExecOps USING [BindUsingFeedback,
CompileUsingFeedback], -- [Igor]<PreCascade>Compiler>
TypeScript USING [CharProc, GetLine, PutChar, PutRope, TS],
UserTerminal USING [BlinkDisplay],
ViewerOps USING [CreateViewer, DestroyViewer, FindViewer, OpenViewer,
RestoreViewer, SetNewFile],
ViewerClasses USING [Viewer],
VirtualDesktops USING [SetName],
WindowManager USING [UnWaitCursor, WaitCursor];
SExecOpsImpl: PROGRAM
IMPORTS ConvertUnsafe, CVExecutive, Directory,
Rope, Runtime, SExecOps, TemporarySpecialExecOps,
TypeScript, UserTerminal, ViewerOps, VirtualDesktops, WindowManager
EXPORTS SExecOps =
BEGIN OPEN TypeScript, ViewerClasses;
LoadAndGo: PROC [file: LONG STRING] RETURNS [name, error: Rope.Ref] = BEGIN
ENABLE BEGIN
Runtime.ConfigError => {SELECT type FROM
invalidConfig => error ← "Illegal bcd format: ";
versionMismatch => error ← "Version mismatch for: ";
ENDCASE => error ← "RunConfig failed for: ";
CONTINUE};
Directory.Error =>
{SELECT type FROM
invalidFileName => error ← "Illegal file name: ";
fileNotFound => error ← "Couldn't find a runnable file named: ";
ENDCASE => error ← "Lookup failed on: ";
CONTINUE};
END;
f: File.Capability;
f ← Directory.Lookup[file];
IF error=NIL THEN Runtime.RunConfig[f, 1
! ABORTED => {error ← "Execution Aborted!"; CONTINUE}];
IF error=NIL THEN [] ← Directory.GetProps[f, file];
IF error=NIL THEN name ← LOOPHOLE[file]
END;
Run: PUBLIC CVExecutive.CommandProc = BEGIN
bug: BOOLEAN ← FALSE;
error: Rope.Ref;
directoryName: Rope.Ref ← param;
length: Rope.Int ← Rope.Size[param];
WindowManager.WaitCursor[];
IF length < 5 OR Rope.Compare[Rope.Substr[param,length-4,4],".bcd",FALSE] # 0
THEN directoryName ← Rope.Concat[param,".bcd"];
[directoryName, error] ← LoadAndGo[LOOPHOLE[Rope.ToString[directoryName]]
! ANY => {bug ← TRUE; CONTINUE}];
IF error#NIL THEN PutRope[ts, error]
ELSE IF bug THEN PutRope[ts, "UNKNOWN ERROR -- Couldn't run: "]
ELSE PutRope[ts, "Loaded and ran: "];
PutRope[ts, IF error=NIL THEN directoryName ELSE param];
WindowManager.UnWaitCursor[];
END;
DirectoryName: PROC [name: LONG STRING] RETURNS [Rope.Ref] = BEGIN
f: File.Capability ← Directory.Lookup[fileName: name, permissions: Directory.ignore];
[] ← Directory.GetProps[f, name];
RETURN [LOOPHOLE[name]]
END;
CheckForFile: PUBLIC PROC [file: Rope.Ref] RETURNS [found: BOOLEAN] = BEGIN
fName: LONG STRING ← LOOPHOLE[Rope.ToString[file]];
found ← TRUE;
[] ← Directory.Lookup[fileName: fName, permissions: Directory.ignore
! Directory.Error => {found ← FALSE; CONTINUE}];
END;
New: PUBLIC CVExecutive.CommandProc = BEGIN
viewer: ViewerClasses.Viewer;
new: BOOLEAN ← FALSE;
directoryName: Rope.Ref;
WindowManager.WaitCursor[];
directoryName ← DirectoryName[LOOPHOLE[Rope.ToString[param]]
! ANY => {directoryName ← param; new ← TRUE; CONTINUE}];
viewer ← ViewerOps.CreateViewer[flavor: $Text, name: directoryName,
file: directoryName, iconic: FALSE, attributes: left];
PutRope[ts, "Created Viewer: "];
PutRope[ts, directoryName];
IF new THEN ViewerOps.SetNewFile[viewer];
WindowManager.UnWaitCursor[];
END;
Old: PUBLIC CVExecutive.CommandProc = BEGIN
found: BOOLEAN;
IF (found ← CheckForFile[Rope.Concat[param, ".mesa"]]) THEN
param ← Rope.Concat[param, ".mesa"]
ELSE found ← CheckForFile[param];
IF found THEN New[ts, param] ELSE BEGIN
PutRope[ts, "Viewer file not found: "];
PutRope[ts, param];
END;
END;
cr: Rope.Ref ← "
"; -- GDF'ing compiler needs a CR at the end of a command
CBCreate: Feedback.CreateProc = BEGIN
--PutRope[gts, ConvertUnsafe.ToRope[system]];
RETURN[NIL];
END;
CBDestroy: Feedback.DestroyProc = BEGIN
PutRope[gts, ConvertUnsafe.ToRope[trailer]];
cbBusy ← FALSE;
END;
CBBeginItem: Feedback.BeginItemProc = BEGIN
PutRope[gts, ConvertUnsafe.ToRope[item]];
END;
CBNoteProgress: Feedback.NoteProgressProc = BEGIN
PutRope[gts, " ."];
END;
CBFinishItem: Feedback.FinishItemProc = BEGIN
--PutRope[gts, OutComesRope[outcome]];
PutChar[gts, ' ];
PutRope[gts, ConvertUnsafe.ToRope[trailer]];
PutChar[gts, 15C];
END;
cbProcs: Feedback.Procs ← [CBCreate, CBDestroy, CBBeginItem,
CBNoteProgress, CBFinishItem];
cbBusy: BOOLEAN ← FALSE;
cmdText: REF StringBody;
cmd: LONG POINTER TO PACKED ARRAY [0..0) OF CHARACTER;
gts: TypeScript.TS;
Bind: PUBLIC CVExecutive.CommandProc = BEGIN
outCome: ExecOps.Outcome;
log: ViewerClasses.Viewer;
IF cbBusy THEN BEGIN
PutRope[ts, "Binder or Compiler is busy, try again later!"];
RETURN;
END;
cmdText ← LOOPHOLE[Rope.ToString[Rope.Concat[param, cr]]];
cmd ← LOOPHOLE[@(cmdText.text)];
cbBusy ← TRUE;
gts ← ts;
IF ~Runtime.IsBound[TemporarySpecialExecOps.BindUsingFeedback] THEN
BEGIN
PutRope[ts, "Loading Binder.bcd...
"];
Runtime.RunConfig[Directory.Lookup["Binder.bcd"], 1];
END;
outCome ← TemporarySpecialExecOps.BindUsingFeedback[cmd, @cbProcs];
log ← ViewerOps.FindViewer["Binder.log"];
IF log#NIL THEN BEGIN
IF outCome=ok THEN ViewerOps.DestroyViewer[log]
ELSE BEGIN
ViewerOps.RestoreViewer[log];
IF log.iconic THEN ViewerOps.OpenViewer[log];
END;
END
ELSE IF outCome#ok THEN {PutChar[ts, 15C]; Old[ts, "Binder.log"]};
END;
Compile: PUBLIC CVExecutive.CommandProc = BEGIN
outCome: ExecOps.Outcome;
log: ViewerClasses.Viewer;
IF cbBusy THEN BEGIN
PutRope[ts, "Compiler or Binder is busy, try again later!"];
RETURN;
END;
cmdText ← LOOPHOLE[Rope.ToString[Rope.Concat[param, cr]]];
cmd ← LOOPHOLE[@(cmdText.text)];
cbBusy ← TRUE;
gts ← ts;
IF ~Runtime.IsBound[TemporarySpecialExecOps.CompileUsingFeedback] THEN
BEGIN
PutRope[ts, "Loading Compiler.bcd...
"];
Runtime.RunConfig[Directory.Lookup["Compiler.bcd"], 1];
END;
outCome ← TemporarySpecialExecOps.CompileUsingFeedback[cmd, @cbProcs];
log ← ViewerOps.FindViewer["Compiler.log"];
IF log#NIL THEN BEGIN
IF outCome=ok THEN ViewerOps.DestroyViewer[log]
ELSE BEGIN
ViewerOps.RestoreViewer[log];
IF log.iconic THEN ViewerOps.OpenViewer[log];
END;
END
ELSE IF outCome#ok THEN {PutChar[ts, 15C]; Old[ts, "Compiler.log"]};
END;
DeleteFiles: PUBLIC CVExecutive.CommandProc = BEGIN
offset: LONG INTEGER ← 0;
file: Rope.Ref;
first: BOOLEAN ← TRUE;
Delete: PROC [file: Rope.Ref] = BEGIN
failed: BOOLEAN ← FALSE;
Directory.DeleteFile[LOOPHOLE[Rope.ToString[file]]
! Directory.Error => {failed ← TRUE; CONTINUE}];
PutRope[ts, IF failed THEN "File not found: " ELSE "Deleted: "];
PutRope[ts, file]
END;
DO [file, offset] ← CVExecutive.GetToken[param, offset];
IF Rope.Size[file]=0 THEN EXIT;
IF first THEN first ← FALSE ELSE PutChar[ts, 15C];
Delete[file];
ENDLOOP;
END;
DoOpen: PROC [file: Rope.Ref] = BEGIN
viewer: Viewer ← ViewerOps.FindViewer[file];
new: BOOLEAN ← FALSE;
directoryName: Rope.Ref;
IF viewer#NIL THEN {IF viewer.iconic THEN ViewerOps.OpenViewer[viewer]; RETURN};
WindowManager.WaitCursor[];
directoryName ← DirectoryName[LOOPHOLE[Rope.ToString[file]]
! ANY => {directoryName ← file; new ← TRUE; CONTINUE}];
IF new THEN {UserTerminal.BlinkDisplay[]; WindowManager.UnWaitCursor[]; RETURN};
viewer ← ViewerOps.CreateViewer[flavor: $Text, name: directoryName,
file: directoryName, iconic: FALSE, attributes: left];
WindowManager.UnWaitCursor[];
END;
Login: CVExecutive.CommandProc = BEGIN
UserCharProc: TypeScript.CharProc = BEGIN
SELECT char FROM
15C, ' , 33C => RETURN[TRUE, TRUE];
177C => RETURN[FALSE, FALSE];
ENDCASE => RETURN[TRUE, FALSE];
END;
PswdCharProc: TypeScript.CharProc = BEGIN
SELECT char FROM
1C, 27C => RETURN[TRUE, FALSE];
177C => RETURN[FALSE, FALSE];
15C, ' , 33C => RETURN[FALSE, TRUE];
ENDCASE => {TypeScript.PutChar[ts, '*]; RETURN[FALSE, FALSE]};
END;
PutRope[ts, "User: "];
IF CVExecutive.UserName#NIL THEN ts.class.notify[ts, LIST[CVExecutive.UserName]];
CVExecutive.UserName ← TypeScript.GetLine[ts, FALSE, UserCharProc];
PutRope[ts, "Password: "];
CVExecutive.UserPassword ← TypeScript.GetLine[ts, FALSE, PswdCharProc];
END;
Name: CVExecutive.CommandProc = BEGIN
VirtualDesktops.SetName[param];
PutRope[ts, "This virtual desktop has been named: "];
PutRope[ts, param];
END;
CVExecutive.AddCommand["?", SExecOps.Help, "Display this message."];
CVExecutive.AddCommand["Bind", Bind, "Bind a list of configurations."];
CVExecutive.AddCommand["Compile", Compile, "Compile a list of modules."];
CVExecutive.AddCommand["Delete", DeleteFiles, "Delete a list of files."];
CVExecutive.AddCommand["Login", Login, "Supply user name and password."];
CVExecutive.AddCommand["Name", Name, "Specify a new name for current virtual desktop."];
CVExecutive.AddCommand["New", New, "Create a viewer (possibly new file)."];
CVExecutive.AddCommand["Old", Old, "Create a viewer (old file only)."];
CVExecutive.AddCommand["Run", Run, "Load and Run the named program."];
END.