<<>> <> <> <> <> <<>> DIRECTORY Ascii, KeyChars, KeyCharsBackdoor, KeySymsKB, KeyTypes, IntToIntTab; KeyCharsImpl: CEDAR PROGRAM IMPORTS IntToIntTab EXPORTS KeyChars, KeyCharsBackdoor = BEGIN OPEN KeyChars, KeyCharsBackdoor; ks2c: IntToIntTab.Table ~ IntToIntTab.Create[100]; c2ks: REF ARRAY CHAR OF KeySym ~ NEW[ARRAY CHAR OF KeySym ¬ ALL[[0]]]; AdditionalChar: PUBLIC PROC [keySym: KeyTypes.KeySym, char: CHAR] = { IF c2ks[char]=0 THEN c2ks[char] ¬ keySym; [] ¬ IntToIntTab.Insert[ks2c, LOOPHOLE[keySym], ORD[char]]; }; CharFromKeySym: PUBLIC PROC [keySym: KeySym] RETURNS [char: CHAR ¬ 0c] = { IF keySym.val>=32 AND keySym.val<=127 THEN char ¬ VAL[keySym.val] ELSE { val: INT; found: BOOL; [found, val] ¬ IntToIntTab.Fetch[ks2c, keySym]; IF found AND val>=0 AND val<256 THEN char ¬ VAL[val]; }; }; KeySymFromChar: PUBLIC PROC [char: CHAR] RETURNS [keySym: KeySym] = { keySym ¬ c2ks[char]; }; Init: PROC [] = { FOR i: BYTE IN [32..127] DO c2ks[VAL[i]] ¬ [i] ENDLOOP; AdditionalChar[KeySymsKB.BS, Ascii.BS]; AdditionalChar[KeySymsKB.TAB, Ascii.TAB]; AdditionalChar[KeySymsKB.LF, Ascii.LF]; AdditionalChar[KeySymsKB.CR, Ascii.CR]; AdditionalChar[KeySymsKB.ESC, Ascii.ESC]; AdditionalChar[KeySymsKB.LeftArrow, '¬]; AdditionalChar[KeySymsKB.UpArrow, '­]; AdditionalChar[KeySymsKB.DownArrow, '¯]; AdditionalChar[KeySymsKB.RightArrow, '®]; }; Init[]; END.