DIRECTORY Atom USING [ MakeAtom ], Basics USING [ Comparison ], BasicTime USING [ GMT, Period ], Convert USING [ RopeFromInt ], Commander USING [ Handle ], CommandTool USING [ NextArgument ], Names, PupDefs USING [ AnyLocalPupAddress, PupAddress ], Rope USING [ Cat, Concat, Equal, Fetch, Length, MakeRope, ROPE, Size, SkipTo, Substr ], RPC USING [ MakeKey, EncryptionKey ], UserCredentials USING [ Get ], UserProfile USING [ Token ] ; NamesImpl: CEDAR PROGRAM IMPORTS Atom, BasicTime, CommandTool, Convert, PupDefs, RPC, Rope, UserCredentials, UserProfile EXPORTS Names = { ROPE: TYPE=Names.ROPE; FileSpec: TYPE = Names.FileSpec; FileSpecBody: TYPE = Names.FileSpecBody; larkRegistry: ROPE=".Lark"; NetError: PUBLIC ERROR[problem: Names.NetProblem] = CODE; ParseFile: PUBLIC PROCEDURE[ server: ROPE_NIL, dirName: ROPE_NIL, dirPassword: ROPE_NIL, fileName: ROPE_] RETURNS [spec: FileSpec] ={ start, end: INT; spec_NEW[FileSpecBody_[ server: IF server#NIL THEN server ELSE "Indigo", name: CurrentRName[], password: UserCredentials.Get[].password]]; spec.dirName_IF dirName#NIL THEN Registrize[dirName] ELSE spec.name; start_0; IF Rope.Fetch[fileName, start]='[ THEN { end_Rope.SkipTo[fileName, start, "]"]; spec.server_Rope.Substr[fileName, start+1, end-start-1]; start_end+1; }; IF dirPassword#NIL THEN { spec.dirPassword_dirPassword; IF Rope.Fetch[fileName, start]='< THEN { end_Rope.SkipTo[fileName, start, ">"]; spec.dirName_Rope.Substr[fileName, start+1, end-start-1]; start_end+1; } ELSE IF dirName=NIL THEN ERROR; } ELSE spec.dirPassword _ spec.password; spec.fileName_Rope.Substr[fileName, start]; }; Registrize: PUBLIC PROC[name: ROPE] RETURNS [ROPE] = { dot: INT; IF name=NIL THEN RETURN[NIL]; dot_Rope.SkipTo[name, 0, "."]; IF dot=name.Length[] THEN name_Rope.Concat[name, DefaultRegistry[]]; RETURN[name]; }; CurrentRName: PUBLIC PROC RETURNS [ROPE] = { RETURN[UserCredentials.Get[].name]; }; CurrentPasskey: PUBLIC PROC[passwordText: ROPE] RETURNS [RPC.EncryptionKey] = { IF passwordText=NIL THEN passwordText_UserCredentials.Get[].password; RETURN[RPC.MakeKey[passwordText]]; }; OwnNetAddress: PUBLIC PROC RETURNS [netAddress: Names.NetAddress] = TRUSTED { pa: PupDefs.PupAddress; pa _ PupDefs.AnyLocalPupAddress[[0,0]]; netAddress _ [net: pa.net, host: pa.host]; }; DefaultRegistry: PUBLIC PROC RETURNS [registry: ROPE] = { name: ROPE=CurrentRName[]; dot: INT=Rope.SkipTo[name, 0, "."]; IF dot=name.Length[] THEN ERROR; RETURN[name.Substr[dot]]; }; InstanceFromNetAddress: PUBLIC PROC[netAddress: Names.NetAddress, suffix: ROPE_NIL] RETURNS [instance: ROPE] = { pa: PupDefs.PupAddress = [ net: [netAddress.net], host: [netAddress.host], socket: [a: 0, b: 0]]; instance _ Rope.Cat[Convert.RopeFromInt[pa.net, 8, FALSE], "#", Convert.RopeFromInt[pa.host, 8, FALSE], "#", suffix]; }; LowerCaseRope: PROC[r: ROPE] RETURNS [ROPE] = { RETURN[Rope.MakeRope[base: r, size: r.Size[], fetch: LCFetch]]}; LCFetch: SAFE PROC[data: REF, index: INT] RETURNS [c: CHAR] = TRUSTED { SELECT (c_NARROW[data,ROPE].Fetch[index]) FROM IN ['A..'Z]=>c_c+('a-'A); ENDCASE}; RnameToRspec: PUBLIC PROC[name: Names.Rname, defaultRegistry: ROPE_NIL] RETURNS [spec: Names.Rspec] ={ j: INT_0; i: INT; WHILE (i_Rope.SkipTo[s: name, pos: j, skip: "."])#Rope.Size[name] DO j_i+1; ENDLOOP; IF j#0 THEN defaultRegistry_Rope.Substr[base: name, start: j] ELSE j_i+1; IF Rope.Size[defaultRegistry]=0 THEN RETURN[NIL]; spec_NEW[Names.RspecBody_[simpleName: Rope.Substr[name, 0, j-1], registry: defaultRegistry]]; }; RspecToName: PUBLIC PROC[spec: Names.Rspec] RETURNS [name: Names.Rname] = { RETURN[Rope.Concat[spec.simpleName, Rope.Concat[".", spec.registry]]]; }; RspecToSortName: PUBLIC PROC[spec: Names.Rspec] RETURNS [name: ROPE] ={ RETURN[Rope.Concat[spec.registry, Rope.Concat[".", spec.simpleName]]]; }; MakeAtom: PUBLIC PROC[rName: Names.Rname, case: BOOL_FALSE] RETURNS [ATOM] = { RETURN[Atom.MakeAtom[ IF ~case THEN LowerCaseRope[rName] ELSE rName]]; }; CmdOrToken: PUBLIC PROC[cmd: Commander.Handle, key: ROPE, default: ROPE] RETURNS [value: ROPE_NIL] = { value _ CommandTool.NextArgument[cmd]; IF value#NIL OR value.Equal["NIL", FALSE] THEN RETURN; value _ UserProfile.Token[key: key, default: default]; }; GMTComp: PUBLIC PROC[t1, t2: BasicTime.GMT] RETURNS [c: Basics.Comparison] = { period: INT = BasicTime.Period[t2, t1]; RETURN[IF period>0 THEN greater ELSE IF period=0 THEN equal ELSE less]; }; }. `NamesImpl.Mesa Copyright c 1984, 1985 by Xerox Corporation. All rights reserved. Last modified by Swinehart, July 19, 1985 2:59:45 pm PDT Last modified by Stewart, August 29, 1983 8:44 pm Obligatory concrete Conversion routines case: if FALSE, case considered not important . . . all calls that expect results to match must use FALSE, since implementation is to convert rName to lower case. if TRUE, leave rope alone and make the ATOM as is. CommandTool parsing aid, to Names If token read is "NIL" (or "nil"), return NIL -- allows arguments to be skipped. "Leftover" Procedures exported to Names Κ.˜šœ™Jšœ Οmœ7™BJšœ8™8Jšœ1™1—J˜šΟk ˜ Jšœžœ˜Jšœžœ˜Jšœ žœžœ ˜ Jšœžœ˜Jšœ žœ ˜Jšœ žœ˜#J˜šœžœ˜J˜!—Jšœžœ0žœ˜WJšžœžœ˜%Jšœžœ ˜Jšœ žœ ˜J˜J˜—šœ ž ˜šž˜Jšœ0žœ$˜W—Jšžœ ˜—Jšžœžœžœ˜Jšœ žœ˜ Jšœžœ˜(Jšœžœ ˜J˜Jšœ™Jšœ žœžœžœ˜9J˜šΟn œžœž œ˜Jšœžœžœ˜Jšœ žœžœ˜Jšœ žœžœ˜Jšœ žœžœ˜,Jšœ žœ˜šœžœ˜Jš œžœžœžœžœ ˜0J˜Jšœ+˜+—Jš œ žœ žœžœžœ ˜DJ˜šžœ žœ˜(J˜&J˜8J˜—šžœ žœžœ˜J˜šžœ žœ˜(J˜&J˜9J˜—Jš žœžœ žœžœžœ˜!—Jšžœ"˜&J˜.J˜—š Ÿ œžœžœžœžœžœ˜6Jšœžœ˜ Jš žœžœžœžœžœ˜J˜Jšžœžœ+˜DJšžœ ˜J˜—š Ÿ œžœžœžœžœ˜,Jšžœ ˜&J˜—š Ÿœžœžœžœžœžœ˜OJšžœžœžœ-˜EJšžœžœ˜%J˜—š Ÿ œžœžœžœ"žœ˜MJ˜J˜'J˜-J˜—š Ÿœžœžœžœ žœ˜9Jšœžœ˜Jšœžœ˜#Jšžœžœžœ˜ Jšžœ˜J˜—š Ÿœžœžœ'žœžœ˜SJšžœ žœ˜J˜bšœ3žœ˜@Jšœ žœ˜5—J˜J˜—™J˜š Ÿ œžœžœžœžœ˜/Jšžœ:˜@—šŸœžœžœžœ žœžœžœžœ˜GJš žœžœžœžœžœžœ˜R——™š Ÿ œžœžœ%žœžœžœ˜fIintšœžœ˜ Kšœžœ˜Kšžœ=žœžœ˜TJšžœžœ3žœ˜IJšžœžœžœžœ˜1šœžœ8˜@J˜——šŸ œžœžœžœ˜KJšžœC˜I—š Ÿœžœžœžœžœ˜GJšžœC˜I—J˜šŸœžœžœžœžœžœžœ˜Nšœ žœVžœ9™’Jšœžœ žœ™2—šžœ˜Jšžœžœžœ ˜3———J™™!J™š Ÿ œžœžœžœ žœ˜HJšœ*žœΟc"™PJšžœ žœžœ˜J˜&Jš žœžœžœžœžœžœ˜6Jšœ6˜6J˜—J˜—™'J™š Ÿœžœžœžœžœ˜OJšœ'˜'Jšžœžœ žœ žœžœ žœžœ˜GJ˜J˜——J˜J˜—…—<Κ