DIRECTORY Commander USING [CommandProc, Register], CommandTool USING [ArgumentVector, Failed, Parse], FSPseudoServers USING [GetPseudoServers, PseudoServerList, PseudoServerRep, SetPseudoServers], IO USING [PutFR, PutRope, STREAM], Rope USING [Equal, Fetch, Length, ROPE], UserProfile USING [Token]; PseudoServerCommandsImpl: CEDAR PROGRAM IMPORTS Commander, CommandTool, IO, FSPseudoServers, Rope, UserProfile = BEGIN LORA: TYPE = LIST OF REF ANY; ROPE: TYPE = Rope.ROPE; STREAM: TYPE = IO.STREAM; PseudoServerAddCommand: Commander.CommandProc = { argv: CommandTool.ArgumentVector _ CommandTool.Parse[cmd: cmd ! CommandTool.Failed => {msg _ errorMsg; GO TO failed}]; ProcessSwitches: PROC [arg: ROPE] = { sense: BOOL _ TRUE; direction: {up, down} _ down; FOR index: INT IN [0..Rope.Length[arg]) DO SELECT Rope.Fetch[arg, index] FROM '~ => {sense _ NOT sense; LOOP}; 'r, 'R => rec.avoidCheck _ sense; ENDCASE; sense _ TRUE; ENDLOOP; }; which: {server, writer, reader} _ server; rec: FSPseudoServers.PseudoServerRep _ [NIL, FALSE, NIL, NIL]; serverList: FSPseudoServers.PseudoServerList _ FSPseudoServers.GetPseudoServers[]; ProcessSwitches[UserProfile.Token["PseudoServerAddCommand.DefaultSwitches"]]; FOR i: NAT IN [1..argv.argc) DO arg: ROPE = argv[i]; IF Rope.Length[arg] = 0 THEN LOOP; IF Rope.Fetch[arg, 0] = '- THEN { ProcessSwitches[arg]; LOOP; }; SELECT which FROM server => { rec.server _ arg; which _ writer; }; writer => { rec.write _ arg; which _ reader; }; ENDCASE => { new: LIST OF ROPE _ LIST[arg]; old: LIST OF ROPE _ rec.read; IF old = NIL THEN rec.read _ new ELSE { DO IF old.rest = NIL THEN {old.rest _ new; EXIT}; old _ old.rest; ENDLOOP; }; }; ENDLOOP; IF rec.server = NIL THEN { msg _ "Usage: server writer readers ..."; GO TO failed; }; FOR each: FSPseudoServers.PseudoServerList _ serverList, each.rest WHILE each # NIL DO IF Rope.Equal[each.first.server, rec.server, FALSE] THEN { each.first _ rec; IF rec.write = NIL AND rec.read = NIL THEN { each.first.server _ NIL; msg _ IO.PutFR["'%g' deleted from pseudo server list.", [rope[rec.server]]]; RETURN; }; each.first _ rec; msg _ IO.PutFR["'%g' updated in pseudo server list.", [rope[rec.server]]]; RETURN; }; ENDLOOP; IF rec.write = NIL AND rec.read = NIL THEN { msg _ IO.PutFR["'%g' not in pseudo server list.", [rope[rec.server]]]; } ELSE { FSPseudoServers.SetPseudoServers[CONS[rec, serverList]]; msg _ IO.PutFR["'%g' added to pseudo server list.", [rope[rec.server]]]; }; EXITS failed => {result _ $Failure}; }; PseudoServerPrintCommand: Commander.CommandProc = { serverList: FSPseudoServers.PseudoServerList _ FSPseudoServers.GetPseudoServers[]; out: STREAM = cmd.out; PutName: PROC [name: ROPE] = { IO.PutRope[out, " "]; IF Rope.Length[name] = 0 THEN IO.PutRope[out, "$"] ELSE IO.PutRope[out, name]; }; FOR each: FSPseudoServers.PseudoServerList _ serverList, each.rest WHILE each # NIL DO IF each.first.server = NIL THEN LOOP; IO.PutRope[out, " "]; PutName[each.first.server]; IF each.first.avoidCheck THEN PutName[" -r"]; PutName[each.first.write]; FOR readers: LIST OF ROPE _ each.first.read, readers.rest WHILE readers # NIL DO PutName[readers.first]; ENDLOOP; IO.PutRope[out, "\n"]; ENDLOOP; }; docAdd: ROPE = "add pseudo-server translation\n\t-r: assume replicated files (avoid remote check)"; docPrint: ROPE = "print pseudo-server translations"; Commander.Register[key: "///Commands/PSAdd", proc: PseudoServerAddCommand, doc: docAdd]; Commander.Register[key: "///Commands/PseudoServerAdd", proc: PseudoServerAddCommand, doc: docAdd]; Commander.Register[key: "///Commands/PSPrint", proc: PseudoServerPrintCommand, doc: docPrint]; Commander.Register[key: "///Commands/PseudoServerPrint", proc: PseudoServerPrintCommand, doc: docPrint]; END. ˜PseudoServerCommandsImpl.mesa Copyright c 1984, 1985 by Xerox Corporation. All rights reserved. Russ Atkinson, March 5, 1985 6:06:26 pm PST [cmd: Handle] RETURNS [result: REF _ NIL, msg: ROPE _ NIL] CommandObject = [in, out, err: STREAM, commandLine, command: ROPE, ...] switches for the remaining arguments Now the argument is assumed to be a file pattern. add the new reader to the end of the list We insist that there be a server We are really deleting this translation The item is completely new, so add it at the front [cmd: Handle] RETURNS [result: REF _ NIL, msg: ROPE _ NIL] CommandObject = [in, out, err: STREAM, commandLine, command: ROPE, ...] ΚΥ˜codešœ™Kšœ Οmœ7™BKšœ+™+—K˜šΟk ˜ Kšœ žœ˜(Kšœ žœ!˜2KšœžœI˜^Kšžœžœžœ˜"Kšœžœžœ˜(Kšœ žœ ˜K˜—šœžœž˜'šž˜Kšœžœ$˜>—Kšœž˜—˜Kš žœžœžœžœžœžœ˜Kšžœžœžœ˜Kšžœžœžœžœ˜—K˜šœ1˜1š œžœ žœžœžœžœ™:Kšœžœžœ™G—šœ=˜=Kšœ)žœžœ ˜8—šΟnœžœžœ˜%Kšœžœžœ˜K˜šžœžœžœž˜*šžœž˜"Kšœžœžœ˜ Kšœ!˜!Kšžœ˜—Kšœžœ˜ Kšžœ˜—K˜—K˜)Kš œ(žœžœžœžœ˜>šœR˜RK˜—KšœM˜MK˜šžœžœžœž˜Kšœžœ ˜Kšžœžœžœ˜"šžœžœ˜!Kšœ$™$Kšœ˜Kšžœ˜Kšœ˜—Kšœ1™1šžœž˜˜ Kšœ˜K˜K˜—˜ Kšœ˜K˜K˜—šžœ˜ Kšœ)™)Kš œžœžœžœžœ˜Kšœžœžœžœ ˜šžœž˜ Kšžœ˜šžœ˜šž˜Kšžœ žœžœžœ˜.Kšœ˜Kšžœ˜—Kšœ˜——K˜——Kšžœ˜K˜—šžœžœžœ˜Kšœ ™ K˜)Kšžœžœ˜ K˜K˜—šžœ@žœžœž˜Všžœ+žœžœ˜:Kšœ˜š žœ žœžœ žœžœ˜,Kšœ'™'Kšœžœ˜KšœžœD˜LKšžœ˜K˜—Kšœ˜KšœžœB˜JKšžœ˜K˜—Kšžœ˜K˜—Kšœ2™2K˜šžœ žœžœ ž˜%šžœ˜Kšœžœ>˜FK˜—šžœ˜Kšœ!žœ˜8Kšœžœ@˜HK˜K˜——šž˜Kšœ˜—K˜K˜—šœ3˜3š œžœ žœžœžœžœ™:Kšœžœžœ™G—KšœR˜RKšœžœ ˜šŸœžœžœ˜Kšžœ˜šžœ˜Kšžœžœ˜Kšžœžœ˜—K˜—šžœ@žœžœž˜VKšžœžœžœžœ˜%Kšžœ˜Kšœ˜Kšžœžœ˜-Kšœ˜š žœ žœžœžœ!žœ žœž˜PKšœ˜Kšžœ˜—Kšžœ˜Kšžœ˜—K˜K˜—KšœžœW˜cKšœ žœ&˜4K˜KšœX˜XKšœb˜bK˜Kšœ^˜^Kšœh˜hK˜Kšžœ˜K˜šœ˜K™—K˜—…—ͺ