module system/posix/file-abstractions imports system/posix/file strategies /** * Return the absolute path of a pathname. * * @type String -> String * @since 0.9.4 */ abspath = is-abspath < id + <concat-strings> [<getcwd> (), "/", <id>] file-newer = (modification-time, modification-time); gt overlays Read = R_OK() Write = W_OK() Execute = X_OK() Existence = F_OK() strategies /** * @type String -> String */ file-exists = <access> (<id>, [F_OK()]) /** * @type String -> String */ can-read-file = <access> (<id>, [R_OK()]) is-readable = can-read-file /** * @type String -> String */ can-write-file = <access> (<id>, [W_OK()]) is-writable = can-write-file /** * @type String -> String */ can-execute-file = <access> (<id>, [X_OK()]) is-executable = can-execute-file /** * @type String -> String * @inc create? */ can-create-file = where(dirname; can-write-file) /** * find files in paths * * @todo Create a file-exists based on fopen to make this code portable? */ strategies /** * Finds a file in a list of directories (a path). * * <find-path(strict|path)> f looks for a file with name f in the list of * directories path. If the file is not found the behaviour depends on the * strategy strict, if it succeeds a fatal-error is flagged, otherwise the * strategy just fails. * * Example (when run in strategoxt root): * <find-in-path(id|["ssl/spec","ssl/tests"])> "file.str" => "ssl/spec/file.str" */ find-in-path(strict|path) = ?file ; ( file-exists <+ <fetch-elem(<concat-strings; file-exists> [<id>,"/",file])> path <+ if strict then <fatal-error> ["no such file: ", file] else fail end ) /** * Finds a file in a list of directories (a path). * * Differs from find-in-path/(0,0) in that it exits with fatal-error if file is * not found. * * @param should build a list of paths in which the search is performed. */ find-in-path(|path) = find-in-path(id|path) /** * Finds a file in a list of directories (a path) * * @obsolete. * * This strategy operates on a tuple (f, [d*]) where f is the name of the file * to be found, and d* are the directories to search in. The full path of the * first match is the output term. * * Example (when run in strategoxt root): * <find-in-path> ("file.str", ["ssl/spec", "ssl/tests"]) => "ssl/spec/file.str" */ find-in-path = ?(file, path); <find-in-path(fail|path)> file /** * @obsolete */ find-in-path(mkpath) = find-in-path(|<mkpath>) /** * Finds one file with a specific file extension in a list of directories. * * This strategy operates on a tuple (f, [d*]). The one file that will be * searched for is determined by the basename of f and the requested file * extension. * Example: * <find-file(!"rtree")> ("file.str", ["."]) * searches for file.rtree in the current dir. * * @param should build the file extension as a string. */ find-file(|ext, path) = guarantee-extension(|ext) ; find-in-path(fail|path) find-file(|ext) = ?(file, path) ; <find-file(|ext, path)> file /** * @obsolete */ find-file(ext) = find-file(|<ext>) /** * Finds one file with a specific file extension in a list of directories. * * Differs from find-file/(1,0) in that it exits with fatal error if file is * not found. * * @param should build a list of paths in which the search is performed. * @param should build the file extension as a string. */ find-file(mkpath, ext) = guarantee-extension(|<ext>) ; find-in-path(|<mkpath>) /** * Obsolete strategies */ strategies /** * Creates a fresh file in the current directory. * * @obsolete use new-temp-file or XTC temporary files */ new-file = obsolete(!"new-file; use new-temp-file or XTC temporary files") ; rec x(<conc-strings> (<new>(), ".tmp"); try(file-exists; x))