<> <> <> <> <> <> <> 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...