DIRECTORY NameSymbolTable USING [Name, nullName, Object], NodeStyle USING [DataEntry, DataList, GetReal, IntegerValue, Ref, SetReal], NodeStyleObsolete, NodeStyleWorks USING [DefineSpecialOp, NameToObject, PopName, PushName, PushObject, PushReal, PushText, specialOp, SpecialOpArray, styledict, StyleError, StyleForFrame, StyleParamKey], TextNode USING [Ref], TJaMBasic USING [Object], TJaMInternal USING [Frame], TJaMOps USING [defaultFrame, Get, Put]; NodeStyleObsoleteImpl: CEDAR MONITOR IMPORTS NodeStyle, NodeStyleWorks, TJaMOps EXPORTS NodeStyleObsolete = BEGIN Frame: TYPE = TJaMInternal.Frame; Object: TYPE = TJaMBasic.Object; Name: TYPE = NameSymbolTable.Name; Ref: TYPE = NodeStyle.Ref; styleFreeVarName: Name; -- for the first REAL valued free variable realFreeVars: LIST OF RealFreeVarRec; RealFreeVarRec: TYPE = RECORD [ key: Name, eval: PROC [node: TextNode.Ref] RETURNS [REAL]]; objFreeVars: LIST OF ObjFreeVarRec; ObjFreeVarRec: TYPE = RECORD [ key: Name, eval: PROC [node: TextNode.Ref] RETURNS [Object]]; EvalFreeVars: PUBLIC PROC [style: Ref, node: TextNode.Ref] = { key: Name; SetVal: PROC [value: Object] = { FOR x: NodeStyle.DataList _ style.dataList, x.next UNTIL x=NIL DO -- see if already has this value xx: REF NodeStyle.DataEntry.object = NARROW[x]; IF xx.name=key THEN { ob: NameSymbolTable.Object _ LOOPHOLE[value]; IF xx.object=ob THEN RETURN ELSE EXIT }; ENDLOOP; style.dataList _ NEW[NodeStyle.DataEntry _ [style.dataList, object[key,LOOPHOLE[value]]]]; }; FOR lst: LIST OF RealFreeVarRec _ realFreeVars, lst.rest UNTIL lst=NIL DO value: REAL _ lst.first.eval[node]; key _ lst.first.key; IF key=styleFreeVarName THEN NodeStyle.SetReal[style,freeVar,value] -- this one is special ELSE SetVal[[L, real[value]]]; ENDLOOP; FOR lst: LIST OF ObjFreeVarRec _ objFreeVars, lst.rest UNTIL lst=NIL DO key _ lst.first.key; SetVal[lst.first.eval[node]]; ENDLOOP; }; UnregisterStyleFreeVar: PUBLIC PROC [name: Name] = { prev: LIST OF RealFreeVarRec _ realFreeVars; prevObj: LIST OF ObjFreeVarRec _ objFreeVars; key: Name _ NodeStyleWorks.StyleParamKey[name]; IF styleFreeVarName=key THEN styleFreeVarName _ NameSymbolTable.nullName; IF realFreeVars=NIL THEN NULL ELSE IF realFreeVars.first.key=key THEN realFreeVars _ realFreeVars.rest ELSE FOR lst: LIST OF RealFreeVarRec _ realFreeVars, lst.rest UNTIL lst=NIL DO IF lst.first.key=key THEN { prev.rest _ lst.rest; EXIT }; prev _ lst; ENDLOOP; IF objFreeVars=NIL THEN NULL ELSE IF objFreeVars.first.key=key THEN objFreeVars _ objFreeVars.rest ELSE FOR lst: LIST OF ObjFreeVarRec _ objFreeVars, lst.rest UNTIL lst=NIL DO IF lst.first.key=key THEN { prevObj.rest _ lst.rest; EXIT }; prevObj _ lst; ENDLOOP; }; GetFreeVarOp: PROC [frame: Frame] = { style: Ref _ NodeStyleWorks.StyleForFrame[frame]; key: Name _ NodeStyleWorks.PopName[frame]; -- key name for the free var IF key=styleFreeVarName THEN { NodeStyleWorks.PushReal[frame, NodeStyle.GetReal[style, freeVar]]; RETURN; }; PushFreeVar[frame, style, key]; }; GetFreeVarObjOp: PROC [frame: Frame] = { style: Ref _ NodeStyleWorks.StyleForFrame[frame]; key: Name _ NodeStyleWorks.PopName[frame]; -- key name for the free var PushFreeVar[frame, style, key]; }; PushFreeVar: PROC [frame: Frame, style: Ref, key: Name] = { FOR x: NodeStyle.DataList _ style.dataList, x.next UNTIL x=NIL DO xx: REF NodeStyle.DataEntry.object = NARROW[x]; IF xx.name = key THEN { NodeStyleWorks.PushObject[frame, LOOPHOLE[xx.object]]; RETURN }; ENDLOOP; NodeStyleWorks.PushText[frame, "not defined as a free variable?"L]; NodeStyleWorks.PushName[frame, key]; NodeStyleWorks.StyleError[frame, 3]; }; getFreeVarOp: Object _ NodeStyleWorks.DefineSpecialOp[TJaMOps.defaultFrame, "GetFreeVarOp", GetFreeVarOp]; getFreeVarObjOp: Object _ NodeStyleWorks.DefineSpecialOp[TJaMOps.defaultFrame, "GetFreeVarOp", GetFreeVarOp]; RegisterStyleFreeVar: PUBLIC PROC [name: Name, eval: PROC [node: TextNode.Ref] RETURNS [REAL] ] = TRUSTED { key: Name; array: array Object; [key, array] _ NodeStyleWorks.SpecialOpArray[name, getFreeVarOp]; TJaMOps.Put[NodeStyleWorks.styledict, NodeStyleWorks.NameToObject[name], array]; -- store the definition UnregisterStyleFreeVar[name]; IF styleFreeVarName=NameSymbolTable.nullName THEN styleFreeVarName _ key; realFreeVars _ CONS[[key, eval], realFreeVars]; }; RegisterStyleFreeObjVar: PUBLIC PROC [name: Name, eval: PROC [node: TextNode.Ref] RETURNS [Object] ] = TRUSTED { key: Name; array: array Object; [key, array] _ NodeStyleWorks.SpecialOpArray[name, getFreeVarObjOp]; TJaMOps.Put[NodeStyleWorks.styledict, NodeStyleWorks.NameToObject[name], array]; -- store the definition UnregisterStyleFreeVar[name]; objFreeVars _ CONS[[key, eval], objFreeVars]; }; nonNumeric: PUBLIC ERROR = CODE; DefineSpecial: PUBLIC PROC [name: Name, initialValue: REAL _ 0.0] = { DefineSpecialObj[name, [L,real[initialValue]]]; }; DefineSpecialObj: PUBLIC PROC [name: Name, initialValue: Object] = TRUSTED { key: Name; array: array Object; [key, array] _ NodeStyleWorks.SpecialOpArray[name, NodeStyleWorks.specialOp]; TJaMOps.Put[NodeStyleWorks.styledict, NodeStyleWorks.NameToObject[name], array]; -- store the definition TJaMOps.Put[NodeStyleWorks.styledict, NodeStyleWorks.NameToObject[key], initialValue]; -- store the initial value }; GetSpecial: PUBLIC PROC [s: Ref, name: Name] RETURNS [r: REAL] = { obj: Object = GetSpecialObj[s, name]; WITH x:obj SELECT FROM real => r _ x.rvalue; integer => r _ x.ivalue; ENDCASE => ERROR nonNumeric; }; GetSpecialI: PUBLIC PROC [s: Ref, name: Name] RETURNS [val: INTEGER] = { obj: Object = GetSpecialObj[s, name]; WITH x:obj SELECT FROM real => val _ NodeStyle.IntegerValue[x.rvalue]; integer => val _ x.ivalue; ENDCASE => ERROR nonNumeric; }; GetSpecialObj: PUBLIC PROC [s: Ref, name: Name] RETURNS [obj: Object] = TRUSTED { key: Name _ NodeStyleWorks.StyleParamKey[name]; FOR x: NodeStyle.DataList _ s.dataList, x.next UNTIL x=NIL DO xx: REF NodeStyle.DataEntry.object = NARROW[x]; IF xx.name = key THEN RETURN [LOOPHOLE[xx.object]]; ENDLOOP; RETURN [TJaMOps.Get[NodeStyleWorks.styledict, NodeStyleWorks.NameToObject[key]]]; }; END. ΰNodeStyleObsoleteImpl.mesa Copyright c 1985 by Xerox Corporation. All rights reserved. written by Bill Paxton, January 1981 Paxton, December 21, 1982 9:55 am Maxwell, January 6, 1983 9:50 am Doug Wyatt, March 5, 1985 10:53:24 am PST Russ Atkinson, March 7, 1985 3:29:21 am PST Michael Plass, March 14, 1985 1:35:49 pm PST Rick Beach, March 19, 1985 12:23:16 pm PST Important that this module be started after NodeStyleWorks Free Variables Special Parameter Extensions Κ#˜codešœ™Kšœ Οmœ1™Kšœ ˜ š‘œžœ˜ š žœ0žœžœžœ  ˜bKšœžœžœ˜/šžœ žœ˜Kšœžœ˜-Kš žœžœžœžœžœ˜(—Kšžœ˜—Kšœžœ3žœ ˜ZKšœ˜—š žœžœžœ)žœžœž˜IKšœžœ˜#Kšœ˜Kšžœžœ( ˜ZKšžœ žœ˜Kšžœ˜—š žœžœžœ'žœžœž˜GKšœ˜Kšœ˜Kšžœ˜—˜K˜——š‘œžœžœ˜4Kšœžœžœ˜,Kšœ žœžœ˜-Kšœ/˜/Kšžœžœ-˜IKšžœžœžœž˜Kšžœžœžœ!˜Hš žœžœžœžœ)žœžœž˜NKšžœžœžœ˜9K˜ Kšžœ˜—Kšžœ žœžœž˜Kšžœžœžœ˜Eš žœžœžœžœ'žœžœž˜LKšžœžœžœ˜