TIPUserImpl.mesa
Copyright © 1985 by Xerox Corporation. All rights reserved.
Edit by McGregor, June 3, 1983 5:46 pm
Last Edited by: Maxwell, January 3, 1983 11:06 am
Doug Wyatt, April 14, 1985 9:42:31 pm PST
DIRECTORY
ClassIncreek USING [Increek, NewStdIncreek],
Process USING [GetCurrent],
RefTab USING [Create, Ref, Store],
TIPPrivate USING [MatchProcess, TIPButtonProc, TIPClient, TIPClientRec, TIPNotifyProc, TIPParseInfo, TIPParseInfoRec],
TIPUser USING [TIPPredicate, TIPTable];
TIPUserImpl: CEDAR PROGRAM
IMPORTS ClassIncreek, Process, RefTab, TIPPrivate
EXPORTS TIPUser, TIPPrivate
= BEGIN OPEN TIPUser, TIPPrivate;
predTable: PUBLIC RefTab.Ref ← RefTab.Create[]; -- table for user defined predicates
CreateClient: PUBLIC PROC [notify: TIPNotifyProc ← NIL, buttons: TIPButtonProc ← NIL]
RETURNS [self: TIPClient] = TRUSTED BEGIN
self ← NEW[TIPClientRec ← [
notifyProc: notify,
buttonProc: buttons,
parseInfo: CreateParseInfo[],
matcher:
]];
self.matcher ← LOOPHOLE[Process.GetCurrent[]]; -- so is never NIL when MatchProcess begins
self.matcher ← FORK MatchProcess[self];
END;
DestroyClient: PUBLIC PROC [self: TIPClient] = TRUSTED BEGIN
self.matcher ← NIL; -- force matcher to terminate
END;
CreateParseInfo: PUBLIC PROC [parseTable: TIPTable ← NIL] RETURNS [new: TIPParseInfo] =
TRUSTED BEGIN
new ← NEW[TIPParseInfoRec ← [
inCreek: ClassIncreek.NewStdIncreek[],
localCreek: ClassIncreek.NewStdIncreek[],
timeCreek: ClassIncreek.NewStdIncreek[],
creekStack: ALL[ClassIncreek.NewStdIncreek[]],
tableHead: parseTable
]];
END;
PushTIPTable: PUBLIC PROC [user: TIPClient, table: TIPTable, opaque: BOOL] = BEGIN
t: TIPTable;
FOR t ← table, t.link UNTIL t.link=NIL DO ENDLOOP;
t.link ← user.parseInfo.tableHead;
user.parseInfo.tableHead ← table;
table.opaque ← opaque;
END;
PopTIPTable: PUBLIC PROC [user: TIPClient] RETURNS [old: TIPTable] = BEGIN
garbage collector will get old table unless the client keeps a reference
IF (old←user.parseInfo.tableHead)#NIL THEN
user.parseInfo.tableHead ← user.parseInfo.tableHead.link;
END;
RegisterTIPPredicate: PUBLIC PROC [key: ATOM, p: TIPPredicate] = BEGIN
a user-defined predicate may be included in the enables list of a TIPTable via this
association mechanism.
[] ← RefTab.Store[predTable, key, NEW[TIPPredicate ← p]];
END;
END.