DIRECTORY CharDisplays, IO, Rope; DisplayControllers: CEDAR DEFINITIONS = { REFTEXT: TYPE = REF TEXT; ROPE: TYPE = Rope.ROPE; CharDisplay: TYPE = CharDisplays.CharDisplay; BoolDefaultsFalse: TYPE = CharDisplays.BoolDefaultsFalse; DisplayController: TYPE = REF DisplayControllerRep; DisplayControllerRep: TYPE = RECORD [ cd: CharDisplay, cp: ControlProgram, cps: ControlProgramState, toDisplay, fromDisplay: IO.STREAM, driver: IO.STREAM _ NIL ]; Create: PROC [cd: CharDisplay, cp: ControlProgram] RETURNS [dc: DisplayController]; SetDriver: PROC [dc: DisplayController, driver: IO.STREAM]; ControlProgram: TYPE = REF ControlProgramRep; ControlProgramRep: TYPE = RECORD [ bits: [7 .. 8], start: Vertex, Init: PROC [dc: DisplayController], clientData: REF ANY ]; Vertex: TYPE = REF VertexRep; VertexRep: TYPE = RECORD [ repStyle: VertexRepStyle, t: Transition _ [[NIL, NIL], NIL], edgeList: EdgeList _ NIL, edgeArray: TransitionArray _ NIL]; VertexRepStyle: TYPE = {epsilon, list, array}; TransitionArray: TYPE = REF TransitionArrayRep; TransitionArrayRep: TYPE = ARRAY CHAR OF Transition; EdgeList: TYPE = LIST OF Edge; Edge: TYPE = RECORD [ char: CHAR, transition: Transition ]; Transition: TYPE = RECORD [ action: Action, newVertex: Vertex]; Action: TYPE = RECORD [proc: ActionProc, clientData: REF ANY _ NIL, overrideable: BOOL _ FALSE]; ActionProc: TYPE = PROC [dc: DisplayController, clientData: REF ANY]; ControlProgramState: TYPE = REF ControlProgramStateRep; ControlProgramStateRep: TYPE = RECORD [ curVertex: Vertex _ NIL, regs: ARRAY RegID OF INTEGER _ ALL[0], modes: Modes _ ALL[FALSE], chars--since last in start state--: REFTEXT, clientData: REF ANY _ NIL ]; RegID: TYPE = {line, col, aux1, aux2, aux3, aux4}; Mode: TYPE = {insert, delete}; Modes: TYPE = ARRAY Mode OF BoolDefaultsFalse; NewControlProgram: PROC [Init: PROC [dc: DisplayController] _ NIL, clientData: REF ANY _ NIL, bits: [7 .. 8] _ 8] RETURNS [cp: ControlProgram]; AddInstruction: PROC [cp: ControlProgram, steps: StepList, final: Action]; StepList: TYPE = LIST OF Step; Step: TYPE = REF ANY --actually UNION [ROPE, REFTEXT, Decode]--; Decode: TYPE = REF DecodeRep; DecodeRep: TYPE = RECORD [ reg: RegID, base: NAT _ 10, org: CHAR _ '0, offset: INT _ 0, xor: INTEGER _ 0, len: NAT _ 0 --=0 means variable length, #0 means fixed--]; NumChars: NAT = (LAST[CHAR] - FIRST[CHAR]) + 1; Naught: ActionProc; Print: ActionProc; }.  DisplayControllers.Mesa Mike Spreitzer August 26, 1986 8:52:23 pm PDT Destruction of the display, and hence the controller, closes these streams. Here for only one purpose: driver.CharsAvail[] tells whether more coming soon. decodes ((char XOR xor) - org) by base, then adds offset Κ0– "cedar" style˜code™K™-—K˜KšΟk œœ˜!K˜šΠbxœœ œ˜)K˜Kšœœœœ˜Kšœœœ˜Kšœ œ˜-Kšœœ"˜9K˜Kšœœœ˜3šœœœ˜%K˜K˜Kšœ˜šœœœ˜"K™K—šœœœ˜K™N—Kšœ˜—K˜KšΟnœœ'œ˜SK˜KšŸ œœ!œœ˜;K˜Kšœœœ˜-šœœœ˜"K˜K˜KšŸœœ˜#Kšœ œ˜K˜—K˜Kšœœœ ˜šœ œœ˜Kšœ˜Kšœœœœ˜"Kšœœ˜Kšœœ˜"—K˜Kšœœ˜.K˜Kšœœœ˜/Kš œœœœœ ˜4K˜Kšœ œœœ˜šœœœ˜Kšœœ˜ Kšœ˜K˜—K˜šœ œœ˜Kšœ˜Kšœ˜—K˜Kšœœœ œœœœœ˜`Kš Ÿ œœœ%œœ˜EK˜Kšœœœ˜7šœœœ˜'Kšœœ˜Kš œœœœœ˜&Kšœœœ˜KšœΟcœœ˜,Kšœ œœ˜K˜—K˜Kšœœ'˜2K˜Kšœœ˜Kšœœœœ˜.K˜KšŸœœŸœœœœœœœ˜K˜KšŸœœ6˜JK˜Kšœ œœœ˜Kš œœœœ *œ˜@K˜Kšœœœ ˜šœ œœ˜K˜ Kšœœ˜Kšœœ˜Kšœœ˜Kšœœ˜Kšœœ ,œ˜;K™8—K˜Kš œ œœœœœ˜/K˜K˜K˜K˜K˜——…— xΘ