#include <stdinc.h>#include <filefn.h>string root(filename)string extension(filename)string head(filename)string tail(filename)string fullname(filename) string defext(filename,ext)stream pathopen(path, filename, mode)string pathfind(path, filename)string _mappath(fn, path, filename, arg)bool fexist(filename) string filename, ext, mode, path; DescriptionThe first four functions root(), extension(), head(), and tail(), returns a component of a file name and are equivalent to the C shell substitution characters :r, :e, :h, and :t, respectively. fullname() returns the full name of a file, making it easier to find the file again if the user used chdir(2) during the program. defext() adds an extension to a file name if none already exists. Alternatively, if the extension field ext begins with a *, any old extension in filename is replaced with the given extension. defext(filename, ".xxx") -- add .xxx if no ext defext(filename, "*.xxx") -- force .xxx as extNote: defext returns a pointer to dynamically-allocated string storage which is never freed. This is necessary to ensure safety on multiple calls in a single statement.
pathopen() is used to open files using a search path similar to that used, for example, by csh in searching for a command. The pathopen routine has the same structure as fopen(3) and the filename and mode arguments are the same as in that call. The path argument consists of a list of directories which are prepended to the filename, unless the filename begins with either a / or a ~. The directories in the list are separated by colons as in the definition of the PATH environment variable. White space and empty fields are ignored to simplify formatting of paths in a definition file.
After each directory name has been added, the pathopen performs ~ (tilde) expansion in the same form as csh. The path argument may be NULL, in which case no directories are prepended. This is useful if ~ expansion is the only required function.
pathopen() returns an open stream to the indicated file, or NULL, if no existing file is found.
pathfind() is similar to pathopen, except that it does not try to open the file but instead returns the full name of the first file that exists along the path, or NULL if none exist.
_mappath() maps the string function fn over each path/filename combination, stopping when fn(name, arg) returns non-null. That value is returned. If the function always returns a NULL value for each element in the path, NULL is returned from _mappath.
fexist returns TRUE if the file exists, and FALSE if not. By default NEMO’s stropen(3NEMO) will fail on read if the file does not exist, and fail on write if the file exist, so this function is rarely needed.
~/src/kernel/cores filefn.c
11-jan-86 Last modified Roberts 6-dec-86 Fixed some bugs and updated for Nemo Josh 6-oct-90 Manual page written Peter 17-mar-06 added fullname Peter 17-jan-2023 added fexist Peter