DIRECTORY Basics USING [BITXOR, BITSHIFT], RefTab USING [ Create, Delete, Ref, Store ], Rope USING [Fetch, Length, ROPE], RPC ; RPCImpl: CEDAR MONITOR IMPORTS Basics, RefTab, Rope EXPORTS RPC = BEGIN bpw: INT = 2; -- bytes per word on Dorado MakeKey: PUBLIC PROCEDURE [text: Rope.ROPE] RETURNS [RPC.EncryptionKey] = CHECKED { key: RPC.EncryptionKey; key ¬ ALL[0]; FOR i: CARD16 IN CARD16[0..Rope.Length[text]) DO j: [0..LENGTH[key]) = (i/bpw) MOD LENGTH[key]; c: WORD = LOOPHOLE[ IF Rope.Fetch[text, i] IN ['A..'Z] THEN Rope.Fetch[text, i] - 'A + 'a ELSE Rope.Fetch[text, i] ]; key[j] ¬ Basics.BITXOR[key[j], Basics.BITSHIFT[c, IF (i MOD 2) = 0 THEN 9 ELSE 1]]; ENDLOOP; RETURN[key]; }; convTable: RefTab.Ref ¬ RefTab.Create[]; n: INT ¬ 0; GenerateConversation: PUBLIC ENTRY PROC RETURNS [RPC.Conversation] ~ { conv: REF INT ¬ NEW[INT ¬ n]; n ¬ n+1; [] ¬ RefTab.Store[x: convTable, key: conv, val: $OK ]; RETURN[conv]; }; EndConversation: PUBLIC ENTRY PROC [conversation: RPC.Conversation] ~ { [] ¬ RefTab.Delete[x: convTable, key: conversation]; }; END.  RPCImpl.mesa Stub for use by Finch. Copyright Σ 1990, 1992 by Xerox Corporation. All rights reserved. Swinehart, January 11, 1987 6:01:33 pm PST Polle Zellweger (PTZ) August 1, 1990 7:48:50 pm PDT RETURN[GVBasics.MakeKey[text]] -- definition expanded below: ΚG•NewlineDelimiter –(cedarcode) style™codešΟkœ ™ K™Kšœ Οeœ7™BK™*K™3—K˜š ˜ Kšœœœœ˜ Kšœœ ˜,Kšœœœ˜!Kš˜Kšœ˜K˜—KšΟnœœ˜Kšœ˜Kšœ˜ Kš˜˜KšœœΟc˜*K˜š Ÿœœ œœœœ˜SKšœ<™