<> <> <> <> <> DIRECTORY AMFiles USING [], BasicTime USING [GMT, nullGMT], FS USING [OpenFile, FileInfo, Error, Open, nullOpenFile], Rope USING [Fetch, ROPE]; AMFilesImpl: CEDAR MONITOR -- protects paths IMPORTS FS, Rope EXPORTS AMFiles = BEGIN OPEN Rope; pathPrefixes: PUBLIC LIST OF ROPE _ LIST[NIL, "///", "///Commands/"]; < use the current default for the running process (do this first)>> < use the Commands subdirectory>> < use the root directory>> FullFileName: PUBLIC PROC [shortName: ROPE, createTime: BasicTime.GMT _ BasicTime.nullGMT] RETURNS[fullName: ROPE _ NIL] = { <> firstChar: CHAR = shortName.Fetch[0]; IF firstChar = '[ OR firstChar = '/ OR firstChar = '< THEN RETURN[shortName]; FOR paths: LIST OF ROPE _ pathPrefixes, paths.rest UNTIL paths = NIL DO ENABLE FS.Error => IF error.group # bug THEN LOOP; RETURN[FS.FileInfo[name: shortName, wantedCreatedTime: createTime, wDir: paths.first ! FS.Error => IF error.group # bug THEN LOOP ].fullFName]; ENDLOOP; }; FullFileNameList: PUBLIC PROC [shortName: ROPE, createTime: BasicTime.GMT _ BasicTime.nullGMT] RETURNS[fullNameList: LIST OF ROPE _ NIL] = { fullName: ROPE _ NIL; firstChar: CHAR = shortName.Fetch[0]; tail: LIST OF ROPE _ NIL; IF firstChar = '[ OR firstChar = '/ OR firstChar = '< THEN RETURN[CONS[shortName, NIL]]; FOR paths: LIST OF ROPE _ pathPrefixes, paths.rest UNTIL paths = NIL DO new: LIST OF ROPE _ LIST[ FS.FileInfo[ name: shortName, wantedCreatedTime: createTime, wDir: paths.first ! FS.Error => IF error.group # bug THEN LOOP ].fullFName ]; IF fullNameList = NIL THEN fullNameList _ new ELSE tail.rest _ new; tail _ new; ENDLOOP; }; OpenIt: PUBLIC PROC [shortName: ROPE, createTime: BasicTime.GMT _ BasicTime.nullGMT] RETURNS[fullName: ROPE _ NIL, openFile: FS.OpenFile _ FS.nullOpenFile] = { <> fullName _ FullFileName[shortName, createTime]; IF fullName # NIL THEN openFile _ FS.Open[fullName ! FS.Error => {fullName _ NIL; CONTINUE}]; }; PrependPathPrefix: PUBLIC ENTRY PROC[pathPrefix: ROPE] = { ENABLE UNWIND => NULL; <> pathPrefixes _ CONS[NIL, CONS[pathPrefix, pathPrefixes.rest]]; }; END.