Mercurial > emacs
changeset 592:e65af468dcc2
*** empty log message ***
author | Richard M. Stallman <rms@gnu.org> |
---|---|
date | Fri, 20 Mar 1992 20:54:03 +0000 |
parents | 647732fc239f |
children | bd5346b8a486 |
files | src/fileio.c |
diffstat | 1 files changed, 26 insertions(+), 16 deletions(-) [+] |
line wrap: on
line diff
--- a/src/fileio.c Fri Mar 20 17:00:55 1992 +0000 +++ b/src/fileio.c Fri Mar 20 20:54:03 1992 +0000 @@ -117,6 +117,12 @@ Fsignal (Qfile_error, Fcons (build_string (string), Fcons (errstring, data))); } + +close_file_unwind (fd) + Lisp_Object fd; +{ + close (XFASTINT (fd)); +} DEFUN ("file-name-directory", Ffile_name_directory, Sfile_name_directory, 1, 1, 0, @@ -1374,6 +1380,7 @@ char buf[16 * 1024]; struct stat st; struct gcpro gcpro1, gcpro2; + int count = specpdl_ptr - specpdl; GCPRO2 (filename, newname); CHECK_STRING (filename, 0); @@ -1389,6 +1396,8 @@ if (ifd < 0) report_file_error ("Opening input file", Fcons (filename, Qnil)); + record_unwind_protect (close_file_unwind, make_number (ifd)); + #ifdef VMS /* Create the copy file with the same record format as the input file */ ofd = sys_creat (XSTRING (newname)->data, 0666, ifd); @@ -1396,18 +1405,16 @@ ofd = creat (XSTRING (newname)->data, 0666); #endif /* VMS */ if (ofd < 0) - { - close (ifd); - report_file_error ("Opening output file", Fcons (newname, Qnil)); - } + report_file_error ("Opening output file", Fcons (newname, Qnil)); + record_unwind_protect (close_file_unwind, make_number (ofd)); + + immediate_quit = 1; + QUIT; while ((n = read (ifd, buf, sizeof buf)) > 0) if (write (ofd, buf, n) != n) - { - close (ifd); - close (ofd); - report_file_error ("I/O error", Fcons (newname, Qnil)); - } + report_file_error ("I/O error", Fcons (newname, Qnil)); + immediate_quit = 0; if (fstat (ifd, &st) >= 0) { @@ -1424,6 +1431,9 @@ chmod (XSTRING (newname)->data, st.st_mode & 07777); } + /* Discard the unwind protects. */ + specpdl_ptr = specpdl + count; + close (ifd); if (close (ofd) < 0) report_file_error ("I/O error", Fcons (newname, Qnil)); @@ -1949,12 +1959,6 @@ return (mtime1 > st.st_mtime) ? Qt : Qnil; } -close_file_unwind (fd) - Lisp_Object fd; -{ - close (XFASTINT (fd)); -} - DEFUN ("insert-file-contents", Finsert_file_contents, Sinsert_file_contents, 1, 2, 0, "Insert contents of file FILENAME after point.\n\ @@ -2022,7 +2026,13 @@ while (1) { int try = min (st.st_size - inserted, 64 << 10); - int this = read (fd, &FETCH_CHAR (point + inserted - 1) + 1, try); + int this; + + /* Allow quitting out of the actual I/O. */ + immediate_quit = 1; + QUIT; + this = read (fd, &FETCH_CHAR (point + inserted - 1) + 1, try); + immediate_quit = 0; if (this <= 0) {