Lisp_Object Qdirectory_file_name;
Lisp_Object Qfile_name_directory;
Lisp_Object Qfile_name_nondirectory;
+Lisp_Object Qunhandled_file_name_directory;
Lisp_Object Qfile_name_as_directory;
Lisp_Object Qcopy_file;
Lisp_Object Qmake_directory;
Lisp_Object Qwrite_region;
Lisp_Object Qverify_visited_file_modtime;
-/* If FILENAME is handled specially on account of its syntax,
- return its handler function. Otherwise, return nil. */
-
-Lisp_Object
-find_file_handler (filename)
- Lisp_Object filename;
+DEFUN ("find-file-name-handler", Ffind_file_name_handler, Sfind_file_name_handler, 1, 1, 0,
+ "Return FILENAME's handler function, if its syntax is handled specially.\n\
+Otherwise, return nil.\n\
+A file name is handled if one of the regular expressions in\n\
+`file-name-handler-alist' matches it.")
+ (filename)
+ Lisp_Object filename;
{
+ /* This function must not munge the match data. */
+
Lisp_Object chain;
for (chain = Vfile_name_handler_alist; XTYPE (chain) == Lisp_Cons;
chain = XCONS (chain)->cdr)
&& fast_string_match (string, filename) >= 0)
return XCONS (elt)->cdr;
}
+
+ QUIT;
}
return Qnil;
}
/* If the file name has special constructs in it,
call the corresponding file handler. */
- handler = find_file_handler (file);
+ handler = Ffind_file_name_handler (file);
if (!NILP (handler))
return call2 (handler, Qfile_name_directory, file);
/* If the file name has special constructs in it,
call the corresponding file handler. */
- handler = find_file_handler (file);
+ handler = Ffind_file_name_handler (file);
if (!NILP (handler))
return call2 (handler, Qfile_name_nondirectory, file);
return make_string (p, end - p);
}
+
+DEFUN ("unhandled-file-name-directory", Funhandled_file_name_directory, Sunhandled_file_name_directory, 1, 1, 0,
+ "Return a directly usable directory name somehow associated with FILENAME.\n\
+A `directly usable' directory name is one that may be used without the\n\
+intervention of any file handler.\n\
+If FILENAME is a directly usable file itself, return\n\
+(file-name-directory FILENAME).\n\
+The `call-process' and `start-process' functions use this function to\n\
+get a current directory to run processes in.")
+ (filename)
+ Lisp_Object filename;
+{
+ Lisp_Object handler;
+
+ /* If the file name has special constructs in it,
+ call the corresponding file handler. */
+ handler = Ffind_file_name_handler (filename);
+ if (!NILP (handler))
+ return call2 (handler, Qunhandled_file_name_directory, filename);
+
+ return Ffile_name_directory (filename);
+}
+
\f
char *
file_name_as_directory (out, in)
/* If the file name has special constructs in it,
call the corresponding file handler. */
- handler = find_file_handler (file);
+ handler = Ffind_file_name_handler (file);
if (!NILP (handler))
return call2 (handler, Qfile_name_as_directory, file);
/* If the file name has special constructs in it,
call the corresponding file handler. */
- handler = find_file_handler (directory);
+ handler = Ffind_file_name_handler (directory);
if (!NILP (handler))
return call2 (handler, Qdirectory_file_name, directory);
/* If the file name has special constructs in it,
call the corresponding file handler. */
- handler = find_file_handler (name);
+ handler = Ffind_file_name_handler (name);
if (!NILP (handler))
return call3 (handler, Qexpand_file_name, name, defalt);
/* If the input file name has special constructs in it,
call the corresponding file handler. */
- handler = find_file_handler (filename);
+ handler = Ffind_file_name_handler (filename);
if (!NILP (handler))
return call3 (handler, Qcopy_file, filename, newname);
/* Likewise for output file name. */
- handler = find_file_handler (newname);
+ handler = Ffind_file_name_handler (newname);
if (!NILP (handler))
return call3 (handler, Qcopy_file, filename, newname);
CHECK_STRING (dirname, 0);
dirname = Fexpand_file_name (dirname, Qnil);
- handler = find_file_handler (dirname);
+ handler = Ffind_file_name_handler (dirname);
if (!NILP (handler))
return call3 (handler, Qmake_directory, dirname, Qnil);
dirname = Fexpand_file_name (dirname, Qnil);
dir = XSTRING (dirname)->data;
- handler = find_file_handler (dirname);
+ handler = Ffind_file_name_handler (dirname);
if (!NILP (handler))
return call2 (handler, Qdelete_directory, dirname);
CHECK_STRING (filename, 0);
filename = Fexpand_file_name (filename, Qnil);
- handler = find_file_handler (filename);
+ handler = Ffind_file_name_handler (filename);
if (!NILP (handler))
return call2 (handler, Qdelete_file, filename);
/* If the file name has special constructs in it,
call the corresponding file handler. */
- handler = find_file_handler (filename);
+ handler = Ffind_file_name_handler (filename);
if (!NILP (handler))
return call3 (handler, Qrename_file, filename, newname);
/* If the file name has special constructs in it,
call the corresponding file handler. */
- handler = find_file_handler (filename);
+ handler = Ffind_file_name_handler (filename);
if (!NILP (handler))
return call3 (handler, Qadd_name_to_file, filename, newname);
/* If the file name has special constructs in it,
call the corresponding file handler. */
- handler = find_file_handler (filename);
+ handler = Ffind_file_name_handler (filename);
if (!NILP (handler))
return call3 (handler, Qmake_symbolic_link, filename, linkname);
/* If the file name has special constructs in it,
call the corresponding file handler. */
- handler = find_file_handler (abspath);
+ handler = Ffind_file_name_handler (abspath);
if (!NILP (handler))
return call2 (handler, Qfile_exists_p, abspath);
/* If the file name has special constructs in it,
call the corresponding file handler. */
- handler = find_file_handler (abspath);
+ handler = Ffind_file_name_handler (abspath);
if (!NILP (handler))
return call2 (handler, Qfile_executable_p, abspath);
/* If the file name has special constructs in it,
call the corresponding file handler. */
- handler = find_file_handler (abspath);
+ handler = Ffind_file_name_handler (abspath);
if (!NILP (handler))
return call2 (handler, Qfile_readable_p, abspath);
/* If the file name has special constructs in it,
call the corresponding file handler. */
- handler = find_file_handler (filename);
+ handler = Ffind_file_name_handler (filename);
if (!NILP (handler))
return call2 (handler, Qfile_symlink_p, filename);
/* If the file name has special constructs in it,
call the corresponding file handler. */
- handler = find_file_handler (abspath);
+ handler = Ffind_file_name_handler (abspath);
if (!NILP (handler))
return call2 (handler, Qfile_writable_p, abspath);
/* If the file name has special constructs in it,
call the corresponding file handler. */
- handler = find_file_handler (abspath);
+ handler = Ffind_file_name_handler (abspath);
if (!NILP (handler))
return call2 (handler, Qfile_directory_p, abspath);
/* If the file name has special constructs in it,
call the corresponding file handler. */
- handler = find_file_handler (filename);
+ handler = Ffind_file_name_handler (filename);
if (!NILP (handler))
return call2 (handler, Qfile_accessible_directory_p, filename);
/* If the file name has special constructs in it,
call the corresponding file handler. */
- handler = find_file_handler (abspath);
+ handler = Ffind_file_name_handler (abspath);
if (!NILP (handler))
return call2 (handler, Qfile_modes, abspath);
/* If the file name has special constructs in it,
call the corresponding file handler. */
- handler = find_file_handler (abspath);
+ handler = Ffind_file_name_handler (abspath);
if (!NILP (handler))
return call3 (handler, Qset_file_modes, abspath, mode);
/* If the file name has special constructs in it,
call the corresponding file handler. */
- handler = find_file_handler (abspath1);
+ handler = Ffind_file_name_handler (abspath1);
if (!NILP (handler))
return call3 (handler, Qfile_newer_than_file_p, abspath1, abspath2);
/* If the file name has special constructs in it,
call the corresponding file handler. */
- handler = find_file_handler (filename);
+ handler = Ffind_file_name_handler (filename);
if (!NILP (handler))
{
val = call3 (handler, Qinsert_file_contents, filename, visit);
/* If the file name has special constructs in it,
call the corresponding file handler. */
- handler = find_file_handler (filename);
+ handler = Ffind_file_name_handler (filename);
if (!NILP (handler))
{
/* If the file name has special constructs in it,
call the corresponding file handler. */
- handler = find_file_handler (b->filename);
+ handler = Ffind_file_name_handler (b->filename);
if (!NILP (handler))
return call2 (handler, Qverify_visited_file_modtime, buf);
/* If the file name has special constructs in it,
call the corresponding file handler. */
- handler = find_file_handler (filename);
+ handler = Ffind_file_name_handler (filename);
if (!NILP (handler))
current_buffer->modtime = 0;
Qdirectory_file_name = intern ("directory-file-name");
Qfile_name_directory = intern ("file-name-directory");
Qfile_name_nondirectory = intern ("file-name-nondirectory");
+ Qunhandled_file_name_directory = intern ("unhandled-file-name-directory");
Qfile_name_as_directory = intern ("file-name-as-directory");
Qcopy_file = intern ("copy-file");
Qmake_directory = intern ("make-directory");
Qwrite_region = intern ("write-region");
Qverify_visited_file_modtime = intern ("verify-visited-file-modtime");
- Qfile_name_history = intern ("file-name-history");
- Fset (Qfile_name_history, Qnil);
-
+ staticpro (&Qexpand_file_name);
+ staticpro (&Qdirectory_file_name);
+ staticpro (&Qfile_name_directory);
+ staticpro (&Qfile_name_nondirectory);
+ staticpro (&Qunhandled_file_name_directory);
+ staticpro (&Qfile_name_as_directory);
staticpro (&Qcopy_file);
staticpro (&Qmake_directory);
staticpro (&Qdelete_directory);
staticpro (&Qinsert_file_contents);
staticpro (&Qwrite_region);
staticpro (&Qverify_visited_file_modtime);
+
+ Qfile_name_history = intern ("file-name-history");
+ Fset (Qfile_name_history, Qnil);
staticpro (&Qfile_name_history);
Qfile_error = intern ("file-error");
passed to that primitive. For example, if you do\n\
(file-exists-p FILENAME)\n\
and FILENAME is handled by HANDLER, then HANDLER is called like this:\n\
- (funcall HANDLER 'file-exists-p FILENAME)");
+ (funcall HANDLER 'file-exists-p FILENAME)\n\
+The function `find-file-name-handler' checks this list for a handler\n\
+for its argument.");
Vfile_name_handler_alist = Qnil;
+ defsubr (&Sfind_file_name_handler);
defsubr (&Sfile_name_directory);
defsubr (&Sfile_name_nondirectory);
+ defsubr (&Sunhandled_file_name_directory);
defsubr (&Sfile_name_as_directory);
defsubr (&Sdirectory_file_name);
defsubr (&Smake_temp_name);