File: MPCMainLine.Mesa
Last Edited by: McCreight, July 2, 1985 10:20:23 am PDT
DIRECTORY
Commander, CommandTool, FS, IO, IODefs, List, MPCParserDefs, PartitionDefs, Process, ProcessProps, Rope;
MPCMainLine: CEDAR MONITOR
IMPORTS
Commander, CommandTool, FS, IO, IODefs, MPCParserDefs, PartitionDefs, Process, ProcessProps
=
BEGIN
locked: BOOLFALSE;
GotLock: ENTRY PROC RETURNS [BOOL] =
BEGIN
IF locked THEN RETURN[FALSE];
locked ← TRUE;
RETURN[TRUE];
END;
MebesConvert: PROC [cmd: Commander.Handle] RETURNS [result: REFNIL, msg: Rope.ROPENIL] -- Commander.CommandProc -- =
BEGIN
IF GotLock[] THEN
TRUSTED { Process.Detach[FORK DoConversion[cmd, ProcessProps.GetPropList[]]] }
ELSE cmd.out.PutRope["\n...can't, because MebesConvert is already running and can't run in two processes at the same time.\n"];
END; -- of MebesConvert
DoConversion: PROC [cmd: Commander.Handle, callerProps: List.AList] =
BEGIN
ReallyDoConversion -- sigh! -- : PROC =
BEGIN
ENABLE {ABORTED => GOTO UserAbort; UNWIND => locked ← FALSE};
argList: LIST OF Rope.ROPE;
cStream: IO.STREAM;
CommandTool.StarExpansion[cmd];
argList ← CommandTool.ParseToList[cmd].list;
Process.SetPriority[Process.priorityBackground];
IODefs.WriteLine["\n\n--- Cedar MPC Mebes Converter of February 1, 1985 ---"];
IF argList=NIL THEN
BEGIN
IODefs.WriteLine["..command line needs a file name for the plan (.mpc) file"];
GOTO Punt;
END;
cStream ← FS.StreamOpen[argList.first
! FS.Error =>
BEGIN
IODefs.WriteLine[IO.PutFR["..can't open plan file \"%g\".", IO.rope[argList.first]]];
GOTO Punt;
END];
DO IODefs.WriteChar[cStream.GetChar[! IO.EndOfStream => EXIT]] ENDLOOP;
IODefs.PrintTime["Starting syntax check of plan"];
cStream.SetIndex[0];
IF MPCParserDefs.Scan[cStream, FALSE] # 0 --syntax check
THEN {IODefs.WriteLine["Syntax errors."]; GOTO Punt};
IODefs.PrintTime["Plan OK - Starting conversion"];
cStream.SetIndex[0];
[] ← MPCParserDefs.Scan[cStream, TRUE]; --and execute it
IODefs.PrintTime["Finished."];
locked ← FALSE;
EXITS
UserAbort =>
{[] ← PartitionDefs.DestroyPartitions[]; IODefs.WriteLine[""]; IODefs.PrintTime["Conversion aborted by user"]; locked ← FALSE};
Punt => {IODefs.WriteLine[""]; IODefs.PrintTime["Conversion aborted"]; locked ← FALSE};
END; -- of ReallyDoConversion
ProcessProps.AddPropList[callerProps, ReallyDoConversion];
END; -- of DoConversion
Commander.Register["MebesConvert", MebesConvert, "MPC CIF-to-Mebes converter."];
END.