<<>> <> <> <> <> <> <> <<>> DIRECTORY CHEntriesP0V0 USING[ userPassword, members, authKeys, printService ], Convert USING[ RopeFromCard ], IO USING[ PutF1, STREAM ], MaintainDefs USING[ Command, CmdButton, MyData, What ], MaintainMisc, Rope USING[ Fetch, Find, FromChar, Length, ROPE, SkipOver, SkipTo, Substr ]; MaintainMiscImpl: CEDAR MONITOR LOCKS d USING d: MyData IMPORTS Convert, IO, Rope EXPORTS MaintainMisc = { ROPE: TYPE = Rope.ROPE; STREAM: TYPE = IO.STREAM; Command: TYPE = MaintainDefs.Command; What: TYPE = MaintainDefs.What; CmdButton: TYPE = MaintainDefs.CmdButton; MyData: TYPE = MaintainDefs.MyData; all: CARD32 ~ 0; nullProperty: CARD32 ~ 37777777777B; RopeFromCommand: PUBLIC PROC [cmd: Command] RETURNS [ROPE] = { RETURN [SELECT cmd FROM type => "Type", isMember => "IsMember", set => "Set", add => "Add", remove => "Remove", misc => "Misc", create => "Create", delete => "Delete", ENDCASE => "???" ]; }; AtomFromWhat: PUBLIC PROC [what: What] RETURNS [ATOM] = { RETURN [SELECT what FROM matches => $Matches, members => $Members, summary => $Summary, details => $Details, domains => $Domains, organizations => $Organizations, finks => $Finks, direct => $Direct, extended => $Extended, occurrences => $Occurrences, password => $Password, simple => $SimplePwd, individualRemark => $IndvRemark, groupRemark => $GroupRemark, fileService => $FileServ, alias => $Alias, self => $Self, member => $Member, owner => $Owner, friend => $Friend, mailbox => $Mailbox, forwarding => $Forwarding, createIndividual => $CreateIndv, createGroup => $CreateGroup, delete => $Delete, domainsServed => $DomainsServed, ENDCASE => $QuestionMark ]; }; RopeFromWhat: PUBLIC PROC [what: What] RETURNS [ROPE] = { RETURN [SELECT what FROM matches => "Matches", members => "Members", summary => "Summary", details => "Details", domains => "Domains", organizations => "Organizations", finks => "Finks", direct => "Direct", extended => "Extended", occurrences => "Occurrences", password => "Password", simple => "Simple Pwd", individualRemark => "Indv Remark", groupRemark => "Group Remark", fileService => "File Serv", alias => "Alias", self => "Self", member => "Member", owner => "Owner", friend => "Friend", mailbox => "Mailbox", forwarding => "Forwarding", createIndividual => "Create Indv", createGroup => "Create Group", delete => "Delete", domainsServed => "DomainsServed", ENDCASE => "???" ]; }; ExposePropertyCode: PUBLIC PROC [prop: CARD32] RETURNS[ROPE] = { OPEN CHEntriesP0V0; RETURN[SELECT prop FROM userPassword => "userPassword", members => "members", authKeys => "authKeys", printService => "printService", ENDCASE => Convert.RopeFromCard[prop] ]; }; CallForItems: PUBLIC PROC [d: MyData, names: ROPE, proc: PROC [ROPE], evenIfNull: BOOL ¬ FALSE] = { <> <<>> StripOffTrailingSpace: PROC [r: ROPE] RETURNS [ROPE] = { len: INT ¬ Rope.Length[r]; WHILE len > 0 DO len ¬ len-1; IF Rope.Find[Rope.FromChar[Rope.Fetch[r, len]], " \t\n"] = -1 THEN EXIT; r ¬ Rope.Substr[r, 0, len]; ENDLOOP; RETURN[r]; }; len: INT = Rope.Length[names]; pos: INT ¬ 0; sepRope, skipRope, thisName: ROPE; thisOneQuoted: BOOL; IF Quote[d] THEN { IF len # 0 OR evenIfNull THEN proc[names]; RETURN; }; skipRope ¬ ", \n\t"; sepRope ¬ ",\n"; DO startPos: INT ¬ Rope.SkipOver[names, pos, skipRope]; IF startPos >= len THEN EXIT; thisOneQuoted ¬ FALSE; IF Rope.SkipTo[names, startPos, "\""] = startPos THEN { startPos ¬ startPos+1; thisOneQuoted ¬ TRUE; pos ¬ Rope.SkipTo[names, startPos, "\""]; IF pos+1 < len AND Rope.Fetch[names, pos+1] = '. THEN { startPos ¬ startPos - 1; thisOneQuoted ¬ FALSE; pos ¬ Rope.SkipTo[names, pos, sepRope]; }; } ELSE pos ¬ Rope.SkipTo[names, startPos, sepRope]; thisName ¬ Rope.Substr[names, startPos, pos-startPos]; IF thisOneQuoted THEN pos ¬ pos+1; IF ~thisOneQuoted THEN thisName ¬ StripOffTrailingSpace[thisName]; evenIfNull ¬ FALSE; proc[thisName]; ENDLOOP; IF evenIfNull THEN proc[NIL]; }; EnumGroups: PUBLIC PROC [cb: CmdButton] RETURNS [BOOL] = { SELECT cb.class FROM group, any => RETURN[TRUE]; individual => RETURN[FALSE]; ENDCASE => RETURN[FALSE]; }; EnumIndividuals: PUBLIC PROC [cb: CmdButton] RETURNS [BOOL] = { SELECT cb.class FROM individual, any => RETURN[TRUE]; group => RETURN[FALSE]; ENDCASE => RETURN[FALSE]; }; EnumDead: PUBLIC PROC [cb: CmdButton] RETURNS [BOOL] = { SELECT cb.class FROM dead => RETURN[TRUE]; any, group, individual => RETURN[FALSE]; ENDCASE => RETURN[FALSE]; }; Quote: PUBLIC PROC [d: MyData] RETURNS [BOOL] = { IF d.quote = NIL THEN RETURN[FALSE]; IF d.quote­ = $off THEN RETURN[FALSE]; RETURN[TRUE]; }; verifyOn: ATOM = $on; Verify: PUBLIC PROC [d: MyData] RETURNS [BOOL] = { IF d.verify = NIL THEN RETURN[TRUE]; IF d.verify­ = verifyOn THEN RETURN[TRUE]; RETURN[FALSE]; }; Plural: PUBLIC PROC [word, plural: ROPE, n: CARD] RETURNS[ROPE] = { IF n = 1 THEN RETURN[word] ELSE RETURN[plural]; }; CheckForm: PUBLIC PROC [clientData: REF, value, label: ROPE] RETURNS[ BOOL ] = { d: MyData = NARROW[clientData]; IF Rope.Length[value] > 0 AND Rope.Fetch[value, 0] = ' THEN { IO.PutF1[d.out, "\nPlease fill in the \"%g\" field\n", [rope[label]] ]; RETURN[FALSE] } ELSE RETURN[TRUE] }; }.