<> <> <> <> <> DIRECTORY Imager USING [Context], JaMIPrivate, JaMImagerContexts; JaMIContextsImpl: MONITOR IMPORTS EXPORTS JaMIPrivate, JaMImagerContexts = BEGIN OPEN JaMIPrivate, JaMImagerContexts; InfoList: TYPE = REF InfoListRec; InfoListRec: TYPE = RECORD [info: Info, rest: InfoList]; list: InfoList; NotFound: PUBLIC SIGNAL = CODE; CreateInfo: PUBLIC ENTRY PROC [frame: Frame] RETURNS [info: Info] = { ENABLE UNWIND => NULL; info _ NEW[InfoRec]; info.frame _ frame; FOR l:InfoList _ list, l.rest UNTIL l=NIL DO IF l.info.frame=frame THEN ERROR; ENDLOOP; list _ NEW[InfoListRec _ [info,list]] }; ForgetInfo: PUBLIC ENTRY PROC [frame: Frame] = { ENABLE UNWIND => NULL; pred: InfoList; IF list=NIL THEN RETURN; IF list.info.frame=frame THEN { list _ list.rest; RETURN }; pred _ list; FOR l:InfoList _ list.rest, l.rest UNTIL l=NIL DO IF l.info.frame=frame THEN { pred.rest _ l.rest; RETURN }; pred _ l; ENDLOOP }; GetInfo: PUBLIC ENTRY PROC [frame: Frame] RETURNS [info: Info] = { ENABLE UNWIND => NULL; FOR l:InfoList _ list, l.rest UNTIL l=NIL DO IF l.info.frame=frame THEN RETURN [l.info]; ENDLOOP; RETURN [NIL] }; AddContext: PUBLIC ENTRY PROC [frame: Frame, init: PROC RETURNS[Imager.Context], name: ATOM, enabled, initOnErase: BOOLEAN _ TRUE] = { ENABLE UNWIND => NULL; end,new: JaMImagerContexts.DCList _ NIL; found: BOOLEAN _ FALSE; context: Imager.Context _ init[]; FOR l:InfoList _ list, l.rest UNTIL l=NIL DO IF l.info.frame=frame THEN { FOR dl: JaMImagerContexts.DCList _ l.info.dcList, dl.next UNTIL dl=NIL DO IF dl.name=name THEN { dl.init _init; dl.dc _ context; dl.enabled _ enabled; dl.initOnErase _ initOnErase; found _ TRUE; }; end _ dl; ENDLOOP; IF ~found THEN new _ NEW[JaMImagerContexts.DCRec _ [next: NIL, init: init, dc: context, enabled: enabled, name: name, initOnErase: initOnErase]]; IF end=NIL THEN l.info.dcList _ new ELSE end.next _ new; RETURN}; ENDLOOP; }; RemoveContext: PUBLIC ENTRY PROC [frame: Frame, name: ATOM] RETURNS [context: Imager.Context _ NIL]= { ENABLE UNWIND => NULL; prev: JaMImagerContexts.DCList _ NIL; found: BOOLEAN _ FALSE; FOR l:InfoList _ list, l.rest UNTIL l=NIL DO IF l.info.frame=frame THEN { IF l.info.dcList=NIL THEN SIGNAL NotFound; 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; SIGNAL NotFound; RETURN[NIL]; }; ENDLOOP; }; EnableContext: PUBLIC PROC [frame: Frame, name: ATOM] = { ENABLE UNWIND => NULL; found: BOOLEAN _ FALSE; FOR l:InfoList _ list, l.rest UNTIL l=NIL DO IF l.info.frame=frame THEN { IF l.info.dcList=NIL THEN SIGNAL NotFound; FOR dl: JaMImagerContexts.DCList _ l.info.dcList, dl.next UNTIL dl=NIL DO IF dl.name=name THEN {dl.dc _ dl.init[]; dl.enabled _ TRUE}; ENDLOOP; RETURN}; ENDLOOP; SIGNAL NotFound }; DisableContext: PUBLIC PROC [frame: Frame, name: ATOM] = { ENABLE UNWIND => NULL; found: BOOLEAN _ FALSE; FOR l:InfoList _ list, l.rest UNTIL l=NIL DO IF l.info.frame=frame THEN { IF l.info.dcList=NIL THEN SIGNAL NotFound; FOR dl: JaMImagerContexts.DCList _ l.info.dcList, dl.next UNTIL dl=NIL DO IF dl.name=name THEN dl.enabled _ FALSE; ENDLOOP; RETURN}; 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...