Mercurial > emacs
changeset 3787:04b741620a50
* fileio.c (Finsert_file_contents): Two new args, BEG and END.
author | Jim Blandy <jimb@redhat.com> |
---|---|
date | Thu, 17 Jun 1993 02:28:19 +0000 |
parents | 9f31f2f16644 |
children | 41a297faf4ac |
files | src/fileio.c |
diffstat | 1 files changed, 43 insertions(+), 13 deletions(-) [+] |
line wrap: on
line diff
--- a/src/fileio.c Thu Jun 17 00:50:19 1993 +0000 +++ b/src/fileio.c Thu Jun 17 02:28:19 1993 +0000 @@ -2339,15 +2339,18 @@ } DEFUN ("insert-file-contents", Finsert_file_contents, Sinsert_file_contents, - 1, 2, 0, + 1, 4, 0, "Insert contents of file FILENAME after point.\n\ -Returns list of absolute pathname and length of data inserted.\n\ +Returns list of absolute file name and length of data inserted.\n\ If second argument VISIT is non-nil, the buffer's visited filename\n\ and last save file modtime are set, and it is marked unmodified.\n\ If visiting and the file does not exist, visiting is completed\n\ -before the error is signaled.") - (filename, visit) - Lisp_Object filename, visit; +before the error is signaled.\n\n\ +The optional third and fourth arguments BEG and END\n\ +specify what portion of the file to insert.\n\ +If VISIT is non-nil, BEG and END must be nil.") + (filename, visit, beg, end) + Lisp_Object filename, visit, beg, end; { struct stat st; register int fd; @@ -2356,6 +2359,7 @@ int count = specpdl_ptr - specpdl; struct gcpro gcpro1; Lisp_Object handler, val; + int total; val = Qnil; @@ -2371,7 +2375,7 @@ handler = Ffind_file_name_handler (filename); if (!NILP (handler)) { - val = call3 (handler, Qinsert_file_contents, filename, visit); + val = call5 (handler, Qinsert_file_contents, filename, visit, beg, end); st.st_mtime = 0; goto handled; } @@ -2410,12 +2414,32 @@ if (st.st_size < 0) error ("File size is negative"); + if (!NILP (beg) || !NILP (end)) + if (!NILP (visit)) + error ("Attempt to visit less than an entire file"); + + if (!NILP (beg)) + CHECK_NUMBER (beg, 0); + else + XFASTINT (beg) = 0; + + if (!NILP (end)) + CHECK_NUMBER (end, 0); + else + { + XSETINT (end, st.st_size); + if (XINT (end) != st.st_size) + error ("maximum buffer size exceeded"); + } + + total = XINT (end) - XINT (beg); + { register Lisp_Object temp; /* Make sure point-max won't overflow after this insertion. */ - XSET (temp, Lisp_Int, st.st_size + Z); - if (st.st_size + Z != XINT (temp)) + XSET (temp, Lisp_Int, total); + if (total != XINT (temp)) error ("maximum buffer size exceeded"); } @@ -2423,12 +2447,18 @@ prepare_to_modify_buffer (point, point); move_gap (point); - if (GAP_SIZE < st.st_size) - make_gap (st.st_size - GAP_SIZE); - + if (GAP_SIZE < total) + make_gap (total - GAP_SIZE); + + if (XINT (beg) != 0) + { + if (lseek (fd, XINT (beg), 0) < 0) + report_file_error ("Setting file position", Fcons (filename, Qnil)); + } + while (1) { - int try = min (st.st_size - inserted, 64 << 10); + int try = min (total - inserted, 64 << 10); int this; /* Allow quitting out of the actual I/O. */ @@ -2503,7 +2533,7 @@ Fcons (make_number (inserted), Qnil))); } - + DEFUN ("write-region", Fwrite_region, Swrite_region, 3, 5, "r\nFWrite region to file: ", "Write current region into specified file.\n\