<> <> 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]; }; }...