DIRECTORY Atom, CD, CDCommandOps, CDLayers, CDOps, CDPopUpMenus, CDPrivate, CDProperties, CDSequencer, IO, PopUpMenus, Process, RefTab, Rope, TerminalIO; CDCommandOpsImpl: CEDAR MONITOR IMPORTS Atom, CD, CDLayers, CDOps, CDPopUpMenus, CDProperties, CDSequencer, IO, PopUpMenus, Process, RefTab, TerminalIO EXPORTS CDCommandOps = BEGIN reCheck: CONDITION _ [timeout: Process.MsecToTicks[1000]]; EnterResource: ENTRY PROC [resource: REF, wait: BOOL, design: REF] RETURNS [ok: BOOL] = { IF design=NIL THEN design _ $NIL; DO ok _ RefTab.Insert[resourceTab, resource, design]; IF ok OR ~wait THEN EXIT; WAIT reCheck; ENDLOOP }; LeaveResource: ENTRY PROC [resource: REF] = { [] _ RefTab.Delete[resourceTab, resource]; BROADCAST reCheck }; DoWithResource: PUBLIC PROC [proc: CDSequencer.CommandProc, comm: CDSequencer.Command, resource: REF _ NIL, waitIfBusy: BOOL _ FALSE, messageIfSkipped: BOOL _ TRUE] RETURNS [skipped: BOOL_TRUE] = { design: CD.Design = IF comm#NIL THEN comm.design ELSE NIL; IF skipped _ ~EnterResource[resource, waitIfBusy, design] THEN { IF messageIfSkipped THEN TerminalIO.PutRope[" not reentrant; skipped\n"] } ELSE { proc[comm ! UNWIND => LeaveResource[resource]]; LeaveResource[resource]; } }; unique: INT _ 0; RegisterWithMenu: PUBLIC PROC [menu: REF_NIL, entry: Rope.ROPE_NIL, doc: Rope.ROPE_NIL, key: ATOM_NIL, proc: CDSequencer.CommandProc_NIL, queue: CDSequencer.QueueMethod_doQueue, tech: CD.Technology_NIL] = { IF key=NIL THEN key _ Atom.MakeAtom[IO.PutFR1["a%g", IO.int[unique _ unique+1]]]; IF proc#NIL THEN CDSequencer.ImplementCommand[key: key, proc: proc, queue: queue, technology: tech]; IF menu#NIL THEN [] _ PopUpMenus.Entry[CDPopUpMenus.GetMenu[menu], entry, NIL, key, doc]; }; currentLayerReg: CD.PropRef _ CD.InitPropRef[]; SetCurrentLayer: PROC [comm: CDSequencer.Command] = { x: REF _ CDProperties.GetPropProp[currentLayerReg, comm.design.technology.key, comm.key]; IF x=NIL THEN x _ CDProperties.GetPropProp[currentLayerReg, $all, comm.key]; WITH x SELECT FROM lora: LIST OF REF ANY => { lay: CD.Layer _ CD.errorLayer; w: INT _ -1; WITH lora.first SELECT FROM l: REF CD.Layer => lay _ l^; ENDCASE => NULL; IF lora.rest#NIL THEN WITH lora.rest.first SELECT FROM i: REF INT => w _ i^ ENDCASE => NULL; SELECT TRUE FROM w>=0 => CDLayers.SetLayerWidth[comm.design, lay, w]; w=-2 => CDLayers.SetLayerWidth[comm.design, lay, CDLayers.LayerWidth[comm.design, CD.commentLayer]]; ENDCASE => NULL; --don't change current width of layer CDLayers.SetCurrentLayer[comm.design, lay]; TerminalIO.PutRopes["set default layer: ", CDOps.LayerRope[lay], "\n"]; }; ENDCASE => TerminalIO.PutF["command %g failed\n", [atom[comm.key]]]; }; RegisterCurrentLayerCommand: PUBLIC PROC [key: ATOM, layer: CD.Layer, tech: CD.Technology, w: CD.Number_-1] = { tKey: ATOM _ IF tech#NIL THEN tech.key ELSE $all; CDProperties.PutPropProp[currentLayerReg, tKey, key, LIST[NEW[CD.Layer_layer], NEW[INT_w]]]; CDSequencer.ImplementCommand[key: key, proc: SetCurrentLayer, queue: doQueue, technology: tech]; }; resourceTab: RefTab.Ref ~ RefTab.Create[7]; END. ήCDCommandOpsImpl.mesa Copyright c 1984, 1986 by Xerox Corporation. All rights reserved. Created by Christian Jacobi, July 12, 1984 3:49:16 pm PDT Last Edited by: Christian Jacobi, December 12, 1986 10:04:23 am PST Κi˜codešœ™Kšœ Οmœ7™BKšœ:™:K™CK˜—šΟk ˜ Kšœ˜Kšžœ˜Kšœ ˜ Kšœ ˜ Kšœ˜Kšœ ˜ Kšœ ˜ K˜ K˜ Kšœ˜Kšœ ˜ Kšœ˜Kšœ˜K˜K˜ —K˜šΟnœžœž˜Kšžœžœ<žœ)˜wKšžœ˜—Kšž˜K˜Kšœ ž œ(˜:K˜šŸ œžœžœ žœžœ žœžœžœ˜YKšžœžœžœ˜!šž˜Kšœ2˜2Kšžœžœžœžœ˜Kšžœ ˜ Kšž˜—K˜—K˜šŸ œžœžœ žœ˜-Kšœ*˜*Jšž œ˜K˜—K˜šŸœžœžœFžœžœžœžœžœžœžœ ž œ˜ΕKš œžœ žœžœžœ žœžœ˜:šžœ8žœ˜AKšžœžœ1˜IK˜—šžœ˜Kšœ žœ˜/Kšœ˜K˜—Kšœ˜—K˜Kšœžœ˜šŸœž œžœžœžœžœ žœžœžœžœ žœ0žœ žœ˜ΞKš žœžœžœžœžœ˜Qšžœžœžœ˜KšœS˜S—šžœžœžœ˜Kšœ9žœ ˜H—K˜—K˜Kšœžœ žœ˜/K˜šŸœžœ ˜5JšœžœS˜YJšžœžœžœ?˜Lšžœžœž˜š œžœžœžœžœ˜Kšœžœ žœ ˜Kšœžœ˜ šžœ žœž˜Kšœžœžœ˜Kšžœžœ˜—šžœ žœž˜šžœžœž˜ Kšœžœžœ ˜Kšžœžœ˜——šžœžœž˜Kšœ4˜4KšœRžœ˜dKšžœžœΟc%˜6—Kšœ+˜+KšœG˜GK˜—Kšžœ=˜D—K˜—K˜š Ÿœž œžœ žœžœžœ˜oKš œžœžœžœžœ žœ˜1Jš œ5žœžœžœžœžœ˜\Kšœ`˜`K˜—K˜Kšœ+˜+Kšžœ˜K˜J˜—…— Q