DIRECTORY Basics, FSPseudoServers, List, Rope, KeyNotePseudoServer; KeyNotePseudoServerImpl: CEDAR PROGRAM IMPORTS Basics, FSPseudoServers, List, Rope EXPORTS KeyNotePseudoServer = { ROPE: TYPE = Rope.ROPE; ServerNameReadServerList: TYPE = LIST OF ServerNameReadServerHandle; ServerNameReadServerHandle: TYPE = REF ANY; ServerNameReadServerObject: TYPE = RECORD [ name: ROPE, readServer: ROPE ]; RecomputeReadServerList: PUBLIC PROC [] = { readList: ServerNameReadServerList; LongestNamesFirst: List.CompareProc= { RETURN[Basics.CompareInt[Rope.InlineSize[NARROW[ref2, REF ServerNameReadServerObject].readServer], Rope.InlineSize[NARROW[ref1, REF ServerNameReadServerObject].readServer]]]; }; FOR psl: FSPseudoServers.PseudoServerList _ FSPseudoServers.GetPseudoServers[], psl.rest WHILE psl # NIL DO FOR readers: LIST OF ROPE _ psl.first.read, readers.rest WHILE readers#NIL DO item: REF ServerNameReadServerObject _ NEW [ ServerNameReadServerObject _ [name: psl.first.server, readServer: readers.first]]; TRUSTED {readList _ List.Nconc1[readList, LOOPHOLE[item]]; }; ENDLOOP; ENDLOOP; pseudoServerReadList _ List.Sort[list: readList, compareProc: LongestNamesFirst]; }; SubstituteLongestPrefixWithPseudoServer: PUBLIC PROC [fileName: ROPE] RETURNS [fileNameAfterShortening: ROPE] = { FOR psrl: ServerNameReadServerList _ pseudoServerReadList, psrl.rest WHILE psrl # NIL DO readServerPath: REF ServerNameReadServerObject _ NARROW[psrl.first]; shortened: BOOLEAN; shortenedName: ROPE; [shortened: shortened, shortenedName: shortenedName] _ TryToPseudoServerShortenFileName[readServerName: readServerPath.readServer, pseudoServerName: readServerPath.name, fileName: fileName]; IF shortened THEN RETURN[shortenedName]; ENDLOOP; RETURN[fileName]; }; TryToPseudoServerShortenFileName: PROC [readServerName: ROPE, pseudoServerName:ROPE, fileName: ROPE] RETURNS [shortened: BOOLEAN, shortenedName: ROPE] = { fileNameHead: ROPE; fileNameBody: ROPE; readServerNameHead: ROPE; readServerNameBody: ROPE; [head: fileNameHead, body: fileNameBody] _ GetHeadAndBody[fileName]; [head: readServerNameHead, body: readServerNameBody] _ GetHeadAndBody[readServerName]; IF Rope.IsPrefix[readServerNameBody, fileNameBody, FALSE] THEN { equivalentHeads: LIST OF ROPE _ GetPseudoServers[fileNameHead]; FOR heads: LIST OF ROPE _ equivalentHeads, heads.rest WHILE heads#NIL DO IF Rope.Equal[heads.first,BracketServerName[readServerNameHead]] THEN RETURN[shortened: TRUE, shortenedName: Rope.Concat[BracketServerName[pseudoServerName], Rope.Substr[base: fileNameBody, start: Rope.Length[readServerNameBody]] ] ]; ENDLOOP; }; RETURN[shortened: FALSE, shortenedName: NIL]; }; GetHeadAndBody: PROC [name: ROPE] RETURNS [head: ROPE, body: ROPE] = { endOfHead: INT _ Rope.Find[s1: name, s2: "]", pos1: 0, case: FALSE]; head _ Rope.Substr[name, 1, endOfHead-1]; body _ Rope.Substr[name, endOfHead+1]; }; BracketServerName: PROC [name: ROPE] RETURNS [bracketedName: ROPE] = { bracketedName _ Rope.Cat[ "[", name, "]"]; }; GetPseudoServers: PROC [name: ROPE] RETURNS [servers: LIST OF ROPE] = { servers _ FSPseudoServers.TranslateForRead[name]; IF Rope.Equal[servers.first, name] THEN RETURN[LIST[BracketServerName[name]]] ELSE RETURN[servers]; }; pseudoServerReadList: ServerNameReadServerList; RecomputeReadServerList[]; }. âFile: KeyNotePseudoServerImpl.mesa Copyright Ó 1985, 1987 by Xerox Corporation. All rights reserved. Jack Kent January 22, 1988 10:59:07 am PST Contents: Implementation of KeyNotePseudoServer ServerNameReadServerHandle: TYPE = REF ServerNameReadServerObject side effect is to update pseudo-server read list now sort List so longest items are at top fileName is something like '[Cedar]Documentation>Mumble.tioga' readServerName is something like '[Cyan]Documentation>' pseudoServerName is something like '[Doc]' first check to see if the readServerNameBody is a prefix of the fileNameBody now check to see if the readServerNameHead is the same as at least one of the equivalentHeads inititialize Ê%˜šÏnœ™"JšœB™BIcodešœ*™*—J™Jšœ'™/J˜šÏk ˜ J˜J˜J˜J˜Jšœ˜J˜J˜—J˜šœžœž˜&Jšžœ%˜,Jšžœ˜ J˜Jšžœžœžœ˜Jšœžœžœžœ˜DJšœžœžœžœ˜+Jšœžœžœ™Bšœžœžœ˜,Jšœžœ˜ Jšœ ž˜J˜J˜—J˜J™0šœžœžœ˜,Jšœ#˜#šœ˜&Jš žœ#žœžœ:žœžœ+˜®J˜—šžœVžœžœž˜kš žœ žœžœžœ žœ žœž˜NKšœžœžœW˜Kšžœ#žœ ˜=Kšžœ˜—Kšžœ˜—K™)K•StartOfExpansion:[list: LIST OF REF ANY, compareProc: List.CompareProc]šœQ˜Q˜K˜—J˜K˜—š 'œžœžœ žœžœžœ˜ršžœCžœžœž˜YKšœžœžœ ˜DKšœ žœ˜Kšœžœ˜KšœÀ˜ÀKšžœ žœžœ˜(Kšžœ˜Kšžœ ˜K˜K˜——š œžœžœžœ žœžœ žœžœ˜›KšœM™MKšœ ™ Kšœ%™%Kšœ+™+J–>[s1: ROPE, s2: ROPE, pos1: INT _ 0, case: BOOL _ TRUE]šœžœ˜Jšœžœ˜Jšœžœ˜Jšœžœ˜JšœD˜DJšœV˜VJšœL™Lšžœ1žœžœ˜AJšœžœžœžœ#˜@Jšœ]™]š žœžœžœžœžœžœž˜Hšžœ?žœ˜FJšžœ žœA˜WJšœG˜GJ˜——Jšžœ˜J˜—Jšžœ žœžœ˜-J˜J–>[s1: ROPE, s2: ROPE, pos1: INT _ 0, case: BOOL _ TRUE]˜K˜—š œžœžœžœžœžœ˜FKšœ žœ/žœ˜DKšœ)˜)Jšœ&˜&J˜—J˜š œžœžœžœžœ˜FKšœ*˜*J˜J˜—šœžœžœžœ žœžœžœ˜GJšœ2˜2Jšžœ!žœžœžœ˜Mšž˜Jšžœ ˜—J˜K˜—˜K™—K˜K˜K™ Kšœ0˜0Kšœ˜K˜K˜—˜™J˜——J˜J˜—…—