<> <> 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: BOOL _ FALSE; GotLock: ENTRY PROC RETURNS [BOOL] = BEGIN IF locked THEN RETURN[FALSE]; locked _ TRUE; RETURN[TRUE]; END; MebesConvert: PROC [cmd: Commander.Handle] RETURNS [result: REF _ NIL, msg: Rope.ROPE _ NIL] -- 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.