<<>> <> <> <> <> <> <> <> DIRECTORY Imager USING [Context], JaMIPrivate, JaMImagerContexts; JaMIContextsImpl: CEDAR MONITOR IMPORTS EXPORTS JaMIPrivate, JaMImagerContexts = BEGIN OPEN JaMImagerContexts; InfoList: TYPE = REF InfoListRec; InfoListRec: TYPE = RECORD [info: Info, rest: InfoList]; list: InfoList¬ NIL; State: TYPE = JaMIPrivate.State; Info: TYPE = JaMIPrivate.Info; NotFound: PUBLIC SIGNAL = CODE; CreateInfo: PUBLIC ENTRY PROC [state: State] RETURNS [info: Info] = { ENABLE UNWIND => NULL; info ¬ NEW[JaMIPrivate.InfoRec]; info.state ¬ state; FOR l:InfoList ¬ list, l.rest UNTIL l=NIL DO IF l.info.state=state THEN ERROR; ENDLOOP; list ¬ NEW[InfoListRec ¬ [info,list]] }; ForgetInfo: PUBLIC ENTRY PROC [state: State] = { ENABLE UNWIND => NULL; pred: InfoList; IF list=NIL THEN RETURN; IF list.info.state=state THEN { list ¬ list.rest; RETURN }; pred ¬ list; FOR l:InfoList ¬ list.rest, l.rest UNTIL l=NIL DO IF l.info.state=state THEN { pred.rest ¬ l.rest; RETURN }; pred ¬ l; ENDLOOP }; GetInfo: PUBLIC ENTRY PROC [state: State] RETURNS [info: Info] = { ENABLE UNWIND => NULL; FOR l:InfoList ¬ list, l.rest UNTIL l=NIL DO IF l.info.state=state THEN RETURN [l.info]; ENDLOOP; RETURN [NIL] }; AddContext: PUBLIC ENTRY PROC [state: State, context: Context, callMe: CallMe, name: ATOM, enabled: BOOLEAN ¬ TRUE] = { ENABLE UNWIND => NULL; end,new: JaMImagerContexts.DCList ¬ NIL; found: BOOLEAN ¬ FALSE; FOR l:InfoList ¬ list, l.rest UNTIL l=NIL DO IF l.info.state=state THEN { FOR dl: JaMImagerContexts.DCList ¬ l.info.dcList, dl.next UNTIL dl=NIL DO IF dl.name=name THEN { dl.callMe ¬callMe; dl.dc ¬ context; dl.enabled ¬ enabled; found ¬ TRUE; }; end ¬ dl; ENDLOOP; IF ~found THEN new ¬ NEW[JaMImagerContexts.DCRec ¬ [next: NIL, callMe: callMe, dc: context, enabled: enabled, name: name]]; IF end=NIL THEN l.info.dcList ¬ new ELSE end.next ¬ new; RETURN}; ENDLOOP; }; RemoveContext: PUBLIC ENTRY PROC [state: State, name: ATOM] RETURNS [context: Imager.Context]= { ENABLE UNWIND => NULL; prev: JaMImagerContexts.DCList ¬ NIL; FOR l:InfoList ¬ list, l.rest UNTIL l=NIL DO IF l.info.state=state THEN FOR dl: JaMImagerContexts.DCList ¬ l.info.dcList, dl.next UNTIL dl=NIL DO IF dl.name=name THEN { IF prev=NIL THEN l.info.dcList ¬ dl.next ELSE prev.next ¬ dl.next; RETURN[dl.dc]; }; prev ¬ dl; ENDLOOP; ENDLOOP; SIGNAL NotFound; RETURN[NIL]; }; EnableContext: PUBLIC PROC [state: State, name: ATOM] = { ENABLE UNWIND => NULL; FOR l:InfoList ¬ list, l.rest UNTIL l=NIL DO IF l.info.state=state THEN FOR dl: JaMImagerContexts.DCList ¬ l.info.dcList, dl.next UNTIL dl=NIL DO IF dl.name=name THEN {dl.enabled ¬ TRUE; RETURN}; ENDLOOP; ENDLOOP; SIGNAL NotFound; }; DisableContext: PUBLIC PROC [state: State, name: ATOM] = { ENABLE UNWIND => NULL; FOR l:InfoList ¬ list, l.rest UNTIL l=NIL DO IF l.info.state=state THEN FOR dl: JaMImagerContexts.DCList ¬ l.info.dcList, dl.next UNTIL dl=NIL DO IF dl.name=name THEN {dl.enabled ¬ FALSE; RETURN}; ENDLOOP; ENDLOOP; SIGNAL NotFound; }; ForAllDCs: PUBLIC PROC [list: JaMImagerContexts.DCList, proc: JaMImagerContexts.GProc] = { FOR l: JaMImagerContexts.DCList ¬ list, l.next UNTIL l=NIL DO IF l.enabled THEN proc[l.dc]; ENDLOOP; }; END...