DIRECTORY BasicTime, DFUtilities, IO, RedBlackTree, Rope, TextReplace, ViewerClasses; FileCmds: CEDAR DEFINITIONS = { LORA: TYPE = LIST OF REF ANY; ROPE: TYPE = Rope.ROPE; LOR: TYPE = LIST OF ROPE; RopeMap: TYPE = TextReplace.RopeMap; Viewer: TYPE = ViewerClasses.Viewer; STREAM: TYPE = IO.STREAM; GMT: TYPE = BasicTime.GMT; noGMT: GMT = BasicTime.nullGMT; Error: ERROR [message: ROPE]; Warning: SIGNAL [message: ROPE]; Miss: SIGNAL [name: ROPE, created: GMT]; FileNote: TYPE = REF FileNoteRep; FileNoteRep: TYPE = RECORD [ id: FileID, fsName: ROPE _ NIL, primaryVolume, backupVolume, author: ROPE _ NIL, created, read, write: GMT _ noGMT, createTried, readTried: BOOL _ FALSE]; FileID: TYPE = RECORD [name: ROPE, created: GMT _ noGMT]; FileSet: TYPE = REF FileSetRep; FileSetRep: TYPE = RECORD [ elts: RedBlackTree.Table, ids: IdentificationScheme, summary: ROPE]; FileSetList: TYPE = LIST OF FileSet; FileConsumer: TYPE = PROC [fn: FileNote]; IdentificationScheme: TYPE = RECORD [ server: BOOL _ TRUE, directory: BOOL _ TRUE, version: BOOL _ TRUE, create: BOOL _ FALSE, askFS: BOOL _ FALSE]; CreateNote: PROC [fileName: ROPE, created: GMT, ids: IdentificationScheme] RETURNS [fn: FileNote]; GetCreated: PROC [fn: FileNote] RETURNS [created: GMT]; GetAccounting: PROC [fn: FileNote] RETURNS [read, write: GMT, author: ROPE]; NewFileSet: PROC [ids: IdentificationScheme _ []] RETURNS [fs: FileSet]; EnumSet: PROC [fs: FileSet, to: FileConsumer]; First: PROC [fs: FileSet] RETURNS [fn: FileNote]; Next: PROC [fs: FileSet, fn: FileNote] RETURNS [next: FileNote]; Lookup: PROC [fs: FileSet, fn: FileNote] RETURNS [found: FileNote]; Delete: PROC [fs: FileSet, fn: FileNote] RETURNS [found: FileNote]; Insert: PROC [fs: FileSet, fn: FileNote] RETURNS [news: BOOL]; Size: PROC [fs: FileSet] RETURNS [numberOfFiles: INT]; MapNames: PROC [fs: FileSet, map: RopeMap, mapIDName, mapFSName: BOOL _ TRUE] RETURNS [mfs: FileSet]; pseudoServerToRead: RopeMap; Realify: PROC [fs: FileSet] RETURNS [mfs: FileSet] = INLINE {mfs _ MapNames[fs, pseudoServerToRead, TRUE, TRUE]}; Union: PROC [fsl: FileSetList, fr: FileRelation _ NIL] RETURNS [fs: FileSet]; Intersection: PROC [fsl: FileSetList, fr: FileRelation _ NIL] RETURNS [fs: FileSet]; Difference: PROC [fsl: FileSetList, fr: FileRelation _ NIL] RETURNS [fs: FileSet]; SymmetricDifference: PROC [fsl: FileSetList, fr: FileRelation _ NIL] RETURNS [fs: FileSet]; equality: FileRelation; FileRelation: TYPE = REF FileRelationPrivate; FileRelationPrivate: TYPE = RECORD [ Test: PROC [data: REF ANY, left, right: FileID] RETURNS [BOOL], LeftToRight: PROC [data: REF ANY, fid: FileID] RETURNS [FileIDRange], RightToLeft: PROC [data: REF ANY, fid: FileID] RETURNS [FileIDRange], data: REF ANY _ NIL ]; FileIDRange: TYPE = RECORD [ lowName, highName: ROPE, earlyCreated, lateCreated: GMT _ noGMT ]; ReverseFileRelation: PROC [fr: FileRelation] RETURNS [frr: FileRelation]; FilterFileSet: PROC [subject: FileSet, filter: Filter] RETURNS [filtered: FileSet]; FilterList: TYPE = LIST OF Filter; Filter: TYPE = REF FilterRep; FilterRep: TYPE = RECORD [ Eval: FilterEvalProc, data: REF ANY]; FilterEvalProc: TYPE = PROC [fn: FileNote, data: REF ANY] RETURNS [BOOL]; And, Or: PROC [FilterList] RETURNS [Filter]; Not: PROC [Filter] RETURNS [Filter]; IfCreated: PROC [reln: TimeReln, when: GMT] RETURNS [Filter]; IfRead: PROC [reln: TimeReln, when: GMT] RETURNS [Filter]; TimeReln: TYPE = {before, after}; NameMatches: PROC [pattern: ROPE, literal, word, ignoreCase, addBounds: BOOL _ FALSE] RETURNS [Filter]; IsArchived: PROC [--caches current BTree--] RETURNS [Filter]; isOnline: Filter; --consults FS ContentsPass: PROC [filter: Filter, dfFilter: DFUtilities.Filter, allowableExceptions: NAT _ 0, ids: IdentificationScheme] RETURNS [Filter--applicable only to DF files--]; FromFS: PROC [pattern: ROPE, ids: IdentificationScheme _ []] RETURNS [fs: FileSet]; EnumFSMatches: PROC [pattern: ROPE, to: FileConsumer, ids: IdentificationScheme _ []]; FromDF: PROC [dfName: ROPE, date: DFUtilities.Date _ [], filter: DFUtilities.Filter, which: DFWhich, ids: IdentificationScheme _ []] RETURNS [fs: FileSet]; FromDFs: PROC [dfs: FileSet, filter: DFUtilities.Filter, which: DFWhich, ids: IdentificationScheme _ []] RETURNS [fs: FileSet]; EnumDF: PROC [dfName: ROPE, date: DFUtilities.Date _ [], to: FileConsumer, filter: DFUtilities.Filter, which: DFWhich, ids: IdentificationScheme _ []]; DFWhich: TYPE = {remote, local}; MentionedDFs: PROC [dfName: ROPE, filter: DFUtilities.Filter _ [], ids: IdentificationScheme _ []] RETURNS [fs: FileSet]; EnumMentionedDFs: PROC [dfName: ROPE, filter: DFUtilities.Filter _ [], to: FileConsumer, ids: IdentificationScheme _ []]; FromArchiveMsg: PROC [date: GMT, which: ArchiveWhich, ids: IdentificationScheme _ []] RETURNS [fs: FileSet]; EnumArchiveMsg: PROC [date: GMT, to: FileConsumer, which: ArchiveWhich, ids: IdentificationScheme _ []]; ArchiveWhich: TYPE = {archive, online}; FromArchivist: PROC [pattern: ROPE, created: GMT _ noGMT, ids: IdentificationScheme _ []] RETURNS [fs: FileSet]; EnumArchivist: PROC [pattern: ROPE, to: FileConsumer, created: GMT _ noGMT, ids: IdentificationScheme _ []]; FromRope: PROC [rope: ROPE, ids: IdentificationScheme _ []] RETURNS [fs: FileSet]; FromFile: PROC [fileName: ROPE, ids: IdentificationScheme _ []] RETURNS [fs: FileSet]; FromStream: PROC [from: STREAM, ids: IdentificationScheme _ []] RETURNS [fs: FileSet]; ToRope: PROC [fs: FileSet] RETURNS [ROPE]; ToFile: PROC [fs: FileSet, fileName: ROPE]; ToStream: PROC [fs: FileSet, to: IO.STREAM]; }. 2FileCmds.Mesa Copyright c 1984 by Xerox Corporation. All rights reserved. Last Edited by: Spreitzer, February 10, 1986 6:20:01 pm PST Types: For syntax errors and such. For syntax errors and such. Informational signal: Couldn't identify. FileNote Operations: may return noGMT. may return [noGMT, noGMT, NIL]. FileSet Operations: Maps Pseudo-servers into real ones. The folllowing four functions do basic set operations. Binary operators are exetended to lists by Op[LIST[s1, s2, ... sn]] = Op[...Op[s1, s2], ... sn]. The familiar definitions of these operations make use of the concept of equality. In the functions that follow, a general relation fr may be used in place of equality; when fr is defaulted to NIL it means to use equality. Union[LIST[A, B], fr] = A U Difference[LIST[B, A], fr!] fr![fn', fn] = fr[fn, fn'] Intersection[LIST[A, B], fr] = {fn | fn B A & E fn' B B , fr[fn, fn']} Difference[LIST[A, B], fr] = A - Intersection[LIST[A, B], fr] SymmetricDifference[LIST[A, B], fr] = Difference[LIST[A, B], fr] U Difference[LIST[B, A], fr!] Primitive Enumerations: A hash sign (#) in the pattern is just like an asterisk (*), except that it won't match across directories. Pattern must be in [Server]... format, not slashy format. Pattern must be in [Server]... format, not slashy format. Κ5˜Icode™ Kšœ Οmœ1™Kš œžœžœžœ˜6Kš  œžœ3žœžœžœ˜eK˜š œžœžœ˜2Kšœžœ)žœžœ˜>K™#—K˜KšœxΟdœ‘œβ™ψK˜š œžœ'žœžœ˜MKšœœΠmuœ™7Kšœ’œ™—K˜š  œžœ'žœžœ˜TKš œ(œœœœœ ™F—K˜š  œžœ'žœžœ˜RKšœ=™=—K˜š œžœ'žœžœ˜[KšœAœ’œ™^—K˜Kšœ˜K˜Kšœžœžœ˜-šœžœžœ˜$Kš  œžœžœžœžœžœ˜?Kš   œžœžœžœžœ˜EKš   œžœžœžœžœ˜EKšœžœžœž˜K˜—K˜šœ žœžœ˜Kšœžœ˜Kšœžœ˜&K˜—K˜Kš œžœžœ˜IK˜Kš  œžœ$žœ˜SK˜Kšœ žœžœžœ˜"Kšœžœžœ ˜šœ žœžœ˜Kšœ˜Kšœžœžœ˜—K˜Kš œžœžœžœžœžœžœ˜IK˜Kšœ œžœžœ ˜,Kš œžœ žœ ˜$K˜Kš  œžœžœžœ ˜=š œžœžœžœ ˜:Kšœ žœ˜!—K˜Kš   œžœ žœ(žœžœžœ ˜gK˜Kš  œžœΟcœžœ ˜=K˜Kšœ£ ˜K˜Kš   œžœEžœ!žœ£œ˜«—™Kš œžœ žœ"žœ˜SK˜š  œžœ žœ4˜VK™k—K˜Kš œžœ žœkžœ˜›K˜Kš œžœ\žœ˜K˜š œžœ žœ}˜—K˜Kšœ žœ˜ —K˜Kš  œžœ žœCžœ˜yK˜Kš œžœ žœU˜yK˜Kš œžœžœ7žœ˜lK˜š œžœžœI˜hK˜Kšœžœ˜'—K˜š   œžœ žœ žœ*žœ˜pK™D—K˜š  œžœ žœžœ*˜lK™D—K˜Kš œžœžœ"žœ˜RK˜Kš œžœ žœ"žœ˜VK˜Kš  œžœžœ"žœ˜VK˜Kš œžœžœžœ˜*Kš œžœžœ˜+Kš œžœžœžœ˜,K˜—Kšœ˜——…—ή#E