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] }; }. μ MaintainMiscImpl.mesa Copyright Σ 1987, 1988, 1991, 1992 by Xerox Corporation. All rights reserved. Wes Irish, February 24, 1988 6:08:56 pm PST Philip James, July 29, 1991 1:58 pm PDT Willie-s, January 7, 1992 3:07 pm PST Doug Wyatt, May 15, 1992 12:23 pm PDT This PROC parses names and does a call-back on proc for each individual name found. Quotes around an entire name are stripped off and then passed to proc. Quotes around the first part of a GV looking name are left as-is. Names are separated by commas or '\n. On non-quoted names leading and trailing whitespace is stipped off. Quotes must be used to generate names with leading or trailing whitespace. (As ugly as it is some NS names have leading or trailing whitespace!) Κž•NewlineDelimiter –(cedarcode) style™code™Kšœ ΟeœB™NKšœ+™+K™'K™%K™%K™—K˜šΟk ˜ Kšœžœ2˜EKšœžœ˜Kšžœžœ žœ˜Kšœ žœ%˜7Kšœ ˜ Kšœžœ!žœ˜L—K˜š Οnœžœžœžœžœ ˜7Kšžœ žœ˜Kšžœ˜—K˜Kšœ˜˜Kšžœžœžœ˜Kšžœžœžœžœ˜K˜Kšœ žœ˜%Kšœžœ˜Kšœ žœ˜)Kšœžœ˜#K˜Kšœžœ˜Kšœžœ˜$K˜š Πbnœžœžœžœžœ˜>šžœžœž˜K˜Kšœ˜Kšœ ˜ Kšœ ˜ K˜K˜K˜K˜Kšžœ ˜K˜—Kšœ˜K˜—š   œžœžœžœžœ˜9šžœžœž˜Kšœ˜Kšœ˜Kšœ˜Kšœ˜Kšœ˜Kšœ ˜ Kšœ˜Kšœ˜Kšœ˜Kšœ˜Kšœ˜Kšœ˜Kšœ ˜ Kšœ˜Kšœ˜Kšœ˜Kšœ˜Kšœ˜Kšœ˜Kšœ˜Kšœ˜Kšœ˜Kšœ ˜ Kšœ˜Kšœ˜K˜ Kšžœ˜K˜—Kšœ˜K˜—š   œžœžœžœžœ˜9šžœžœž˜Kšœ˜Kšœ˜Kšœ˜Kšœ˜Kšœ˜Kšœ!˜!Kšœ˜Kšœ˜Kšœ˜Kšœ˜Kšœ˜Kšœ˜Kšœ"˜"Kšœ˜Kšœ˜Kšœ˜Kšœ˜Kšœ˜Kšœ˜Kšœ˜Kšœ˜Kšœ˜Kšœ"˜"Kšœ˜Kšœ˜K˜!Kšžœ ˜K˜—Kšœ˜K˜—š  œžœžœžœžœžœ˜@Kšžœ˜šžœžœž˜Kšœ˜Kšœ˜Kšœ˜K˜Kšžœ˜%K˜—Kšœ˜K˜—šŸ œžœžœžœžœžœžœžœ˜cKš œžœΟbœ©žœξžœ,™έK™š  œžœžœžœžœ˜8Kšœžœ˜šžœ ž˜K˜ Kšžœ<žœžœ˜HK˜Kšžœ˜—Kšžœ˜ Kšœ˜—Kšœžœ˜Kšœžœ˜ Kšœžœ˜"Kšœžœ˜Kš žœ žœžœ žœ žœžœ˜HK˜K˜šž˜Kšœ žœ'˜4Kšžœžœžœ˜Kšœžœ˜šžœ.˜0šžœ˜K˜Kšœžœ˜K˜)šžœ žœžœ˜7K˜Kšœžœ˜K˜'Kšœ˜—Kšœ˜—Kšžœ-˜1—K˜6Kšžœžœ ˜"Kšžœžœ,˜BKšœ žœ˜Kšœ˜Kšžœ˜—Kšžœ žœžœ˜K˜—K˜š   œžœžœžœžœ˜:šžœ ž˜Kšœžœžœ˜Kšœžœžœ˜Kšžœžœžœ˜—Kšœ˜K˜—š  œžœžœžœžœ˜?šžœ ž˜Kšœžœžœ˜ Kšœ žœžœ˜Kšžœžœžœ˜—Kšœ˜K˜—š  œžœžœžœžœ˜8šžœ ž˜Kšœžœžœ˜Kšœžœžœ˜(Kšžœžœžœ˜—Kšœ˜K˜—š Ÿœžœžœ žœžœ˜1Kš žœ žœžœžœžœ˜$Kšžœžœžœžœ˜&Kšžœžœ˜ Kšœ˜—K˜Kšœ žœ˜K˜š Ÿœžœžœ žœžœ˜2Kš žœ žœžœžœžœ˜$Kšžœžœžœžœ˜*Kšžœžœ˜Kšœ˜—K˜š œžœžœžœžœžœžœ˜Cšžœžœžœ˜Kšžœžœ ˜—Kšœ˜—K˜šŸ œžœžœžœžœžœžœ˜PKšœ žœ ˜šžœžœžœ˜>KšžœE˜GKšžœžœ˜—Kšžœžœžœ˜Kšœ˜—K˜—Kšœ˜K˜—…—ϊ„