DIRECTORY Rope USING [Cat, Index, IsEmpty, Length, ROPE, Substr], SystemSite USING [Get], XNSCHName USING [DomainName, maxDomainLength, maxObjectLength, maxOrganizationLength, Name]; XNSCHNameImpl: CEDAR PROGRAM IMPORTS Rope, SystemSite EXPORTS XNSCHName ~ { OPEN XNSCHName; ROPE: TYPE ~ Rope.ROPE; FieldTooLong: PUBLIC SIGNAL [which: CARDINAL] ~ CODE; GetDefaultDomain: PROC [hint: ROPE] RETURNS [default: ROPE] ~ { default ¬ IF NOT Rope.IsEmpty[hint] THEN hint ELSE SystemSite.Get[].domain; }; GetDefaultOrganization: PROC [hint: ROPE] RETURNS [default: ROPE] ~ { default ¬ IF NOT Rope.IsEmpty[hint] THEN hint ELSE SystemSite.Get[].organization; }; NameFromRope: PUBLIC PROC [rope: ROPE, defaultDomain: ROPE ¬ NIL, defaultOrganization: ROPE ¬ NIL] RETURNS [name: Name] ~ { pos1, pos2, pos3, len: INT; len1, len2, len3: INT ¬ 0; len ¬ Rope.Length[rope]; pos1 ¬ 0; { len1 ¬ Rope.Index[s1~rope, pos1~pos1, s2~":"]; pos2 ¬ len1 + 1; pos3 ¬ pos2 + 1; IF len1 > maxObjectLength THEN { SIGNAL FieldTooLong[1]; len1 ¬ maxObjectLength }; }; name.object ¬ Rope.Substr[base~rope, start~pos1, len~len1]; IF pos2 <= len THEN { pos3 ¬ Rope.Index[s1~rope, pos1~pos2, s2~":"]; len2 ¬ pos3 - pos2; pos3 ¬ pos3 + 1; IF len2 > maxDomainLength THEN { SIGNAL FieldTooLong[2]; len2 ¬ maxDomainLength }; }; IF len2 > 0 THEN name.domain ¬ Rope.Substr[base~rope, start~pos2, len~len2] ELSE name.domain ¬ GetDefaultDomain[defaultDomain]; IF pos3 <= len THEN { len3 ¬ len - pos3; IF len3 > maxOrganizationLength THEN { SIGNAL FieldTooLong[3]; len3 ¬ maxOrganizationLength; }; }; IF len3 > 0 THEN name.organization ¬ Rope.Substr[base~rope, start~pos3, len~len3] ELSE name.organization ¬ GetDefaultOrganization[defaultOrganization]; }; DomainNameFromRope: PUBLIC PROC [rope: ROPE, defaultDomain: ROPE ¬ NIL, defaultOrganization: ROPE ¬ NIL] RETURNS [domainName: DomainName] ~ { pos2, pos3, len: INT; len2, len3: INT ¬ 0; len ¬ Rope.Length[rope]; pos2 ¬ 0; { len2 ¬ Rope.Index[s1~rope, pos1~pos2, s2~":"]; pos3 ¬ len2 + 1; IF len2 > maxDomainLength THEN { SIGNAL FieldTooLong[2]; len2 ¬ maxDomainLength }; }; IF len2 > 0 THEN domainName.domain ¬ Rope.Substr[base~rope, start~pos2, len~len2] ELSE domainName.domain ¬ GetDefaultDomain[defaultDomain]; IF pos3 <= len THEN { len3 ¬ len - pos3; IF len3 > maxOrganizationLength THEN { SIGNAL FieldTooLong[3]; len3 ¬ maxOrganizationLength; }; }; IF len3 > 0 THEN domainName.organization ¬ Rope.Substr[base~rope, start~pos3, len~len3] ELSE domainName.organization ¬ GetDefaultOrganization[defaultOrganization]; }; RopeFromName: PUBLIC PROC [name: Name] RETURNS [rope: ROPE] ~ { rope ¬ Rope.Cat[name.object, ":", name.domain, ":", name.organization]; }; RopeFromDomainName: PUBLIC PROC [domainName: DomainName] RETURNS [rope: ROPE] ~ { rope ¬ Rope.Cat[domainName.domain, ":", domainName.organization]; }; }... ² XNSCHNameImpl.mesa Copyright Σ 1987, 1991 by Xerox Corporation. All rights reserved. Demers, January 19, 1987 1:35:00 pm PST Doug Wyatt, January 23, 1987 5:26:27 pm PST ΚΏ•NewlineDelimiter –(cedarcode) style™code™Kšœ Οeœ7™BK™'K™+K˜—šΟk ˜ Kšœžœžœ ˜7Kšœ žœ˜Kšœ žœM˜\—K˜šΟn œžœž˜Kšžœ˜Kšžœ ˜K˜Kšžœ ˜K˜Kšžœžœžœ˜K˜Kš Ÿ œžœžœ žœžœ˜5K˜š Ÿœžœžœžœ žœ˜?šœ žœžœ˜#Kšžœ˜ Kšžœ˜—Kšœ˜—š Ÿœžœžœžœ žœ˜Ešœ žœžœ˜#Kšžœ˜ Kšžœ˜#—Kšœ˜—K˜šŸ œžœžœžœžœžœžœžœžœ˜{Kšœžœ˜Kšœžœ˜K˜K˜ ˜K˜.K˜K˜šžœžœ˜ Kšžœ˜K˜—K˜—K˜;šžœ žœ˜K˜.K˜K˜šžœžœ˜ Kšžœ˜K˜—K˜—šžœ ˜ Kšžœ;˜?Kšžœ/˜3—šžœ žœ˜K˜šžœžœ˜&Kšžœ˜K˜Kšœ˜—K˜—šžœ ˜ KšžœA˜EKšžœA˜E—K˜K˜—šŸœžœžœžœžœžœžœžœžœ˜Kšœžœ˜Kšœ žœ˜K˜K˜ ˜K˜.K˜šžœžœ˜ Kšžœ˜K˜—K˜—šžœ ˜ KšžœA˜EKšžœ5˜9—šžœ žœ˜K˜šžœžœ˜&Kšžœ˜K˜Kšœ˜—K˜—šžœ ˜ KšžœG˜KKšžœG˜K—K˜K˜—š Ÿ œžœžœžœžœ˜?K˜GK˜K˜—š Ÿœžœžœžœžœ˜QK˜AK˜K˜—K˜——…— ƒ