<> <> <> DIRECTORY CrRPC, RapunzelP2200V0; RapunzelP2200V0ServerImpl: CEDAR PROGRAM IMPORTS CrRPC, RapunzelP2200V0 ~ { OPEN RapunzelP2200V0; Server: CrRPC.ServerProc ~ { <<[h: Handle, pgm: CARD, pgmVersion: CARDINAL, proc: CARDINAL, beginReturn: BeginReturnProc, beginError: BeginErrorProc, beginReject: BeginRejectProc]>> ENABLE { RapunzelP2200V0.Fault => { -- (0) beginError[h, 0]; CrRPC.PutCARDINAL[h, ORD[code]]; CrRPC.PutCARD[h, address]; GO TO Finished; }; }; IF (pgmVersion # 0) THEN { beginReject[h, CrRPC.noSuchVersion]; CrRPC.PutCARDINAL[h, 0]; --low CrRPC.PutCARDINAL[h, 0]; --high RETURN }; SELECT proc FROM 4 => { -- PokeSeqShort address: CARD; args: RapunzelP2200V0.SeqShort; address _ CrRPC.GetCARD[h]; { length1: CARDINAL ~ CrRPC.GetCARDINAL[h]; args _ NEW[RapunzelP2200V0.SeqShortObject[length1]]; FOR i0: CARDINAL IN [0..length1) DO args.body[i0] _ CrRPC.GetCARDINAL[h]; ENDLOOP; }; [] _ PokeSeqShort[h, address, args]; beginReturn[h]; }; 6 => { -- PokeLong address: CARD; arg: CARD; address _ CrRPC.GetCARD[h]; arg _ CrRPC.GetCARD[h]; [] _ PokeLong[h, address, arg]; beginReturn[h]; }; 0 => { -- DoCmds cmds: RapunzelP2200V0.SeqCmd; results: RapunzelP2200V0.SeqResult; { length1: CARDINAL ~ CrRPC.GetCARDINAL[h]; cmds _ NEW[RapunzelP2200V0.SeqCmdObject[length1]]; FOR i0: CARDINAL IN [0..length1) DO TRUSTED { tag2: RapunzelP2200V0.OpCode ~ VAL[CrRPC.GetCARDINAL[h]]; SELECT tag2 FROM pokeShort => { x3: RapunzelP2200V0.PokeShortCmd; x3.address _ CrRPC.GetCARD[h]; x3.value _ CrRPC.GetCARDINAL[h]; cmds.body[i0] _ [pokeShort[x3]]; }; peekShort => { x4: RapunzelP2200V0.PeekShortCmd; x4.address _ CrRPC.GetCARD[h]; cmds.body[i0] _ [peekShort[x4]]; }; ENDCASE; }; ENDLOOP; }; [results] _ DoCmds[h, cmds]; beginReturn[h]; CrRPC.PutCARDINAL[h, results.length]; FOR i0: CARDINAL IN [0..results.length) DO CrRPC.PutCARDINAL[h, ORD[results.body[i0].type]]; WITH results.body[i0] SELECT FROM it: pokeShort RapunzelP2200V0.Result => { NULL; -- RECORD [] }; it: peekShort RapunzelP2200V0.Result => { CrRPC.PutCARDINAL[h, it.peekShort.value]; }; ENDCASE; ENDLOOP; }; 5 => { -- PeekLong address: CARD; result: CARD; address _ CrRPC.GetCARD[h]; [result] _ PeekLong[h, address]; beginReturn[h]; CrRPC.PutCARD[h, result]; }; 3 => { -- PeekSeqShort address: CARD; count: CARDINAL; results: RapunzelP2200V0.SeqShort; address _ CrRPC.GetCARD[h]; count _ CrRPC.GetCARDINAL[h]; [results] _ PeekSeqShort[h, address, count]; beginReturn[h]; CrRPC.PutCARDINAL[h, results.length]; FOR i0: CARDINAL IN [0..results.length) DO CrRPC.PutCARDINAL[h, results.body[i0]]; ENDLOOP; }; 1 => { -- PeekShort address: CARD; result: CARDINAL; address _ CrRPC.GetCARD[h]; [result] _ PeekShort[h, address]; beginReturn[h]; CrRPC.PutCARDINAL[h, result]; }; 2 => { -- PokeShort address: CARD; arg: CARDINAL; address _ CrRPC.GetCARD[h]; arg _ CrRPC.GetCARDINAL[h]; [] _ PokeShort[h, address, arg]; beginReturn[h]; }; ENDCASE => { beginReject[h, CrRPC.noSuchProcedure]; }; EXITS Finished => { NULL }; }; CrRPC.RegisterServerProc[pgm~2200, serverProc~Server, pgmVersion~0]; CrRPC.EnsureListener[class~$SPP]; }...