DIRECTORY CHNameP2V0 USING [Name], CHLookUp USING [AddressFromRope], Commander USING [CommandProc, Register], CommandTool USING [ArgumentVector, Failed, Parse], CrRPC USING [CreateClientHandle, DestroyClientHandle, Handle], Endian USING [BYTE, FWORD, HWORD], IO USING [PutFR, PutRope, STREAM], PrintingP4V3 USING [GetPrinterStatus, PrinterStatus], PrintingP4V3Aux USING [ExposePrinterStatus], Process USING [CheckForAbort], Rope USING [Concat, Fetch, Length, ROPE], UserProfile USING [Token], XNS USING [Address]; GetPrintStatusImpl: CEDAR PROGRAM IMPORTS CHLookUp, Commander, CommandTool, CrRPC, IO, PrintingP4V3, PrintingP4V3Aux, Process, Rope, UserProfile ~ { BYTE: TYPE ~ Endian.BYTE; FWORD: TYPE ~ Endian.FWORD; Handle: TYPE ~ CrRPC.Handle; HWORD: TYPE ~ Endian.HWORD; PrinterStatus: TYPE ~ PrintingP4V3.PrinterStatus; ROPE: TYPE = Rope.ROPE; STREAM: TYPE = IO.STREAM; GetPrintStatus: ROPE = "///Commands/GetPrintStatus"; doc: ROPE = "{Printer}*\nFind out the status of an XNS based printer.\nSwitches: "; usage: ROPE = Rope.Concat["Usage: GetPrintStatus ", doc]; DecodeStatus: PROC [out: STREAM, status: PrinterStatus] ~ { msg: ROPE _ IO.PutFR["%g arguments seen.", [integer[1]] ]; msg _ Rope.Concat[PrintingP4V3Aux.ExposePrinterStatus[status, 0], "\n"]; IO.PutRope[out, msg]; }; GetPrinterStatus: PROC [destRope: ROPE] RETURNS [answer: PrinterStatus] ~ { addr: XNS.Address; h: Handle; service: CHNameP2V0.Name; [addr, service] _ CHLookUp.AddressFromRope[destRope]; h _ CrRPC.CreateClientHandle[class~$SPP, remote~addr]; answer _ PrintingP4V3.GetPrinterStatus[h]; CrRPC.DestroyClientHandle[h]; }; GetPrintStatusProc: Commander.CommandProc ~ { out: STREAM ~ cmd.out; switches: PACKED ARRAY CHAR['a..'z] OF BOOL _ ALL[FALSE]; ProcessSwitches: PROC [arg: ROPE] = { sense: BOOL _ TRUE; FOR index: INT IN [0..Rope.Length[arg]) DO char: CHAR _ Rope.Fetch[arg, index]; SELECT char FROM '- => LOOP; '~ => {sense _ NOT sense; LOOP}; IN ['a..'z] => switches[char] _ sense; IN ['A..'Z] => switches[char + ('a-'A)] _ sense; ENDCASE; sense _ TRUE; ENDLOOP; }; ProcessArgument: PROC [arg: ROPE] = { status: PrinterStatus; argsProcessed _ argsProcessed + 1; Process.CheckForAbort[]; status _ GetPrinterStatus[arg]; DecodeStatus[out, status]; }; argsProcessed: NAT _ 0; argv: CommandTool.ArgumentVector _ CommandTool.Parse[cmd: cmd, starExpand: FALSE ! CommandTool.Failed => {msg _ errorMsg; GO TO failed}]; ProcessSwitches[UserProfile.Token["GetPrintStatus.DefaultSwitches"]]; FOR i: NAT IN [1..argv.argc) DO arg: ROPE ~ argv[i]; Process.CheckForAbort[]; IF (Rope.Length[arg] = 0) THEN LOOP; IF (Rope.Fetch[arg, 0] = '-) THEN { ProcessSwitches[arg]; LOOP; }; ProcessArgument[arg]; ENDLOOP; SELECT argsProcessed FROM 0 => msg _ usage; ENDCASE => NULL; EXITS failed => {result _ $Failure}; }; Init: PROC ~ { Commander.Register[key: GetPrintStatus, proc: GetPrintStatusProc, doc: doc, clientData: NIL, interpreted: TRUE]; }; Init[]; }... ^GetPrintStatusImpl.mesa Copyright c 1985 by Xerox Corporation. All rights reserved. Russ Atkinson, April 2, 1985 4:22:08 pm PST Bill Jackson (bj) October 9, 1986 5:50:01 am PDT Demers, June 6, 1986 3:09:39 pm PDT Copied Types Constants Procs To process an argument, get the status from the printer, and generate some sensible textual output. Κρ˜codešœ™Kšœ Οmœ1™Kš œžœžœžœžœ˜"Kšžœžœžœ˜"Kšœ žœ#˜5Kšœžœ˜,Kšœžœ˜Kšœžœžœ˜)Kšœ žœ ˜Kšžœžœ ˜—K˜šΟnœžœž˜!Kšžœ žœžœ?˜r—K˜™ K˜Kšžœžœ žœ˜Kšžœžœ žœ˜Kšœžœ˜Kšžœžœ žœ˜Kšœžœ˜1Kšžœžœžœ˜Kšžœžœžœžœ˜K˜—™ K™KšŸœžœ ˜4KšΟbœžœT˜]Kš œžœ) œ˜9K˜—šœ™K˜šŸ œžœžœ˜;Kšœžœžœ,˜:KšœH˜HKšžœ˜K˜K˜—šŸœžœ žœžœ˜KKšœžœ ˜K˜ Kšœ˜K˜Kšœ5˜5Kšœ6˜6Kšœ*˜*Kšœ˜˜K˜——šŸœ˜-Kšœžœ ˜Kšœ žœžœžœ žœžœžœžœ˜9K˜šŸœžœžœ˜%Kšœžœžœ˜šžœžœžœž˜*Kšœžœ˜$šžœž˜Kšœžœ˜ Kšœžœžœ˜ Kšžœ$˜&Kšžœ.˜0Kšžœ˜—Kšœžœ˜ Kšžœ˜—K˜—K˜šŸœžœžœ˜%Kšœ˜Kšœ"˜"K˜K˜šœ™Kšœ ™ Kšœ*™*—K˜Kšœ˜K˜K˜K˜—Kšœžœ˜•StartOfExpansionI[cmd: Commander.Handle, starExpand: BOOL _ FALSE, switchChar: CHAR]šœKž˜PKšœ)žœžœ ˜8K˜—KšœE˜EK˜šžœžœžœž˜Kšœžœ ˜K˜Kšžœžœžœ˜$šžœžœ˜#Kšœ˜Kšžœ˜Kšœ˜—Kšœ˜Kšžœ˜K˜—šžœž˜Kšœ  œ˜Kšžœžœ˜—šž˜Kšœ˜—K˜—K˜šŸœžœ˜Kš œŸœ œ œžœžœ˜pK˜——K˜K˜K˜Kšœ˜K˜—…— ί