DIRECTORY CardTab, KeyMapping, KeyMappingPrivate, KeyMappingTypes, KeyTypes; KeyMappingImpl: CEDAR MONITOR IMPORTS CardTab EXPORTS KeyMapping, KeyMappingTypes ~ BEGIN OPEN KeyMapping; MappingRep: PUBLIC TYPE = KeyMappingPrivate.MappingRep; CountKeySyms: PUBLIC PROC [mapping: Mapping, keyCode: KeyCode] RETURNS [count: NAT ¬ 0] = { IF mapping#NIL AND keyCode<=mapping.maxCode THEN { keySyms: KeySyms ~ mapping.keyTable[keyCode]; IF keySyms#NIL THEN RETURN [keySyms.n] }; }; GetKeySym: PUBLIC PROC [mapping: Mapping, keyCode: KeyCode, i: NAT] RETURNS [keySym: KeySym ¬ [0]] = { IF mapping#NIL AND keyCode<=mapping.maxCode THEN { keySyms: KeySyms ~ mapping.keyTable[keyCode]; IF keySyms#NIL AND i0 THEN { firstSym ¬ keySyms[0]; AddKeySym[firstSym, i, 0]; FOR j: NAT IN [0..keySyms.n) DO thisSym ¬ keySyms[j]; IF thisSym # firstSym THEN AddKeySym[thisSym, i, j]; ENDLOOP; }; ENDLOOP; mapping.inverseKeyTable ¬ inverse; }; END. ΰ KeyMappingImpl.mesa Copyright Σ 1992 by Xerox Corporation. All rights reserved. Christian Jacobi, February 13, 1992 11:37 am PST Christian Jacobi, February 19, 1992 9:49 am PST --idempotent; locking not required Κ¨•NewlineDelimiter –(cedarcode) style™™Icodešœ Οeœ1™Kšžœžœžœžœ˜%K˜—Kšžœ˜K˜—K˜š Ÿ œžœžœ/žœ žœžœ˜jšŸ œ˜)Kšœžœ˜Kšžœžœžœžœ˜&K˜—šžœ žœžœ˜Kšžœžœžœ˜