X-Git-Url: https://git.hcoop.net/bpt/emacs.git/blobdiff_plain/40d83b412f584cc02e68d4eac8fd5e6eb769e2fe..acaf905b1130aae80fa59d2c861ffd4c8eb75486:/src/insdel.c diff --git a/src/insdel.c b/src/insdel.c index 4bdcb4bc0b..34d82fa017 100644 --- a/src/insdel.c +++ b/src/insdel.c @@ -1,5 +1,5 @@ /* Buffer insertion/deletion and gap motion for GNU Emacs. - Copyright (C) 1985-1986, 1993-1995, 1997-2011 + Copyright (C) 1985-1986, 1993-1995, 1997-2012 Free Software Foundation, Inc. This file is part of GNU Emacs. @@ -20,6 +20,9 @@ along with GNU Emacs. If not, see . */ #include #include + +#include + #include "lisp.h" #include "intervals.h" #include "buffer.h" @@ -41,14 +44,8 @@ static void insert_from_buffer_1 (struct buffer *buf, int inherit); static void gap_left (EMACS_INT charpos, EMACS_INT bytepos, int newgap); static void gap_right (EMACS_INT charpos, EMACS_INT bytepos); -static void adjust_markers_for_insert (EMACS_INT from, EMACS_INT from_byte, - EMACS_INT to, EMACS_INT to_byte, - int before_markers); -static void adjust_markers_for_replace (EMACS_INT, EMACS_INT, EMACS_INT, - EMACS_INT, EMACS_INT, EMACS_INT); -static void adjust_point (EMACS_INT nchars, EMACS_INT nbytes); -Lisp_Object Fcombine_after_change_execute (void); +static Lisp_Object Fcombine_after_change_execute (void); /* List of elements of the form (BEG-UNCHANGED END-UNCHANGED CHANGE-AMOUNT) describing changes which happened while combine_after_change_calls @@ -60,12 +57,14 @@ Lisp_Object Fcombine_after_change_execute (void); END-UNCHANGED is the number of chars after the changed range, and CHANGE-AMOUNT is the number of characters inserted by the change (negative for a deletion). */ -Lisp_Object combine_after_change_list; +static Lisp_Object combine_after_change_list; /* Buffer which combine_after_change_list is about. */ -Lisp_Object combine_after_change_buffer; +static Lisp_Object combine_after_change_buffer; Lisp_Object Qinhibit_modification_hooks; + +static void signal_before_change (EMACS_INT, EMACS_INT, EMACS_INT *); #define CHECK_MARKERS() \ do \ @@ -330,7 +329,7 @@ adjust_markers_for_insert (EMACS_INT from, EMACS_INT from_byte, - disordered overlays in the slot `overlays_before' of current_buffer. */ if (adjusted) { - fix_start_end_in_overlays(from, to); + fix_start_end_in_overlays (from, to); fix_overlays_before (current_buffer, from, to); } } @@ -386,6 +385,12 @@ adjust_markers_for_replace (EMACS_INT from, EMACS_INT from_byte, } +void +buffer_overflow (void) +{ + error ("Maximum buffer size exceeded"); +} + /* Make the gap NBYTES_ADDED bytes longer. */ static void @@ -395,20 +400,16 @@ make_gap_larger (EMACS_INT nbytes_added) EMACS_INT real_gap_loc; EMACS_INT real_gap_loc_byte; EMACS_INT old_gap_size; + EMACS_INT current_size = Z_BYTE - BEG_BYTE + GAP_SIZE; + enum { enough_for_a_while = 2000 }; - /* If we have to get more space, get enough to last a while. */ - nbytes_added += 2000; + if (BUF_BYTES_MAX - current_size < nbytes_added) + buffer_overflow (); - { EMACS_INT total_size = Z_BYTE - BEG_BYTE + GAP_SIZE + nbytes_added; - if (total_size < 0 - /* Don't allow a buffer size that won't fit in a Lisp integer. */ - || total_size != XINT (make_number (total_size)) - /* Don't allow a buffer size that won't fit in an int - even if it will fit in a Lisp integer. - That won't work because so many places still use `int'. */ - || total_size != (EMACS_INT) (int) total_size) - error ("Buffer exceeds maximum size"); - } + /* If we have to get more space, get enough to last a while; + but do not exceed the maximum buffer size. */ + nbytes_added = min (nbytes_added + enough_for_a_while, + BUF_BYTES_MAX - current_size); enlarge_buffer_text (current_buffer, nbytes_added); @@ -440,6 +441,7 @@ make_gap_larger (EMACS_INT nbytes_added) Vinhibit_quit = tem; } +#if defined USE_MMAP_FOR_BUFFERS || defined REL_ALLOC || defined DOUG_LEA_MALLOC /* Make the gap NBYTES_REMOVED bytes shorter. */ @@ -499,6 +501,8 @@ make_gap_smaller (EMACS_INT nbytes_removed) Vinhibit_quit = tem; } +#endif /* USE_MMAP_FOR_BUFFERS || REL_ALLOC || DOUG_LEA_MALLOC */ + void make_gap (EMACS_INT nbytes_added) { @@ -566,32 +570,6 @@ copy_text (const unsigned char *from_addr, unsigned char *to_addr, return to_addr - initial_to_addr; } } - -/* Return the number of bytes it would take - to convert some single-byte text to multibyte. - The single-byte text consists of NBYTES bytes at PTR. */ - -EMACS_INT -count_size_as_multibyte (const unsigned char *ptr, EMACS_INT nbytes) -{ - EMACS_INT i; - EMACS_INT outgoing_nbytes = 0; - - for (i = 0; i < nbytes; i++) - { - unsigned int c = *ptr++; - - if (ASCII_CHAR_P (c)) - outgoing_nbytes++; - else - { - c = BYTE8_TO_CHAR (c); - outgoing_nbytes += CHAR_BYTES (c); - } - } - - return outgoing_nbytes; -} /* Insert a string of specified length before point. This function judges multibyteness based on @@ -1085,7 +1063,6 @@ static void insert_from_buffer_1 (struct buffer *buf, EMACS_INT from, EMACS_INT nchars, int inherit) { - register Lisp_Object temp; EMACS_INT chunk, chunk_expanded; EMACS_INT from_byte = buf_charpos_to_bytepos (buf, from); EMACS_INT to_byte = buf_charpos_to_bytepos (buf, from + nchars); @@ -1124,11 +1101,6 @@ insert_from_buffer_1 (struct buffer *buf, outgoing_nbytes = outgoing_before_gap + outgoing_after_gap; } - /* Make sure point-max won't overflow after this insertion. */ - XSETINT (temp, outgoing_nbytes + Z); - if (outgoing_nbytes + Z != XINT (temp)) - error ("Maximum buffer size exceeded"); - /* Do this before moving and increasing the gap, because the before-change hooks might move the gap or make it smaller. */ @@ -1222,7 +1194,7 @@ insert_from_buffer_1 (struct buffer *buf, PREV_TEXT nil means the new text was just inserted. */ -void +static void adjust_after_replace (EMACS_INT from, EMACS_INT from_byte, Lisp_Object prev_text, EMACS_INT len, EMACS_INT len_byte) { @@ -1285,58 +1257,6 @@ adjust_after_replace (EMACS_INT from, EMACS_INT from_byte, CHARS_MODIFF = MODIFF; } -/* Like adjust_after_replace, but doesn't require PREV_TEXT. - This is for use when undo is not enabled in the current buffer. */ - -void -adjust_after_replace_noundo (EMACS_INT from, EMACS_INT from_byte, - EMACS_INT nchars_del, EMACS_INT nbytes_del, - EMACS_INT len, EMACS_INT len_byte) -{ -#ifdef BYTE_COMBINING_DEBUG - if (count_combining_before (GPT_ADDR, len_byte, from, from_byte) - || count_combining_after (GPT_ADDR, len_byte, from, from_byte)) - abort (); -#endif - - /* Update various buffer positions for the new text. */ - GAP_SIZE -= len_byte; - ZV += len; Z+= len; - ZV_BYTE += len_byte; Z_BYTE += len_byte; - GPT += len; GPT_BYTE += len_byte; - if (GAP_SIZE > 0) *(GPT_ADDR) = 0; /* Put an anchor. */ - - if (nchars_del > 0) - adjust_markers_for_replace (from, from_byte, nchars_del, nbytes_del, - len, len_byte); - else - adjust_markers_for_insert (from, from_byte, - from + len, from_byte + len_byte, 0); - - if (len > nchars_del) - adjust_overlays_for_insert (from, len - nchars_del); - else if (len < nchars_del) - adjust_overlays_for_delete (from, nchars_del - len); - if (BUF_INTERVALS (current_buffer) != 0) - { - offset_intervals (current_buffer, from, len - nchars_del); - } - - if (from < PT) - adjust_point (len - nchars_del, len_byte - nbytes_del); - - /* As byte combining will decrease Z, we must check this again. */ - if (Z - GPT < END_UNCHANGED) - END_UNCHANGED = Z - GPT; - - CHECK_MARKERS (); - - if (len == 0) - evaporate_overlays (from); - MODIFF++; - CHARS_MODIFF = MODIFF; -} - /* Record undo information, adjust markers and position keepers for an insertion of a text from FROM (FROM_BYTE) to TO (TO_BYTE). The text already exists in the current buffer but character length (TO @@ -1377,7 +1297,6 @@ replace_range (EMACS_INT from, EMACS_INT to, Lisp_Object new, EMACS_INT insbytes = SBYTES (new); EMACS_INT from_byte, to_byte; EMACS_INT nbytes_del, nchars_del; - register Lisp_Object temp; struct gcpro gcpro1; INTERVAL intervals; EMACS_INT outgoing_insbytes = insbytes; @@ -1397,7 +1316,7 @@ replace_range (EMACS_INT from, EMACS_INT to, Lisp_Object new, UNGCPRO; - /* Make args be valid */ + /* Make args be valid. */ if (from < BEGV) from = BEGV; if (to > ZV) @@ -1421,11 +1340,6 @@ replace_range (EMACS_INT from, EMACS_INT to, Lisp_Object new, outgoing_insbytes = count_size_as_multibyte (SDATA (new), insbytes); - /* Make sure point-max won't overflow after this insertion. */ - XSETINT (temp, Z_BYTE - nbytes_del + insbytes); - if (Z_BYTE - nbytes_del + insbytes != XINT (temp)) - error ("Maximum buffer size exceeded"); - GCPRO1 (new); /* Make sure the gap is somewhere in or next to what we are deleting. */ @@ -1457,8 +1371,8 @@ replace_range (EMACS_INT from, EMACS_INT to, Lisp_Object new, if (Z - GPT < END_UNCHANGED) END_UNCHANGED = Z - GPT; - if (GAP_SIZE < insbytes) - make_gap (insbytes - GAP_SIZE); + if (GAP_SIZE < outgoing_insbytes) + make_gap (outgoing_insbytes - GAP_SIZE); /* Copy the string text into the buffer, perhaps converting between single-byte and multibyte. */ @@ -1556,7 +1470,6 @@ replace_range_2 (EMACS_INT from, EMACS_INT from_byte, int markers) { EMACS_INT nbytes_del, nchars_del; - Lisp_Object temp; CHECK_MARKERS (); @@ -1566,11 +1479,6 @@ replace_range_2 (EMACS_INT from, EMACS_INT from_byte, if (nbytes_del <= 0 && insbytes == 0) return; - /* Make sure point-max won't overflow after this insertion. */ - XSETINT (temp, Z_BYTE - nbytes_del + insbytes); - if (Z_BYTE - nbytes_del + insbytes != XINT (temp)) - error ("Maximum buffer size exceeded"); - /* Make sure the gap is somewhere in or next to what we are deleting. */ if (from > GPT) gap_right (from, from_byte); @@ -1698,7 +1606,7 @@ del_range_1 (EMACS_INT from, EMACS_INT to, int prepare, int ret_string) to_byte = CHAR_TO_BYTE (to); deletion = del_range_2 (from, from_byte, to, to_byte, ret_string); - GCPRO1(deletion); + GCPRO1 (deletion); signal_after_change (from, to - from, 0); update_compositions (from, from, CHECK_HEAD); UNGCPRO; @@ -2049,7 +1957,7 @@ reset_var_on_error (Lisp_Object val) If PRESERVE_PTR is nonzero, we relocate *PRESERVE_PTR by holding its value temporarily in a marker. */ -void +static void signal_before_change (EMACS_INT start_int, EMACS_INT end_int, EMACS_INT *preserve_ptr) { @@ -2311,8 +2219,7 @@ syms_of_insdel (void) This affects `before-change-functions' and `after-change-functions', as well as hooks attached to text properties and overlays. */); inhibit_modification_hooks = 0; - Qinhibit_modification_hooks = intern_c_string ("inhibit-modification-hooks"); - staticpro (&Qinhibit_modification_hooks); + DEFSYM (Qinhibit_modification_hooks, "inhibit-modification-hooks"); defsubr (&Scombine_after_change_execute); }