# HG changeset patch # User Richard M. Stallman # Date 859961568 0 # Node ID 4ee0f02eff871f0b221d5224af40dc7fbb102d34 # Parent b065ab2a2e2231e1eda3b40707ba3a1249d0d2e6 (Finsert_file_contents): Handle non-regular files. diff -r b065ab2a2e22 -r 4ee0f02eff87 src/fileio.c --- a/src/fileio.c Wed Apr 02 05:03:06 1997 +0000 +++ b/src/fileio.c Wed Apr 02 06:12:48 1997 +0000 @@ -3101,13 +3101,15 @@ least signal an error. */ if (!S_ISREG (st.st_mode)) { - if (NILP (visit)) + not_regular = 1; + + if (! NILP (visit)) + goto notfound; + + if (! NILP (replace) || ! NILP (beg) || ! NILP (end)) Fsignal (Qfile_error, Fcons (build_string ("not a regular file"), Fcons (filename, Qnil))); - - not_regular = 1; - goto notfound; } #endif @@ -3122,7 +3124,7 @@ record_unwind_protect (close_file_unwind, make_number (fd)); /* Supposedly happens on VMS. */ - if (st.st_size < 0) + if (! not_regular && st.st_size < 0) error ("File size is negative"); if (!NILP (beg) || !NILP (end)) @@ -3138,9 +3140,12 @@ CHECK_NUMBER (end, 0); else { - XSETINT (end, st.st_size); - if (XINT (end) != st.st_size) - error ("maximum buffer size exceeded"); + if (! not_regular) + { + XSETINT (end, st.st_size); + if (XINT (end) != st.st_size) + error ("Maximum buffer size exceeded"); + } } /* If requested, replace the accessible part of the buffer @@ -3472,16 +3477,20 @@ goto handled; } - total = XINT (end) - XINT (beg); - - { - register Lisp_Object temp; - - /* Make sure point-max won't overflow after this insertion. */ - XSETINT (temp, total); - if (total != XINT (temp)) - error ("maximum buffer size exceeded"); - } + if (! not_regular) + { + register Lisp_Object temp; + + total = XINT (end) - XINT (beg); + + /* Make sure point-max won't overflow after this insertion. */ + XSETINT (temp, total); + if (total != XINT (temp)) + error ("Maximum buffer size exceeded"); + } + else + /* For a special file, all we can do is guess. */ + total = READ_BUF_SIZE; if (NILP (visit) && total > 0) prepare_to_modify_buffer (PT, PT); @@ -3525,7 +3534,13 @@ break; } - how_much += this; + /* For a regular file, where TOTAL is the real size, + count HOW_MUCH to compare with it. + For a special file, where TOTAL is just a buffer size, + so don't bother counting in HOW_MUCH. + (INSERTED is where we count the number of characters inserted.) */ + if (! not_regular) + how_much += this; if (CODING_REQUIRE_CONVERSION (&coding)) { @@ -3536,8 +3551,21 @@ require = decoding_buffer_size (&coding, this); if (GAP_SIZE < require) make_gap (require - GAP_SIZE); - if (how_much >= total) /* This is the last block. */ - coding.last_block = 1; + + if (! not_regular) + { + if (how_much >= total) /* This is the last block. */ + coding.last_block = 1; + } + else + { + /* If we encounter EOF, say it is the last block. (The + data this will apply to is the UNPROCESSED characters + carried over from the last batch.) */ + if (this == 0) + coding.last_block = 1; + } + produced = decode_coding (&coding, read_buf, POS_ADDR (PT + inserted - 1) + 1, this, GAP_SIZE, &consumed);