<> <> 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; }.