-- JaMTSFrameImpl.mesa
-- Last changed by Paxton, 2-Feb-82 12:53:07
DIRECTORY
JaMTSFrame;
JaMTSFrameImpl: MONITOR
EXPORTS JaMTSFrame = {
OPEN JaMTSFrame;
TSList: TYPE = REF TSFrame;
TSFrame: TYPE = RECORD [rest: TSList, ts: TS, frame: Frame, tsi: TSInfo];
list: TSList;
Remember: PUBLIC ENTRY PROC [ts: TS, frame: Frame, tsi: TSInfo] = {
ENABLE UNWIND => NULL;
-- establish two-way connection between ts and frame
-- called when create the typescript
FOR l:TSList ← list, l.rest UNTIL l=NIL DO
IF l.ts=ts THEN ERROR;
ENDLOOP;
list ← NEW[TSFrame ← [list,ts,frame,tsi]] };
Forget: PUBLIC ENTRY PROC [ts: TS] = {
-- forget the connection. called when destroy ts
ENABLE UNWIND => NULL;
pred: TSList;
IF list=NIL THEN RETURN;
IF list.ts=ts THEN { list ← list.rest; RETURN };
pred ← list;
FOR l:TSList ← list.rest, l.rest UNTIL l=NIL DO
IF l.ts=ts THEN { pred.rest ← l.rest; RETURN };
pred ← l; ENDLOOP };
GetFrame: PUBLIC ENTRY PROC [ts: TS] RETURNS [Frame] = {
ENABLE UNWIND => NULL;
-- return the frame associated with ts
-- returns NIL if no association exists
FOR l:TSList ← list, l.rest UNTIL l=NIL DO
IF l.ts=ts THEN RETURN [l.frame];
ENDLOOP;
RETURN [NIL] };
GetTypeScript: PUBLIC ENTRY PROC [frame: Frame] RETURNS [TS] = {
ENABLE UNWIND => NULL;
-- return the ts associated with frame
-- returns NIL if no association exists
FOR l:TSList ← list, l.rest UNTIL l=NIL DO
IF l.frame=frame THEN RETURN [l.ts];
ENDLOOP;
RETURN [NIL] };
GetTSInfo: PUBLIC ENTRY PROC [ts: TS] RETURNS [TSInfo] = {
ENABLE UNWIND => NULL;
-- return the TSInfo associated with ts
-- returns NIL if no association exists
FOR l:TSList ← list, l.rest UNTIL l=NIL DO
IF l.ts=ts THEN RETURN [l.tsi];
ENDLOOP;
RETURN [NIL] };
}.