DIRECTORY Ascii, Atom, Convert, MessageWindow, NameSymbolTable, NodeProps, NodeStyle, NodeStyleOps, NodeStyleWorks, Process, Rope, TextLooks, TJaMBasic, TJaMInternal, TJaMOps, TJaMVM, UserProfile; NodeStyleWorks1Impl: CEDAR MONITOR IMPORTS TJaMOps, TJaMVM, Process, Rope, MessageWindow, NodeStyle, NodeStyleOps, NodeStyleWorks, NameSymbolTable EXPORTS NodeStyleWorks = BEGIN OPEN NodeStyle, NodeStyleWorks; FrameInfo: TYPE = REF FrameInfoBody; FrameInfoBody: TYPE = RECORD [ frame: Frame, style: Ref, rest: FrameInfo ]; GetFrame: PUBLIC PROC [style: Ref, styleName: Name, kind: OfStyle] RETURNS [frame: Frame] = TRUSTED { found: BOOL; AllocFrame: ENTRY PROC [name: Name, kind: OfStyle] = TRUSTED { ENABLE UNWIND => NULL; allocFrameCalls _ allocFrameCalls+1; IF name # NameSymbolTable.nullName THEN { IF name=styleName1 AND kind=styleKind1 AND freeFrame1 # NIL THEN { frame _ freeFrame1; freeFrame1 _ NIL; RETURN }; IF name=styleName2 AND kind=styleKind2 AND freeFrame2 # NIL THEN { frame _ freeFrame2; freeFrame2 _ NIL; RETURN }; IF name=styleName3 AND kind=styleKind3 AND freeFrame3 # NIL THEN { frame _ freeFrame3; freeFrame3 _ NIL; RETURN }; IF name=styleName4 AND kind=styleKind4 AND freeFrame4 # NIL THEN { frame _ freeFrame4; freeFrame4 _ NIL; RETURN }}; IF freeFrame1 # NIL THEN { frame _ freeFrame1; freeFrame1 _ NIL } ELSE IF freeFrame2 # NIL THEN { frame _ freeFrame2; freeFrame2 _ NIL } ELSE IF freeFrame3 # NIL THEN { frame _ freeFrame3; freeFrame3 _ NIL } ELSE IF freeFrame4 # NIL THEN { frame _ freeFrame4; freeFrame4 _ NIL } ELSE { frame _ TJaMOps.NewFrame[]; frameAlloc _ frameAlloc+1; TJaMOps.Begin[frame, sysdict]; TJaMOps.Begin[frame, styledict]; }; }; SaveStyleInfo: ENTRY PROC = TRUSTED { ENABLE UNWIND => NULL; IF frame1 = NIL THEN { frame1 _ frame; style1 _ style } ELSE IF frame2 = NIL THEN { frame2 _ frame; style2 _ style } ELSE IF frame3 = NIL THEN { frame3 _ frame; style3 _ style } ELSE IF frame4 = NIL THEN { frame4 _ frame; style4 _ style } ELSE FOR lst: FrameInfo _ frameList, lst.rest UNTIL lst=NIL DO IF lst.frame = NIL THEN { lst.frame _ frame; lst.style _ style; EXIT }; REPEAT FINISHED => frameList _ NEW[FrameInfoBody _ [frame, style, frameList]]; ENDLOOP; }; AllocFrame[styleName, kind]; -- use styleName and kind as hint about which to allocate IF styleName # NameSymbolTable.nullName THEN { styleNameObj: Object; done: BOOL _ FALSE; [found, styleNameObj] _ TJaMOps.TryToLoad[frame, styleDictName]; IF found THEN { -- some style dictionary on stack already IF TypeCheckName[styleNameObj] = styleName THEN { -- still must check kind of style kindNameObj: Object; [found, kindNameObj] _ TJaMOps.TryToLoad[frame, styleKindName]; IF found AND TypeCheckName[kindNameObj]=kindNames[kind] THEN done _ TRUE; }; -- already there IF ~done THEN -- get rid of top dictionary WHILE TJaMOps.TopDict[frame.dictstk] # styledict DO TJaMOps.End[frame]; ENDLOOP; }; IF ~done THEN TJaMOps.Begin[frame, GetStyleDict[frame, styleName, kind]] } ELSE WHILE TJaMOps.TopDict[frame.dictstk] # styledict DO TJaMOps.End[frame]; ENDLOOP; SaveStyleInfo[]; }; FreeFrame: PUBLIC ENTRY PROC [frame: Frame, name: Name, kind: OfStyle] = TRUSTED { ENABLE UNWIND => NULL; freeFrameCalls _ freeFrameCalls+1; IF freeFrame1 = NIL THEN { freeFrame1 _ frame; styleName1 _ name; styleKind1 _ kind } ELSE IF freeFrame2 = NIL THEN { freeFrame2 _ frame; styleName2 _ name; styleKind2 _ kind } ELSE IF freeFrame3 = NIL THEN { freeFrame3 _ frame; styleName3 _ name; styleKind3 _ kind } ELSE IF freeFrame4 = NIL THEN { freeFrame4 _ frame; styleName4 _ name; styleKind4 _ kind } ELSE { frameFree _ frameFree+1; TJaMOps.FreeFrame[frame] }; -- really free it SELECT frame FROM frame1 => { frame1 _ NIL; style1 _ NIL }; frame2 => { frame2 _ NIL; style2 _ NIL }; frame3 => { frame3 _ NIL; style3 _ NIL }; frame4 => { frame4 _ NIL; style4 _ NIL }; ENDCASE => FOR lst: FrameInfo _ frameList, lst.rest UNTIL lst=NIL DO IF lst.frame = frame THEN { lst.frame _ NIL; lst.style _ NIL; EXIT }; ENDLOOP; }; frame1, frame2, frame3, frame4: Frame _ NIL; -- small cache of active frames frameAlloc: INT _ 0; -- number of frames allocated from TJaM frameFree: INT _ 0; -- number of frames freed by TJaM allocFrameCalls: INT _ 0; -- number of times called AllocFrame freeFrameCalls: INT _ 0; -- number of times called FreeFrame. should = allocFrameCalls style1, style2, style3, style4: Ref; -- style bodies associated with active frames 1,2,3,4 frameList: FrameInfo; -- chain of known frames beyond the small cache here freeFrame1, freeFrame2, freeFrame3, freeFrame4: Frame _ NIL; styleName1, styleName2, styleName3, styleName4: Name _ NameSymbolTable.nullName; styleKind1, styleKind2, styleKind3, styleKind4: OfStyle _ screen; debugFlag: BOOL _ TRUE; debugStyle: Ref; StyleForFrame: PUBLIC PROC [frame: Frame] RETURNS [style: Ref] = TRUSTED { GetIt: ENTRY PROC RETURNS [s: Ref] = TRUSTED INLINE { ENABLE UNWIND => NULL; SELECT frame FROM frame1 => RETURN [style1]; frame2 => RETURN [style2]; frame3 => RETURN [style3]; frame4 => RETURN [style4]; ENDCASE => FOR lst: FrameInfo _ frameList, lst.rest UNTIL lst=NIL DO IF lst.frame=frame THEN RETURN [lst.style]; ENDLOOP }; IF (style _ GetIt[]) = NIL THEN { -- failed to find the frame IF debugFlag THEN { IF debugStyle=NIL THEN debugStyle _ NodeStyleOps.Create[]; RETURN [debugStyle] }; ERROR }; RETURN [style]; }; GetStyleDict: PUBLIC PROC [frame: Frame, name: Name, kind: OfStyle, def: Rope.ROPE _ NIL] RETURNS [d: dict Object] = { found, ok: BOOL; name _ ForceLowerName[name]; [d, found] _ CheckStyleDict[name, kind]; IF found THEN RETURN; ok _ IF def # NIL THEN RunStyleString[frame, name, def] ELSE RunStyle[frame, name]; IF ok THEN [d, found] _ CheckStyleDict[name, kind]; IF ~found THEN { BadStyleFile[frame, name]; [d, found] _ CheckStyleDict[name, kind]; }; }; BadStyleFile: PUBLIC PROC [frame: Frame, name: Name] = TRUSTED { { ENABLE { WhatStyle => { styleName _ name; RESUME }; StartOfStyle => RESUME; EndOfStyle => RESUME; }; BeginStyleOp[frame]; IF name # NodeStyleOps.defaultStyleName THEN { PushName[frame, NodeStyleOps.defaultStyleName]; AttachStyleOp[frame]; }; EndStyleOp[frame]; }; Process.Detach[FORK BadStyleMessage[name]]; PushName[frame, name]; PushText[frame, "style was bad."L]; StyleError[frame, 2]; }; BadStyleMessage: PROC [name: Name] = { MessageWindow.Append[NameSymbolTable.RopeFromName[name], TRUE]; MessageWindow.Append[".style could not be loaded."]; }; CheckStyleDict: PROC [name: Name, kind: OfStyle] RETURNS [d: dict Object, found: BOOL] = TRUSTED { obj: Object; [found, obj] _ TJaMOps.TryToGet[stylesDicts[kind], name]; IF found THEN d _ TypeCheckDict[obj]; }; CreateStyleDict: PROC RETURNS [d: dict Object] = TRUSTED { -- creates dict for style RETURN [TJaMOps.Dict[50]]; }; EnterStyleDict: PROC [name: Name, d: Object, kind: OfStyle] = TRUSTED { TJaMOps.Put[stylesDicts[kind], name, d]; }; RunStyle: PUBLIC PROC [frame: Frame, name: Name] RETURNS [ok: BOOL] = TRUSTED { txt: REF TEXT _ NEW[TEXT[64]]; ext: STRING = ".style"; txtlen: NAT; hasExt, started, finished: BOOL _ FALSE; NameSymbolTable.FromName[name, txt]; txtlen _ txt.length; FOR i:NAT IN [0..txtlen) DO -- see if has an extension already IF txt[i] = '. THEN { hasExt _ TRUE; EXIT }; ENDLOOP; FOR i:NAT IN [0..ext.length) DO txt[txtlen+i] _ ext[i]; ENDLOOP; txt.length _ txtlen+ext.length; PushText[frame, LOOPHOLE[txt, LONG STRING]]; TJaMOps.Put[attachmentsDict, name, TJaMOps.Array[0]]; TJaMOps.Execute[frame, run ! WhatStyle => { styleName _ name; RESUME }; StartOfStyle => { started _ TRUE; RESUME }; EndOfStyle => { finished _ TRUE; RESUME }; ]; RETURN [started AND finished]; }; RunStyleString: PUBLIC PROC [frame: Frame, name: Name, def: Rope.ROPE] RETURNS [ok: BOOL] = TRUSTED { started, finished: BOOL _ FALSE; TJaMOps.Put[attachmentsDict, name, TJaMOps.Array[0]]; TJaMOps.Execute[frame, CVX[TJaMOps.MakeString[LOOPHOLE[Rope.Flatten[def], LONG STRING]]] ! WhatStyle => { styleName _ name; RESUME }; StartOfStyle => { started _ TRUE; RESUME }; EndOfStyle => { finished _ TRUE; RESUME }; ]; RETURN [started AND finished]; }; sysdict: PUBLIC dict Object; userdict: PUBLIC dict Object; styledict: PUBLIC dict Object; styleDictName: Name = NameSymbolTable.MakeName["##styleDictName"]; styleKindName: Name = NameSymbolTable.MakeName["##styleKindName"]; InitDict: PUBLIC PROC [name: Name, size: CARDINAL _ 100] RETURNS [dictionary: dict Object] = TRUSTED { found: BOOL; d: Object; [found, d] _ TJaMOps.TryToGet[sysdict, name]; IF found THEN dictionary _ TypeCheckDict[d] ELSE { dictionary _ TJaMOps.Dict[size]; TJaMOps.Put[sysdict, name, dictionary]; } }; bindingDictName: PUBLIC Name; attachmentsDictName: PUBLIC Name; styledictName: PUBLIC Name; bindingDict: dict Object; attachmentsDict: dict Object; kindNames: REF ARRAY OfStyle OF Name _ NEW[ARRAY OfStyle OF Name _ [ $screen, $print, $base]]; styleRuleDictNames: REF ARRAY OfStyle OF Name = NEW[ARRAY OfStyle OF Name _ [ Atom.MakeAtom["##BaseStyleRuleDictName"], Atom.MakeAtom["##ScreenStyleRuleDictName"], Atom.MakeAtom["##PrintStyleRuleDictName"] ]]; styleDictNames: REF ARRAY OfStyle OF Name = NEW[ARRAY OfStyle OF Name _[ Atom.MakeAtom["##BaseStyleDictName"], Atom.MakeAtom["##ScreenStyleDictName"], Atom.MakeAtom["##PrintStyleDictName"] ]]; stylesDictsNames: PUBLIC REF ARRAY OfStyle OF Name _ NEW[ARRAY OfStyle OF Name]; stylesDicts: PUBLIC REF ARRAY OfStyle OF dict Object _ NEW[ARRAY OfStyle OF dict Object]; StartOfStyle: SIGNAL = CODE; -- raised to indicate start of loading style EndOfStyle: SIGNAL = CODE; -- raised to indicate successful loading WhatStyle: SIGNAL RETURNS [styleName: Name] = CODE; -- raised to find name of style being loaded BeginStyleOp: PROC [frame: Frame] = TRUSTED { name: Name _ ForceLowerName[SIGNAL WhatStyle]; -- get style name from RunStyle screenDict, printDict, baseDict: dict Object; ResetDict: PROC [dict: dict Object] = TRUSTED { TJaMOps.ClrDict[dict]; TJaMOps.DetachAll[dict]; }; MakeDict: PROC [kind: OfStyle] RETURNS [dict: dict Object] = TRUSTED { dict _ CreateStyleDict[]; EnterStyleDict[name, dict, kind]; }; InitDict: PROC [dict: dict Object, kind: OfStyle] = TRUSTED { TJaMOps.Put[baseDict, NameToObject[styleRuleDictNames[kind]], TJaMOps.Dict[50]]; TJaMOps.Put[dict, styleKindName, kindNames[kind]]; }; found: BOOL; [baseDict, found] _ CheckStyleDict[name, base]; -- check if reloading IF found THEN { ResetDict[baseDict]; [printDict, ] _ CheckStyleDict[name, print]; ResetDict[printDict]; [screenDict, ] _ CheckStyleDict[name, screen]; ResetDict[screenDict]; NodeStyleOps.FlushCaches[] } ELSE { baseDict _ MakeDict[base]; screenDict _ MakeDict[screen]; printDict _ MakeDict[print] }; InitDict[baseDict, base]; InitDict[screenDict, screen]; InitDict[printDict, print]; TJaMOps.AttachDict[screenDict, baseDict]; TJaMOps.AttachDict[printDict, baseDict]; TJaMOps.Put[baseDict, styleDictNames[screen], screenDict]; TJaMOps.Put[baseDict, styleDictNames[print], printDict]; TJaMOps.Put[baseDict, styleDictNames[base], baseDict]; TJaMOps.Put[baseDict, styleDictName, name]; TJaMOps.Begin[frame, baseDict]; PushObject[frame, baseDict]; -- leave this around for EndStyleOp SIGNAL StartOfStyle; -- caught by RunStyle }; StyleNameOp: PROC [frame: Frame] = TRUSTED { -- expects style dictionary on op stack PushObject[frame, TJaMOps.Load[frame, styleDictName]] }; EndStyleOp: PROC [frame: Frame] = TRUSTED { d1, d2: dict Object; d1 _ TJaMOps.TopDict[frame.dictstk]; -- the current dictionary d2 _ TJaMOps.PopDict[frame.opstk]; -- pushed by StyleOp IF d1 # d2 THEN { PushText[frame, "mismatched Style and EndStyle commands"L]; StyleError[frame, 1]; } ELSE { -- change attachments so look in own basicDict before any attached dicts name: Name _ SIGNAL WhatStyle; screenDict: dict Object = CheckStyleDict[name, screen].d; printDict: dict Object = CheckStyleDict[name, print].d; TJaMOps.DetachDict[screenDict, d1]; TJaMOps.DetachDict[printDict, d1]; TJaMOps.AttachDict[screenDict, d1]; TJaMOps.AttachDict[printDict, d1]; TJaMOps.End[frame]; }; SIGNAL EndOfStyle; -- caught by RunStyle }; StyleRuleOp: PROC [frame: Frame] = { DefineStyleRule[frame, base] }; PrintRuleOp: PROC [frame: Frame] = { DefineStyleRule[frame, print] }; ScreenRuleOp: PROC [frame: Frame] = { DefineStyleRule[frame, screen] }; DefineStyleRule: PROC [frame: Frame, kind: OfStyle] = TRUSTED { definition: Object _ PopObject[frame]; comment: Object _ PopObject[frame]; STKname: Name _ PopName[frame]; name: Name _ ForceLowerName[STKname]; nameObj: Object _ name; dict: dict Object _ LoadStyleDict[frame, kind]; WITH x:definition SELECT FROM array => TJaMOps.ABind[x, bindingDict]; ENDCASE; -- def may be a string TJaMOps.Put[dict, nameObj, CVX[definition]]; -- save the definition IF name#STKname THEN TJaMOps.Put[dict, STKname, CVX[definition]]; TJaMOps.Put[LoadStyleRuleDict[frame, kind], nameObj, comment]; -- save the comment in the rule name dict }; LoadStyleDict: PROC [frame: Frame, kind: OfStyle] RETURNS [dict Object] = TRUSTED { RETURN [TypeCheckDict[TJaMOps.Load[frame, styleDictNames[kind]]]]; }; LoadStyleRuleDict: PROC [frame: Frame, kind: OfStyle] RETURNS [dict Object] = TRUSTED { RETURN [TypeCheckDict[TJaMOps.Load[frame, styleRuleDictNames[kind]]]]; }; OpenPrintStyleOp: PROC [frame: Frame] = { -- expects style name on op stack OpenStyle[frame, print]; }; OpenScreenStyleOp: PROC [frame: Frame] = { -- expects style name on op stack OpenStyle[frame, screen]; }; OpenStyle: PROC [frame: Frame, kind: OfStyle] = TRUSTED { name: Name _ PopName[frame]; IF NOT NodeStyleOps.LoadStyle[name] THEN RETURN; WHILE TJaMOps.TopDict[frame.dictstk] # sysdict DO TJaMOps.End[frame]; ENDLOOP; TJaMOps.Begin[frame, styledict]; TJaMOps.Begin[frame, GetStyleDict[frame, name, kind]]; }; ResetTestStyleOp: PROC [frame: Frame] = { IF debugStyle=NIL THEN debugStyle _ NodeStyleOps.Create[]; debugStyle^ _ NodeStyleOps.defaultStyle^; }; StyleRuleDictOp: PROC [frame: Frame] = { GetRuleDict[frame, base] }; PrintRuleDictOp: PROC [frame: Frame] = { GetRuleDict[frame, print] }; ScreenRuleDictOp: PROC [frame: Frame] = { GetRuleDict[frame, screen] }; GetRuleDict: PROC [frame: Frame, kind: OfStyle] = TRUSTED { PushName[frame, styleRuleDictNames[kind]]; TJaMOps.Execute[frame, get]; }; AttachStyleOp: PROC [frame: Frame] = TRUSTED { -- expects opstk to contain style name name: Name _ ForceLowerName[PopName[frame]]; found: BOOL; printDict, screenDict: dict Object; array: array Object; styleName: Name _ SIGNAL WhatStyle; val: Object; [printDict, found] _ CheckStyleDict[name, print]; IF ~found THEN { IF RunStyle[frame, name] THEN [printDict, found] _ CheckStyleDict[name, print]; IF ~found THEN { BadStyleFile[frame, name]; RETURN }}; [screenDict, found] _ CheckStyleDict[name, screen]; IF ~found THEN ERROR; TJaMOps.AttachDict[LoadStyleDict[frame, screen], screenDict]; TJaMOps.AttachDict[LoadStyleDict[frame, print], printDict]; [found, val] _ TJaMOps.TryToGet[attachmentsDict, styleName]; IF ~found THEN array _ TJaMOps.Array[1] -- this is the first attachment ELSE { -- add new item to the array WITH val:val SELECT FROM array => array _ val; ENDCASE => ERROR; array _ TJaMOps.ACopy[array, 1] }; TJaMOps.APut[array, array.length-1, name]; TJaMOps.Put[attachmentsDict, styleName, array]; }; ForEachAttachedStyle: PUBLIC PROC [dictName: Name, proc: PROC [attached: Name] RETURNS [stop: BOOL]] = TRUSTED { val: Object; array: array Object; found: BOOL; dictName _ NodeStyleWorks.ForceLowerName[dictName]; [found, val] _ TJaMOps.TryToGet[attachmentsDict, dictName]; IF ~found THEN RETURN; WITH val:val SELECT FROM array => array _ val; ENDCASE => ERROR; FOR i: CARDINAL IN [0..array.length) DO ob: Object _ TJaMVM.GetElem[array, i]; IF proc[TypeCheckName[ob]] THEN RETURN; ENDLOOP; }; ExecuteName: PUBLIC PROC [frame: Frame, name: Name] RETURNS [ok: BOOL] = TRUSTED { initDepth: CARDINAL _ TJaMOps.CountStack[frame.opstk]; finalDepth: CARDINAL; nameObj: Object _ name; [ok, ] _ TJaMOps.TryToLoad[frame, nameObj]; IF ~ok THEN RETURN; executingName _ name; TJaMOps.Execute[frame, CVX[nameObj]]; executingName _ NameSymbolTable.nullName; IF (finalDepth _ TJaMOps.CountStack[frame.opstk]) # initDepth THEN { PushText[frame, "Failed to leave stack at same depth after execution.\n"L]; PushName[frame, name]; StyleError[frame, 2]; ok _ FALSE; }; }; ExecuteNameInStyle: PUBLIC PROC [ref: Ref, kind: OfStyle, name: Name] RETURNS [ok: BOOL] = TRUSTED { styleName: Name _ ref.name[style]; frame: Frame _ GetFrame[ref, styleName, kind]; initDepth: CARDINAL _ TJaMOps.CountStack[frame.opstk]; finalDepth: CARDINAL; nameObj: Object _ name; [ok, ] _ TJaMOps.TryToLoad[frame, nameObj]; IF NOT ok THEN RETURN; executingName _ name; TJaMOps.Execute[frame, CVX[nameObj]]; executingName _ NameSymbolTable.nullName; IF (finalDepth _ TJaMOps.CountStack[frame.opstk]) # initDepth THEN { PushText[frame, "Failed to leave stack at same depth after execution.\n"L]; PushName[frame, name]; StyleError[frame, 2]; ok _ FALSE; }; FreeFrame[frame, styleName, kind]; frame _ NIL; }; ExecuteObjectInStyle: PUBLIC PROC [ref: Ref, kind: OfStyle, object: Object] RETURNS [ok: BOOL] = TRUSTED { styleName: Name _ ref.name[style]; frame: Frame _ GetFrame[ref, styleName, kind]; initDepth: CARDINAL _ TJaMOps.CountStack[frame.opstk]; finalDepth: CARDINAL; ok _ TRUE; TJaMOps.Execute[frame, CVX[object]]; IF (finalDepth _ TJaMOps.CountStack[frame.opstk]) # initDepth THEN { PushObject[frame, object]; PushText[frame, "Failed to leave stack at same depth after execution.\n"L]; StyleError[frame, 2]; ok _ FALSE; }; FreeFrame[frame, styleName, kind]; frame _ NIL; }; ExecuteLooksInStyle: PUBLIC PROC [ref: Ref, kind: OfStyle, looks: TextLooks.Looks] RETURNS [ok: BOOL] = TRUSTED { styleName: Name _ ref.name[style]; frame: Frame _ GetFrame[ref, styleName, kind]; ok _ TRUE; FOR c: CHAR IN TextLooks.Look DO IF looks[c] THEN ok _ ExecuteName[frame, lookNames[c]] ENDLOOP; FreeFrame[frame, styleName, kind]; frame _ NIL; }; executingName: PUBLIC Name; lookNames: REF LookNames _ NEW[LookNames]; LookNames: TYPE = ARRAY TextLooks.Look OF Name; InitLookNames: PROC = TRUSTED { txt: STRING _ [6]; txt[0] _ 'l; txt[1] _ txt[2] _ 'o; txt[3] _ 'k; txt[4] _ '.; txt.length _ 6; FOR c: CHAR IN TextLooks.Look DO txt[5] _ c; lookNames[c] _ NameSymbolTable.MakeName[LOOPHOLE[LONG[txt], REF READONLY TEXT]]; ENDLOOP; }; StyleError: PUBLIC PROC [frame: Frame, num: INTEGER] = TRUSTED { PushInteger[frame, num]; TJaMOps.Execute[frame, $StyleError]; }; opsList: PUBLIC LIST OF RECORD[name: REF READONLY TEXT, op: PROC [frame: Frame]]; Preregister: PUBLIC PROC [param: Param, op: PROC [frame: Frame]] RETURNS [Param] ~ { opsList _ CONS[[param.opName, op], opsList]; RETURN [param]; }; DoStyleOp: PUBLIC PROC [frame: Frame, p: Param] = { nameflag: BOOL; name: Name; style: Ref _ StyleForFrame[frame]; Error: PROC = { PushName[frame, NameSymbolTable.MakeName[p.opName]]; PushText[frame, "illegal as qualifer for"L]; PushName[frame, name]; StyleError[frame, 3]; }; [name, nameflag] _ TryToPopName[frame]; IF ~nameflag THEN p.ops.Store[frame, p, style] -- e.g., "10 pt leading" ELSE SELECT name FROM the => p.ops.Load[frame, p, style]; -- e.g., "the leading" bigger => { [name, nameflag] _ TryToPopName[frame]; IF ~nameflag THEN p.ops.AddReal[frame, PopReal[frame], p, style] ELSE IF name=percent THEN p.ops.Percent[frame, 100+PopReal[frame], p, style] ELSE { Error; RETURN }; }; smaller => { [name, nameflag] _ TryToPopName[frame]; IF ~nameflag THEN p.ops.AddReal[frame, -PopReal[frame], p, style] ELSE IF name=percent THEN p.ops.Percent[frame, 100-PopReal[frame], p, style] ELSE { Error; RETURN }; }; percent => p.ops.Percent[frame, PopReal[frame], p, style]; ENDCASE => p.ops.SetName[frame, name, p, style]; -- e.g., "TimesRoman family" }; StoreError: PUBLIC StoreProc = { ob: TJaMBasic.Object _ PopObject[frame]; PushName[frame, NameSymbolTable.MakeName[p.opName]]; PushText[frame, "is not legal as value for"L]; PushObject[frame, ob]; StyleError[frame, 3]; }; AddRealError: PUBLIC AddRealProc = { PushName[frame, NameSymbolTable.MakeName[p.opName]]; PushText[frame, "Numbers are illegal as values for"L]; StyleError[frame, 2]; }; PercentError: PUBLIC PercentProc = { PushName[frame, NameSymbolTable.MakeName[p.opName]]; PushText[frame, "Numbers are illegal as values for"L]; StyleError[frame, 2]; }; SetNameError: PUBLIC SetNameProc = { PushName[frame, NameSymbolTable.MakeName[p.opName]]; PushText[frame, "Only numbers are legal as values for"L]; StyleError[frame, 2]; }; nameOps: PUBLIC Ops _ NEW [OpsRec _ [LoadNameParam, StoreError, AddRealError, PercentError, SetNameParam]]; LoadNameParam: PUBLIC LoadProc = { PushName[frame, style.name[NARROW[p, REF ParamRec.name].param]]; }; SetNameParam: PUBLIC SetNameProc = { style.name[NARROW[p, REF ParamRec.name].param] _ name; }; NameError: PUBLIC PROC [frame: Frame, name: Name, p: Param] = { PushName[frame, NameSymbolTable.MakeName[p.opName]]; PushText[frame, "illegal as value for"L]; PushName[frame, name]; StyleError[frame, 3]; }; realOps: PUBLIC Ops _ NEW [OpsRec _ [RealOpLoad, RealOpSetReal, RealOpAddReal, RealOpPercent, SetNameError]]; RealOpLoad: PUBLIC LoadProc = { PushReal[frame, GetReal[style, NARROW[p, REF ParamRec.real].param]]}; RealOpSetReal: PUBLIC StoreProc = { SetReal[style, NARROW[p, REF ParamRec.real].param, PopReal[frame]]}; RealOpAddReal: PUBLIC AddRealProc = { x: REF ParamRec.real = NARROW[p]; SetReal[style, x.param, GetReal[style, x.param]+inc]}; RealOpPercent: PUBLIC PercentProc = { val: REAL _ GetReal[style, NARROW[p, REF ParamRec.real].param]; SetReal[style, NARROW[p, REF ParamRec.real].param, (percent/100)*val]; }; glueOps: PUBLIC Ops _ NEW [OpsRec _ [GlueOpLoad, GlueOpSetReal, GlueOpAddReal, GlueOpPercent, SetNameError]]; GlueOpLoad: PUBLIC LoadProc = { Get: PROC [param: RealParam] = { PushReal[frame, GetReal[style, param]] }; x: REF ParamRec.glue = NARROW[p]; Get[x.size]; Get[x.stretch]; Get[x.shrink]; }; GlueOpSetReal: PUBLIC StoreProc = { Set: PROC [param: RealParam] = { SetReal[style, param, PopReal[frame]] }; x: REF ParamRec.glue = NARROW[p]; Set[x.shrink]; Set[x.stretch]; Set[x.size]; }; GlueOpAddReal: PUBLIC AddRealProc = { Add: PROC [param: RealParam] = { SetReal[style, param, GetReal[style, param]+inc] }; x: REF ParamRec.glue = NARROW[p]; Add[x.size]; Add[x.stretch]; Add[x.shrink]; }; GlueOpPercent: PUBLIC PercentProc = { Set: PROC [param: RealParam] = { val: REAL _ GetReal[style, param]; SetReal[style, param, (percent/100)*val]; }; x: REF ParamRec.glue = NARROW[p]; Set[x.size]; Set[x.stretch]; Set[x.shrink]; }; colorOps: PUBLIC Ops _ NEW [OpsRec _ [ColorOpLoad, ColorOpSetReal, ColorOpAddReal, ColorOpPercent, SetNameError]]; ColorOpLoad: PUBLIC LoadProc = { Get: PROC [param: RealParam] = { PushReal[frame, GetReal[style, param]]; }; x: REF ParamRec.color = NARROW[p]; Get[x.hue]; Get[x.saturation]; Get[x.brightness]; }; ColorOpSetReal: PUBLIC StoreProc = { Set: PROC [param: RealParam] = { SetReal[style, param, PopReal[frame]]; }; x: REF ParamRec.color = NARROW[p]; Set[x.brightness]; Set[x.saturation]; Set[x.hue]; }; ColorOpAddReal: PUBLIC AddRealProc = { Add: PROC [param: RealParam] = { SetReal[style, param, GetReal[style, param]+inc]; }; x: REF ParamRec.color = NARROW[p]; Add[x.hue]; Add[x.saturation]; Add[x.brightness]; }; ColorOpPercent: PUBLIC PercentProc = { Set: PROC [param: RealParam] = { val: REAL _ GetReal[style, param]; SetReal[style, param, (percent/100)*val]; }; x: REF ParamRec.color = NARROW[p]; Set[x.hue]; Set[x.saturation]; Set[x.brightness]; }; StartWorks1: PROC ~ TRUSTED { topDictName: Name; frame, frame1, frame2, frame3, frame4: Frame _ NIL; frame _ TJaMOps.defaultFrame; get _ GetCommand[frame, NameSymbolTable.MakeName[".get"]]; run _ GetCommand[frame, NameSymbolTable.MakeName[".run"]]; load _ GetCommand[frame, NameSymbolTable.MakeName[".load"]]; sysdict _ TypeCheckDict[GetObject[frame, NameSymbolTable.MakeName[".sysdict"]]]; IF NOT RunFile[frame, NameSymbolTable.MakeName["user"], "start.jam"] THEN TJaMOps.Execute[frame, start]; userdict _ TJaMOps.TopDict[frame.dictstk]; InitStyleDict[]; TJaMOps.End[frame]; -- replace userdict by styledict for rest of startup TJaMOps.Begin[frame, styledict]; kindNames[screen] _ NameSymbolTable.MakeName["screen"]; kindNames[print] _ NameSymbolTable.MakeName["print"]; kindNames[base] _ NameSymbolTable.MakeName["base"]; styleRuleDictNames[base] _ NameSymbolTable.MakeName["##BaseStyleRuleDictName"]; styleRuleDictNames[screen] _ NameSymbolTable.MakeName["##ScreenStyleRuleDictName"]; styleRuleDictNames[print] _ NameSymbolTable.MakeName["##PrintStyleRuleDictName"]; styleDictNames[base] _ NameSymbolTable.MakeName["##BaseStyleDictName"]; styleDictNames[screen] _ NameSymbolTable.MakeName["##ScreenStyleDictName"]; styleDictNames[print] _ NameSymbolTable.MakeName["##PrintStyleDictName"]; InitStylesDict[]; InitBindingDict[]; InitAttachmentsDict[]; }; StartWorks1[]; END. NodeStyleWorks1Impl.mesa Copyright c 1985 by Xerox Corporation. All rights reserved. Written by Bill Paxton, January 1981 Paxton, June 3, 1983 3:35 pm Maxwell, January 6, 1983 10:05 am Russ Atkinson, March 7, 1985 3:37:01 am PST Paul Rovner, August 10, 1983 4:43 pm Doug Wyatt, March 5, 1985 10:51:57 am PST Micheal Plass, March 14, 1985 4:26:04 pm PST Rick Beach, March 19, 1985 5:28:13 pm PST Execution Frames for Style Machinery -- style is the StyleRef you will be using with the frame -- styleName tells which style dictionary you want -- will give you default style if requested style bombs during load -- first try to find one that already has the right style -- look for any free one -- get the proper style dictionary on the frame dictionary stack -- name and kind are just a hint about what style dictionary is on the frame stack -- add it to cache of free frames or really free it if cache full -- remove it from active frame info Style Dictionaries fake it so looks as if had a file saying "BeginStyle (default) AttachStyle EndStyle" -- need to fork this so to avoid monitor deadlock in viewers is the following redundant? I think so, so I commented it out. RJB stylesDictNames: PUBLIC REF ARRAY OfStyle OF Name _ NEW[ARRAY OfStyle OF Name]; create rule name dict in baseDict record the style kind expects on op stack Execute Styles makes sure that same stack depth after execute makes sure that same stack depth after execute makes sure that same stack depth after execute makes sure that same stack depth after execute names are "look.a", "look.b", "look.c", etc. Implementing Style Attribute Operations -- e.g., "2 pt bigger leading" -- e.g., "2 percent bigger leading" -- e.g., "2 pt smaller leading" -- e.g., "2 percent smaller leading" General Error Routines Name Parameter Operations Real Parameter Operations Glue Parameter Operations Color Parameter Operations Initialization -- check if have done (start.jam) .run -- check if have done (TiogaUtils.jam) .run [] _ RunFile[frame, $StyleError, "TiogaUtils.jam"]; Κu˜codešœ™Kšœ Οmœ1™Kšžœ žœžœ)žœ˜GKšžœžœžœ,˜NKšžœ˜—Kšœ˜—KšœΟc9˜Všžœ&žœ˜.Kšœ@™@K˜Kšœžœžœ˜K˜@šžœžœ‘)˜9šžœ)žœ‘!˜SK˜K˜?šžœžœ,ž˜Kšœžœ‘=˜VKšœ&‘5˜[Kšœ‘4˜KK˜Kšœ8žœ˜Kš žœ žœ žœžœžœ˜5—Kš žœžœžœžœžœ˜@K˜Kšœžœžœžœ˜,K˜5˜Kšœ!žœ˜*Kšœžœžœ˜+Kšœžœžœ˜*Kšœ˜—Kšžœ žœ ˜Kšœ˜K˜—š œžœžœ&žœžœžœžœ˜eKšœžœžœ˜ K˜5šœ˜Kšžœžœžœžœ˜DKšœ!žœ˜*Kšœžœžœ˜+Kšœžœžœ˜*Kšœ˜—Kšžœ žœ ˜Kšœ˜K˜—K˜Kšœ žœ ˜Kšœ žœ ˜Kšœ žœ ˜K˜KšœB˜BKšœB˜BK˜š  œžœžœžœžœžœ˜fKšœžœ˜ K˜ K˜-Kšžœžœ˜+šžœ˜Kšœ ˜ K˜'K˜—K˜K˜—Kšœžœ˜Kšœžœ˜!šœžœ˜K˜—K˜K˜K˜Kš œ žœžœ žœžœžœ žœ#˜^š œžœžœ žœžœžœ žœ ˜MKšœ)˜)Kšœ+˜+Kšœ)˜)Kšœ˜—š œžœžœ žœžœžœ žœ˜HKšœ%˜%Kšœ'˜'Kšœ%˜%Kšœ˜—K˜Kš œž œžœ žœžœžœ žœ˜PK™CKš œž œžœ žœžœžœ žœ™OK˜Kš œ ž œžœ žœžœžœ žœ˜YK˜Kšœžœžœ‘,˜IKšœ žœžœ‘(˜CKšœ žœžœžœ‘,˜`K˜š  œžœžœ˜-Kšœžœ ‘˜NK˜-š  œžœžœ˜/Kšœ˜Kšœ˜Kšœ˜—š œžœžœžœ˜FK˜K˜!K˜—š œžœ&žœ˜=K˜PKšœ!™!K˜2Kšœ™K˜—Kšœžœ˜ Kšœ0‘˜Ešžœžœ˜K˜K˜,K˜K˜.K˜K˜—šžœ˜K˜K˜K˜—K˜SK˜K˜)K˜(K˜K˜:K˜8K˜6K˜K˜+K˜K˜Kšœ‘#˜@Kšžœ‘˜*Kšœ˜K˜—š  œžœžœ‘'˜TK˜5K˜K˜—š  œžœžœ˜+K˜Kšœ%‘˜>Kšœ#‘˜7šžœ žœ˜K˜;K˜K˜—šžœ‘H˜OKšœ žœ ˜K˜9K˜7K˜#K˜"K˜#K˜"K˜K˜—Kšžœ ‘˜(Kšœ˜—K˜š  œžœ3˜DK˜—š  œžœ4˜EK˜—Kš  œžœ5˜GK˜š œžœ!žœ˜?Kšœ1™1K˜&K˜#K˜K˜%Kšœ˜K˜/šžœžœž˜K˜'Kšžœ‘˜—Kšœžœ‘˜CKšžœžœžœ˜AKšœ?‘)˜hK˜K˜—š  œžœžœžœ˜SKšžœ<˜BKšœ˜K˜—š œžœžœžœ˜WKšžœ@˜FKšœ˜K˜—š œžœ‘!˜KK˜K˜K˜—š œžœ‘!˜LK˜K˜K˜—š  œžœ!žœ˜9K˜Kšžœžœžœžœ˜0Kšžœ*žœžœ˜NK˜ K˜6K˜K˜—š œžœ˜*Kšžœ žœžœ$˜:Kšœ)˜)K˜—K˜š œžœ/˜DK˜—š œžœ0˜EK˜—Kš œžœ1˜GK˜š  œžœ!žœ˜;K˜*K˜K˜K˜—š  œžœžœ‘&˜UK˜,Kšœžœ˜ K˜#K˜Kšœžœ ˜#K˜ K˜1šžœžœ˜Kšžœžœ2˜Ošžœžœ˜K˜Kšžœ˜ ——K˜3Kšžœžœžœ˜K˜=K˜;K˜