# HG changeset patch # User Richard M. Stallman # Date 717020236 0 # Node ID fb4ec23ef80f8a9ed0df29cf3219ce18b186e587 # Parent 835b1e5706215775f2a4bf10829b68f5e5de4264 Don't include sys/dir.h. (Fverify_visited_file_modtime): Pass buffer itself to handler, if have handler. (Fwrite_region): GCPRO around Fexpand_file_name, Ffie_name_directory. (Fread_file_name_internal): GCPRO around file name manip. (Ffile_writable_p, Ffile_readable_p): Use abspath, not filename, (Ffile_executable_p, Ffile_exists_p): to run the handler. (Fset_file_modes, Ffile_directory_p, Ffile_modes): Likewise. (Ffile_newer_than_file_p): GCPRO around expand_and_dir_to_file. diff -r 835b1e570621 -r fb4ec23ef80f src/fileio.c --- a/src/fileio.c Sun Sep 20 19:06:51 1992 +0000 +++ b/src/fileio.c Sun Sep 20 20:17:16 1992 +0000 @@ -35,8 +35,6 @@ #include #include #include -#else -#include #endif #include @@ -174,7 +172,7 @@ Lisp_Object string; string = XCONS (elt)->car; if (XTYPE (string) == Lisp_String - && fast_string_match (string, filename)) + && fast_string_match (string, filename) >= 0) return XCONS (elt)->cdr; } } @@ -584,7 +582,7 @@ call the corresponding file handler. */ handler = find_file_handler (name); if (!NILP (handler)) - return call2 (handler, Qexpand_file_name, name); + return call3 (handler, Qexpand_file_name, name, defalt); #ifdef VMS /* Filenames on VMS are always upper case. */ @@ -1875,9 +1873,9 @@ /* If the file name has special constructs in it, call the corresponding file handler. */ - handler = find_file_handler (filename); + handler = find_file_handler (abspath); if (!NILP (handler)) - return call2 (handler, Qfile_exists_p, filename); + return call2 (handler, Qfile_exists_p, abspath); return (access (XSTRING (abspath)->data, 0) >= 0) ? Qt : Qnil; } @@ -1897,9 +1895,9 @@ /* If the file name has special constructs in it, call the corresponding file handler. */ - handler = find_file_handler (filename); + handler = find_file_handler (abspath); if (!NILP (handler)) - return call2 (handler, Qfile_executable_p, filename); + return call2 (handler, Qfile_executable_p, abspath); return (access (XSTRING (abspath)->data, 1) >= 0) ? Qt : Qnil; } @@ -1918,9 +1916,9 @@ /* If the file name has special constructs in it, call the corresponding file handler. */ - handler = find_file_handler (filename); + handler = find_file_handler (abspath); if (!NILP (handler)) - return call2 (handler, Qfile_readable_p, filename); + return call2 (handler, Qfile_readable_p, abspath); return (access (XSTRING (abspath)->data, 4) >= 0) ? Qt : Qnil; } @@ -1987,9 +1985,9 @@ /* If the file name has special constructs in it, call the corresponding file handler. */ - handler = find_file_handler (filename); + handler = find_file_handler (abspath); if (!NILP (handler)) - return call2 (handler, Qfile_writable_p, filename); + return call2 (handler, Qfile_writable_p, abspath); if (access (XSTRING (abspath)->data, 0) >= 0) return (access (XSTRING (abspath)->data, 2) >= 0) ? Qt : Qnil; @@ -2017,9 +2015,9 @@ /* If the file name has special constructs in it, call the corresponding file handler. */ - handler = find_file_handler (filename); + handler = find_file_handler (abspath); if (!NILP (handler)) - return call2 (handler, Qfile_directory_p, filename); + return call2 (handler, Qfile_directory_p, abspath); if (stat (XSTRING (abspath)->data, &st) < 0) return Qnil; @@ -2064,9 +2062,9 @@ /* If the file name has special constructs in it, call the corresponding file handler. */ - handler = find_file_handler (filename); + handler = find_file_handler (abspath); if (!NILP (handler)) - return call2 (handler, Qfile_modes, filename); + return call2 (handler, Qfile_modes, abspath); if (stat (XSTRING (abspath)->data, &st) < 0) return Qnil; @@ -2087,9 +2085,9 @@ /* If the file name has special constructs in it, call the corresponding file handler. */ - handler = find_file_handler (filename); + handler = find_file_handler (abspath); if (!NILP (handler)) - return call3 (handler, Qset_file_modes, filename, mode); + return call3 (handler, Qset_file_modes, abspath, mode); #ifndef APOLLO if (chmod (XSTRING (abspath)->data, XINT (mode)) < 0) @@ -2179,12 +2177,16 @@ struct stat st; int mtime1; Lisp_Object handler; + struct gcpro gcpro1, gcpro2; CHECK_STRING (file1, 0); CHECK_STRING (file2, 0); + abspath1 = Qnil; + GCPRO2 (abspath1, file2); abspath1 = expand_and_dir_to_file (file1, current_buffer->directory); abspath2 = expand_and_dir_to_file (file2, current_buffer->directory); + UNGCPRO; /* If the file name has special constructs in it, call the corresponding file handler. */ @@ -2392,6 +2394,7 @@ unsigned char *fname = 0; /* If non-0, original filename (must rename) */ #endif /* VMS */ Lisp_Object handler; + struct gcpro gcpro1, gcpro2; /* Special kludge to simplify auto-saving */ if (NILP (start)) @@ -2402,8 +2405,8 @@ else if (XTYPE (start) != Lisp_String) validate_region (&start, &end); + GCPRO2 (start, filename); filename = Fexpand_file_name (filename, Qnil); - fn = XSTRING (filename)->data; /* If the file name has special constructs in it, call the corresponding file handler. */ @@ -2432,6 +2435,7 @@ XFASTINT (current_buffer->save_length) = Z - BEG; current_buffer->filename = filename; } + UNGCPRO; return val; } @@ -2440,6 +2444,7 @@ lock_file (filename); #endif /* CLASH_DETECTION */ + fn = XSTRING (filename)->data; desc = -1; if (!NILP (append)) desc = open (fn, O_WRONLY); @@ -2494,6 +2499,8 @@ desc = creat (fn, auto_saving ? auto_save_mode_bits : 0666); #endif /* not VMS */ + UNGCPRO; + if (desc < 0) { #ifdef CLASH_DETECTION @@ -2700,7 +2707,7 @@ call the corresponding file handler. */ handler = find_file_handler (b->filename); if (!NILP (handler)) - return call2 (handler, Qverify_visited_file_modtime, b->filename); + return call2 (handler, Qverify_visited_file_modtime, buf); if (stat (XSTRING (b->filename)->data, &st) < 0) { @@ -2901,36 +2908,46 @@ lambda for verify final value */ { Lisp_Object name, specdir, realdir, val, orig_string; + int changed; + struct gcpro gcpro1, gcpro2, gcpro3, gcpro4; + + realdir = dir; + name = string; + orig_string = Qnil; + specdir = Qnil; + changed = 0; + /* No need to protect ACTION--we only compare it with t and nil. */ + GCPRO4 (string, realdir, name, specdir); if (XSTRING (string)->size == 0) { - orig_string = Qnil; - name = string; - realdir = dir; if (EQ (action, Qlambda)) - return Qnil; + { + UNGCPRO; + return Qnil; + } } else { orig_string = string; string = Fsubstitute_in_file_name (string); + changed = NILP (Fstring_equal (string, orig_string)); name = Ffile_name_nondirectory (string); - realdir = Ffile_name_directory (string); - if (NILP (realdir)) - realdir = dir; - else - realdir = Fexpand_file_name (realdir, dir); + val = Ffile_name_directory (string); + if (! NILP (val)) + realdir = Fexpand_file_name (val, realdir); } if (NILP (action)) { specdir = Ffile_name_directory (string); val = Ffile_name_completion (name, realdir); + UNGCPRO; if (XTYPE (val) != Lisp_String) { - if (NILP (Fstring_equal (string, orig_string))) + if (changed) return string; - return (val); + return val; } if (!NILP (specdir)) @@ -2962,8 +2979,9 @@ } } #endif /* Not VMS */ - return (val); + return val; } + UNGCPRO; if (EQ (action, Qt)) return Ffile_name_all_completions (name, realdir); @@ -3208,6 +3226,8 @@ (file-exists-p FILENAME)\n\ and FILENAME is handled by HANDLER, then HANDLER is called like this:\n\ (funcall HANDLER 'file-exists-p FILENAME)"); + Vfile_name_handler_alist = Qnil; + defsubr (&Sfile_name_directory); defsubr (&Sfile_name_nondirectory); defsubr (&Sfile_name_as_directory);