DIRECTORY Rope USING [Cat, Index, IsEmpty, Length, ROPE, Substr], XNSCHName USING [DomainName, maxDomainLength, maxObjectLength, maxOrganizationLength, Name]; XNSCHNameImpl: CEDAR PROGRAM IMPORTS --DefaultRemoteNames,-- Rope 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 "PARC"; }; GetDefaultOrganization: PROC [hint: ROPE] RETURNS [default: ROPE] ~ { default _ IF NOT Rope.IsEmpty[hint] THEN hint ELSE "Xerox"; }; 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 Demers, January 15, 1987 6:08:08 pm PST DefaultRemoteNames USING [Get], ELSE (DefaultRemoteNames.Get[]).domain; ELSE (DefaultRemoteNames.Get[]).organization; ΚΚ˜code™K™'K˜—šΟk ˜ Kšœœ™Kšœœœ ˜7Kšœ œM˜\—K˜šΟn œœ˜Kš œœ˜$Kšœ ˜K˜Kšœ ˜K˜Kšœœœ˜K˜Kš ž œœœ œœ˜5K˜š žœœœœ œ˜?šœ œœ˜#Kšœ˜ Kšœ#™'Kšœ˜ —Jšœ˜—š žœœœœ œ˜Ešœ œœ˜#Kšœ˜ Kšœ)™-Jšœ ˜ —Jšœ˜—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šœG˜GK˜K˜—š žœœœœœ˜QKšœA˜AK˜K˜—K˜——…— ΰb