<> <> DIRECTORY AMFiles USING [], BasicTime USING [GMT, nullGMT], FS USING [OpenFile, FileInfo, Error, Open, nullOpenFile, GetDefaultWDir], Rope USING [Fetch, ROPE]; AMFilesImpl: CEDAR MONITOR -- protects paths IMPORTS FS, Rope EXPORTS AMFiles = BEGIN OPEN Rope; pathPrefixes: PUBLIC LIST OF ROPE _ CONS["///", NIL]; <> FullFileName: PUBLIC PROC [shortName: ROPE, createTime: BasicTime.GMT _ BasicTime.nullGMT] RETURNS[fullName: ROPE] = { 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 fullName _ FS.FileInfo[name: shortName, wantedCreatedTime: createTime, wDir: paths.first ! FS.Error => {fullName _ NIL; CONTINUE}].fullFName; IF fullName = NIL THEN LOOP; RETURN[fullName]; ENDLOOP; fullName _ FS.FileInfo[name: shortName, wantedCreatedTime: createTime, wDir: FS.GetDefaultWDir[] ! FS.Error => {fullName _ NIL; CONTINUE}].fullFName; }; <> 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[pathPrefix, pathPrefixes]; }; END.