Mercurial > emacs
changeset 12642:cdfbcff1f22a
(do_auto_save_unwind): Set auto_saving to 0.
(Fdo_auto_save): Don't clear auto_saving here. Set it to 1
only when we make the unwind-protect.
(Ffile_modes) [DOS_NT]: Use check_executable.
(check_executable): DOS_NT code moved here from Ffile_modes.
(check_writable): New code for MSDOS.
(Fexpand_file_name): Initial ~ means name is absolute.
author | Richard M. Stallman <rms@gnu.org> |
---|---|
date | Sat, 22 Jul 1995 16:13:31 +0000 |
parents | aadec66110fd |
children | 45ada337053e |
files | src/fileio.c |
diffstat | 1 files changed, 53 insertions(+), 28 deletions(-) [+] |
line wrap: on
line diff
--- a/src/fileio.c Sat Jul 22 16:11:48 1995 +0000 +++ b/src/fileio.c Sat Jul 22 16:13:31 1995 +0000 @@ -835,6 +835,32 @@ } #endif /* DOS_NT */ + /* Handle // and /~ in middle of file name + by discarding everything through the first / of that sequence. */ + p = nm; + while (*p) + { + /* Since we know the path is absolute, we can assume that each + element starts with a "/". */ + + /* "//" anywhere isn't necessarily hairy; we just start afresh + with the second slash. */ + if (IS_DIRECTORY_SEP (p[0]) && IS_DIRECTORY_SEP (p[1]) +#if defined (APOLLO) || defined (WINDOWSNT) + /* // at start of filename is meaningful on Apollo + and WindowsNT systems */ + && nm != p +#endif /* APOLLO || WINDOWSNT */ + ) + nm = p + 1; + + /* "~" is hairy as the start of any path element. */ + if (IS_DIRECTORY_SEP (p[0]) && p[1] == '~') + nm = p + 1; + + p++; + } + /* If nm is absolute, flush ...// and detect /./ and /../. If no /./ or /../ we can return right away. */ if ( @@ -858,21 +884,6 @@ /* Since we know the path is absolute, we can assume that each element starts with a "/". */ - /* "//" anywhere isn't necessarily hairy; we just start afresh - with the second slash. */ - if (IS_DIRECTORY_SEP (p[0]) && IS_DIRECTORY_SEP (p[1]) -#if defined (APOLLO) || defined (WINDOWSNT) - /* // at start of filename is meaningful on Apollo - and WindowsNT systems */ - && nm != p -#endif /* APOLLO || WINDOWSNT */ - ) - nm = p + 1; - - /* "~" is hairy as the start of any path element. */ - if (IS_DIRECTORY_SEP (p[0]) && p[1] == '~') - nm = p + 1, lose = 1; - /* "." and ".." are hairy. */ if (IS_DIRECTORY_SEP (p[0]) && p[1] == '.' @@ -2284,6 +2295,18 @@ check_executable (filename) char *filename; { +#ifdef DOS_NT + int len = strlen (filename); + char *suffix; + struct stat st; + if (stat (filename, &st) < 0) + return 0; + return (S_ISREG (st.st_mode) + && len >= 5 + && (stricmp ((suffix = filename + len-4), ".com") == 0 + || stricmp (suffix, ".exe") == 0 + || stricmp (suffix, ".bat") == 0)); +#else /* not DOS_NT */ #ifdef HAVE_EACCESS return (eaccess (filename, 1) >= 0); #else @@ -2292,6 +2315,7 @@ But Unix doesn't give us a right way to do it. */ return (access (filename, 1) >= 0); #endif +#endif /* not DOS_NT */ } /* Return nonzero if file FILENAME exists and can be written. */ @@ -2300,6 +2324,12 @@ check_writable (filename) char *filename; { +#ifdef MSDOS + struct stat st; + if (stat (filename, &st) < 0) + return 0; + return (st.st_mode & S_IWRITE || (st.st_mode & S_IFMT) == S_IFDIR); +#else /* not MSDOS */ #ifdef HAVE_EACCESS return (eaccess (filename, 2) >= 0); #else @@ -2310,6 +2340,7 @@ but would lose for directories. */ return (access (filename, 2) >= 0); #endif +#endif /* not MSDOS */ } DEFUN ("file-exists-p", Ffile_exists_p, Sfile_exists_p, 1, 1, 0, @@ -2565,16 +2596,8 @@ if (stat (XSTRING (abspath)->data, &st) < 0) return Qnil; #ifdef DOS_NT - { - int len; - char *suffix; - if (S_ISREG (st.st_mode) - && (len = XSTRING (abspath)->size) >= 5 - && (stricmp ((suffix = XSTRING (abspath)->data + len-4), ".com") == 0 - || stricmp (suffix, ".exe") == 0 - || stricmp (suffix, ".bat") == 0)) - st.st_mode |= S_IEXEC; - } + if (check_executable (XSTRING (abspath)->data)) + st.st_mode |= S_IEXEC; #endif /* DOS_NT */ return make_number (st.st_mode & 07777); @@ -3733,6 +3756,7 @@ do_auto_save_unwind (desc) /* used as unwind-protect function */ Lisp_Object desc; { + auto_saving = 0; close (XINT (desc)); return Qnil; } @@ -3770,7 +3794,6 @@ /* No GCPRO needed, because (when it matters) all Lisp_Object variables point to non-strings reached from Vbuffer_alist. */ - auto_saving = 1; if (minibuf_level) no_message = Qt; @@ -3792,10 +3815,13 @@ else listdesc = -1; - /* Arrange to close that file whether or not we get an error. */ + /* Arrange to close that file whether or not we get an error. + Also reset auto_saving to 0. */ if (listdesc >= 0) record_unwind_protect (do_auto_save_unwind, make_number (listdesc)); + auto_saving = 1; + /* First, save all files which don't have handlers. If Emacs is crashing, the handlers may tweak what is causing Emacs to crash in the first place, and it would be a shame if Emacs failed to @@ -3903,7 +3929,6 @@ Vquit_flag = oquit; - auto_saving = 0; unbind_to (count, Qnil); return Qnil; }