X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/40ef059ee2a2cd7b4e3e75eef58c8ddcd2abb15f..f0ecbca80a004824d74ca9bc8b77cc94b2489b34:/src/insdel.c diff --git a/src/insdel.c b/src/insdel.c index ad3460f9a6..0a9777ad95 100644 --- a/src/insdel.c +++ b/src/insdel.c @@ -20,6 +20,9 @@ along with GNU Emacs. If not, see . */ #include #include + +#include + #include "lisp.h" #include "intervals.h" #include "buffer.h" @@ -33,24 +36,16 @@ along with GNU Emacs. If not, see . */ #endif static void insert_from_string_1 (Lisp_Object string, - EMACS_INT pos, EMACS_INT pos_byte, - EMACS_INT nchars, EMACS_INT nbytes, + ptrdiff_t pos, ptrdiff_t pos_byte, + ptrdiff_t nchars, ptrdiff_t nbytes, int inherit, int before_markers); static void insert_from_buffer_1 (struct buffer *buf, - EMACS_INT from, EMACS_INT nchars, + ptrdiff_t from, ptrdiff_t nchars, 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_gap_motion (EMACS_INT from, EMACS_INT to, - EMACS_INT amount); -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 void gap_left (ptrdiff_t charpos, ptrdiff_t bytepos, int newgap); +static void gap_right (ptrdiff_t charpos, ptrdiff_t bytepos); + +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 @@ -62,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 (ptrdiff_t, ptrdiff_t, ptrdiff_t *); #define CHECK_MARKERS() \ do \ @@ -100,7 +97,7 @@ check_markers (void) Note that this can quit! */ void -move_gap (EMACS_INT charpos) +move_gap (ptrdiff_t charpos) { move_gap_both (charpos, charpos_to_bytepos (charpos)); } @@ -109,7 +106,7 @@ move_gap (EMACS_INT charpos) Note that this can quit! */ void -move_gap_both (EMACS_INT charpos, EMACS_INT bytepos) +move_gap_both (ptrdiff_t charpos, ptrdiff_t bytepos) { if (bytepos < GPT_BYTE) gap_left (charpos, bytepos, 0); @@ -123,11 +120,11 @@ move_gap_both (EMACS_INT charpos, EMACS_INT bytepos) If NEWGAP is nonzero, then don't update beg_unchanged and end_unchanged. */ static void -gap_left (EMACS_INT charpos, EMACS_INT bytepos, int newgap) +gap_left (ptrdiff_t charpos, ptrdiff_t bytepos, int newgap) { register unsigned char *to, *from; - register EMACS_INT i; - EMACS_INT new_s1; + register ptrdiff_t i; + ptrdiff_t new_s1; if (!newgap) BUF_COMPUTE_UNCHANGED (current_buffer, charpos, GPT); @@ -162,10 +159,9 @@ gap_left (EMACS_INT charpos, EMACS_INT bytepos, int newgap) memmove (to, from, i); } - /* Adjust markers, and buffer data structure, to put the gap at BYTEPOS. - BYTEPOS is where the loop above stopped, which may be what was specified - or may be where a quit was detected. */ - adjust_markers_gap_motion (bytepos, GPT_BYTE, GAP_SIZE); + /* Adjust buffer data structure, to put the gap at BYTEPOS. + BYTEPOS is where the loop above stopped, which may be what + was specified or may be where a quit was detected. */ GPT_BYTE = bytepos; GPT = charpos; if (bytepos < charpos) @@ -179,11 +175,11 @@ gap_left (EMACS_INT charpos, EMACS_INT bytepos, int newgap) and CHARPOS is the corresponding char position. */ static void -gap_right (EMACS_INT charpos, EMACS_INT bytepos) +gap_right (ptrdiff_t charpos, ptrdiff_t bytepos) { register unsigned char *to, *from; - register EMACS_INT i; - EMACS_INT new_s1; + register ptrdiff_t i; + ptrdiff_t new_s1; BUF_COMPUTE_UNCHANGED (current_buffer, charpos, GPT); @@ -217,8 +213,6 @@ gap_right (EMACS_INT charpos, EMACS_INT bytepos) from += i, to += i; } - adjust_markers_gap_motion (GPT_BYTE + GAP_SIZE, bytepos + GAP_SIZE, - - GAP_SIZE); GPT = charpos; GPT_BYTE = bytepos; if (bytepos < charpos) @@ -227,67 +221,6 @@ gap_right (EMACS_INT charpos, EMACS_INT bytepos) QUIT; } -/* Add AMOUNT to the byte position of every marker in the current buffer - whose current byte position is between FROM (exclusive) and TO (inclusive). - - Also, any markers past the outside of that interval, in the direction - of adjustment, are first moved back to the near end of the interval - and then adjusted by AMOUNT. - - When the latter adjustment is done, if AMOUNT is negative, - we record the adjustment for undo. (This case happens only for - deletion.) - - The markers' character positions are not altered, - because gap motion does not affect character positions. */ - -int adjust_markers_test; - -static void -adjust_markers_gap_motion (EMACS_INT from, EMACS_INT to, EMACS_INT amount) -{ - /* Now that a marker has a bytepos, not counting the gap, - nothing needs to be done here. */ -#if 0 - Lisp_Object marker; - register struct Lisp_Marker *m; - register EMACS_INT mpos; - - marker = BUF_MARKERS (current_buffer); - - while (!NILP (marker)) - { - m = XMARKER (marker); - mpos = m->bytepos; - if (amount > 0) - { - if (mpos > to && mpos < to + amount) - { - if (adjust_markers_test) - abort (); - mpos = to + amount; - } - } - else - { - /* Here's the case where a marker is inside text being deleted. - AMOUNT can be negative for gap motion, too, - but then this range contains no markers. */ - if (mpos > from + amount && mpos <= from) - { - if (adjust_markers_test) - abort (); - mpos = from + amount; - } - } - if (mpos > from && mpos <= to) - mpos += amount; - m->bufpos = mpos; - marker = m->chain; - } -#endif -} - /* Adjust all markers for a deletion whose range in bytes is FROM_BYTE to TO_BYTE. The range in charpos is FROM to TO. @@ -296,12 +229,12 @@ adjust_markers_gap_motion (EMACS_INT from, EMACS_INT to, EMACS_INT amount) or inside of the range being deleted. */ void -adjust_markers_for_delete (EMACS_INT from, EMACS_INT from_byte, - EMACS_INT to, EMACS_INT to_byte) +adjust_markers_for_delete (ptrdiff_t from, ptrdiff_t from_byte, + ptrdiff_t to, ptrdiff_t to_byte) { Lisp_Object marker; register struct Lisp_Marker *m; - register EMACS_INT charpos; + register ptrdiff_t charpos; for (m = BUF_MARKERS (current_buffer); m; m = m->next) { @@ -361,13 +294,13 @@ adjust_markers_for_delete (EMACS_INT from, EMACS_INT from_byte, or BEFORE_MARKERS is true. */ static void -adjust_markers_for_insert (EMACS_INT from, EMACS_INT from_byte, - EMACS_INT to, EMACS_INT to_byte, int before_markers) +adjust_markers_for_insert (ptrdiff_t from, ptrdiff_t from_byte, + ptrdiff_t to, ptrdiff_t to_byte, int before_markers) { struct Lisp_Marker *m; int adjusted = 0; - EMACS_INT nchars = to - from; - EMACS_INT nbytes = to_byte - from_byte; + ptrdiff_t nchars = to - from; + ptrdiff_t nbytes = to_byte - from_byte; for (m = BUF_MARKERS (current_buffer); m; m = m->next) { @@ -396,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); } } @@ -412,7 +345,7 @@ adjust_markers_for_insert (EMACS_INT from, EMACS_INT from_byte, intervals. */ static void -adjust_point (EMACS_INT nchars, EMACS_INT nbytes) +adjust_point (ptrdiff_t nchars, ptrdiff_t nbytes) { SET_BUF_PT_BOTH (current_buffer, PT + nchars, PT_BYTE + nbytes); /* In a single-byte buffer, the two positions must be equal. */ @@ -425,14 +358,14 @@ adjust_point (EMACS_INT nchars, EMACS_INT nbytes) an insertion. */ static void -adjust_markers_for_replace (EMACS_INT from, EMACS_INT from_byte, - EMACS_INT old_chars, EMACS_INT old_bytes, - EMACS_INT new_chars, EMACS_INT new_bytes) +adjust_markers_for_replace (ptrdiff_t from, ptrdiff_t from_byte, + ptrdiff_t old_chars, ptrdiff_t old_bytes, + ptrdiff_t new_chars, ptrdiff_t new_bytes) { register struct Lisp_Marker *m; - EMACS_INT prev_to_byte = from_byte + old_bytes; - EMACS_INT diff_chars = new_chars - old_chars; - EMACS_INT diff_bytes = new_bytes - old_bytes; + ptrdiff_t prev_to_byte = from_byte + old_bytes; + ptrdiff_t diff_chars = new_chars - old_chars; + ptrdiff_t diff_bytes = new_bytes - old_bytes; for (m = BUF_MARKERS (current_buffer); m; m = m->next) { @@ -452,29 +385,31 @@ 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 -make_gap_larger (EMACS_INT nbytes_added) +make_gap_larger (ptrdiff_t nbytes_added) { Lisp_Object tem; - EMACS_INT real_gap_loc; - EMACS_INT real_gap_loc_byte; - EMACS_INT old_gap_size; - - /* If we have to get more space, get enough to last a while. */ - nbytes_added += 2000; - - { 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"); - } + ptrdiff_t real_gap_loc; + ptrdiff_t real_gap_loc_byte; + ptrdiff_t old_gap_size; + ptrdiff_t current_size = Z_BYTE - BEG_BYTE + GAP_SIZE; + enum { enough_for_a_while = 2000 }; + + if (BUF_BYTES_MAX - current_size < nbytes_added) + buffer_overflow (); + + /* 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); @@ -506,19 +441,20 @@ 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. */ static void -make_gap_smaller (EMACS_INT nbytes_removed) +make_gap_smaller (ptrdiff_t nbytes_removed) { Lisp_Object tem; - EMACS_INT real_gap_loc; - EMACS_INT real_gap_loc_byte; - EMACS_INT real_Z; - EMACS_INT real_Z_byte; - EMACS_INT real_beg_unchanged; - EMACS_INT new_gap_size; + ptrdiff_t real_gap_loc; + ptrdiff_t real_gap_loc_byte; + ptrdiff_t real_Z; + ptrdiff_t real_Z_byte; + ptrdiff_t real_beg_unchanged; + ptrdiff_t new_gap_size; /* Make sure the gap is at least 20 bytes. */ if (GAP_SIZE - nbytes_removed < 20) @@ -565,8 +501,10 @@ 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) +make_gap (ptrdiff_t nbytes_added) { if (nbytes_added >= 0) make_gap_larger (nbytes_added); @@ -583,9 +521,9 @@ make_gap (EMACS_INT nbytes_added) Return the number of bytes stored at TO_ADDR. */ -EMACS_INT +ptrdiff_t copy_text (const unsigned char *from_addr, unsigned char *to_addr, - EMACS_INT nbytes, int from_multibyte, int to_multibyte) + ptrdiff_t nbytes, int from_multibyte, int to_multibyte) { if (from_multibyte == to_multibyte) { @@ -594,8 +532,8 @@ copy_text (const unsigned char *from_addr, unsigned char *to_addr, } else if (from_multibyte) { - EMACS_INT nchars = 0; - EMACS_INT bytes_left = nbytes; + ptrdiff_t nchars = 0; + ptrdiff_t bytes_left = nbytes; while (bytes_left > 0) { @@ -632,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 @@ -668,11 +580,11 @@ count_size_as_multibyte (const unsigned char *ptr, EMACS_INT nbytes) prepare_to_modify_buffer could relocate the text. */ void -insert (const char *string, EMACS_INT nbytes) +insert (const char *string, ptrdiff_t nbytes) { if (nbytes > 0) { - EMACS_INT len = chars_in_text ((unsigned char *) string, nbytes), opoint; + ptrdiff_t len = chars_in_text ((unsigned char *) string, nbytes), opoint; insert_1_both (string, len, nbytes, 0, 1, 0); opoint = PT - len; signal_after_change (opoint, 0, len); @@ -683,11 +595,11 @@ insert (const char *string, EMACS_INT nbytes) /* Likewise, but inherit text properties from neighboring characters. */ void -insert_and_inherit (const char *string, EMACS_INT nbytes) +insert_and_inherit (const char *string, ptrdiff_t nbytes) { if (nbytes > 0) { - EMACS_INT len = chars_in_text ((unsigned char *) string, nbytes), opoint; + ptrdiff_t len = chars_in_text ((unsigned char *) string, nbytes), opoint; insert_1_both (string, len, nbytes, 1, 1, 0); opoint = PT - len; signal_after_change (opoint, 0, len); @@ -728,11 +640,11 @@ insert_string (const char *s) since gc could happen and relocate it. */ void -insert_before_markers (const char *string, EMACS_INT nbytes) +insert_before_markers (const char *string, ptrdiff_t nbytes) { if (nbytes > 0) { - EMACS_INT len = chars_in_text ((unsigned char *) string, nbytes), opoint; + ptrdiff_t len = chars_in_text ((unsigned char *) string, nbytes), opoint; insert_1_both (string, len, nbytes, 0, 1, 1); opoint = PT - len; signal_after_change (opoint, 0, len); @@ -744,11 +656,11 @@ insert_before_markers (const char *string, EMACS_INT nbytes) void insert_before_markers_and_inherit (const char *string, - EMACS_INT nbytes) + ptrdiff_t nbytes) { if (nbytes > 0) { - EMACS_INT len = chars_in_text ((unsigned char *) string, nbytes), opoint; + ptrdiff_t len = chars_in_text ((unsigned char *) string, nbytes), opoint; insert_1_both (string, len, nbytes, 1, 1, 1); opoint = PT - len; signal_after_change (opoint, 0, len); @@ -759,7 +671,7 @@ insert_before_markers_and_inherit (const char *string, /* Subroutine used by the insert functions above. */ void -insert_1 (const char *string, EMACS_INT nbytes, +insert_1 (const char *string, ptrdiff_t nbytes, int inherit, int prepare, int before_markers) { insert_1_both (string, chars_in_text ((unsigned char *) string, nbytes), @@ -775,8 +687,8 @@ insert_1 (const char *string, EMACS_INT nbytes, which combine in this way. Otherwise, return 0. */ int -count_combining_before (const unsigned char *string, EMACS_INT length, - EMACS_INT pos, EMACS_INT pos_byte) +count_combining_before (const unsigned char *string, ptrdiff_t length, + ptrdiff_t pos, ptrdiff_t pos_byte) { int len, combining_bytes; const unsigned char *p; @@ -821,11 +733,11 @@ count_combining_before (const unsigned char *string, EMACS_INT length, int count_combining_after (const unsigned char *string, - EMACS_INT length, EMACS_INT pos, EMACS_INT pos_byte) + ptrdiff_t length, ptrdiff_t pos, ptrdiff_t pos_byte) { - EMACS_INT opos_byte = pos_byte; - EMACS_INT i; - EMACS_INT bytes; + ptrdiff_t opos_byte = pos_byte; + ptrdiff_t i; + ptrdiff_t bytes; unsigned char *bufp; if (NILP (current_buffer->enable_multibyte_characters)) @@ -885,7 +797,7 @@ count_combining_after (const unsigned char *string, void insert_1_both (const char *string, - EMACS_INT nchars, EMACS_INT nbytes, + ptrdiff_t nchars, ptrdiff_t nbytes, int inherit, int prepare, int before_markers) { if (nchars == 0) @@ -963,10 +875,10 @@ insert_1_both (const char *string, without insert noticing. */ void -insert_from_string (Lisp_Object string, EMACS_INT pos, EMACS_INT pos_byte, - EMACS_INT length, EMACS_INT length_byte, int inherit) +insert_from_string (Lisp_Object string, ptrdiff_t pos, ptrdiff_t pos_byte, + ptrdiff_t length, ptrdiff_t length_byte, int inherit) { - EMACS_INT opoint = PT; + ptrdiff_t opoint = PT; if (SCHARS (string) == 0) return; @@ -982,11 +894,11 @@ insert_from_string (Lisp_Object string, EMACS_INT pos, EMACS_INT pos_byte, void insert_from_string_before_markers (Lisp_Object string, - EMACS_INT pos, EMACS_INT pos_byte, - EMACS_INT length, EMACS_INT length_byte, + ptrdiff_t pos, ptrdiff_t pos_byte, + ptrdiff_t length, ptrdiff_t length_byte, int inherit) { - EMACS_INT opoint = PT; + ptrdiff_t opoint = PT; if (SCHARS (string) == 0) return; @@ -1000,12 +912,12 @@ insert_from_string_before_markers (Lisp_Object string, /* Subroutine of the insertion functions above. */ static void -insert_from_string_1 (Lisp_Object string, EMACS_INT pos, EMACS_INT pos_byte, - EMACS_INT nchars, EMACS_INT nbytes, +insert_from_string_1 (Lisp_Object string, ptrdiff_t pos, ptrdiff_t pos_byte, + ptrdiff_t nchars, ptrdiff_t nbytes, int inherit, int before_markers) { struct gcpro gcpro1; - EMACS_INT outgoing_nbytes = nbytes; + ptrdiff_t outgoing_nbytes = nbytes; INTERVAL intervals; /* Make OUTGOING_NBYTES describe the text @@ -1092,7 +1004,7 @@ insert_from_string_1 (Lisp_Object string, EMACS_INT pos, EMACS_INT pos_byte, starting at GPT_ADDR. */ void -insert_from_gap (EMACS_INT nchars, EMACS_INT nbytes) +insert_from_gap (ptrdiff_t nchars, ptrdiff_t nbytes) { if (NILP (BVAR (current_buffer, enable_multibyte_characters))) nchars = nbytes; @@ -1138,9 +1050,9 @@ insert_from_gap (EMACS_INT nchars, EMACS_INT nbytes) void insert_from_buffer (struct buffer *buf, - EMACS_INT charpos, EMACS_INT nchars, int inherit) + ptrdiff_t charpos, ptrdiff_t nchars, int inherit) { - EMACS_INT opoint = PT; + ptrdiff_t opoint = PT; insert_from_buffer_1 (buf, charpos, nchars, inherit); signal_after_change (opoint, 0, PT - opoint); @@ -1149,14 +1061,13 @@ insert_from_buffer (struct buffer *buf, static void insert_from_buffer_1 (struct buffer *buf, - EMACS_INT from, EMACS_INT nchars, int inherit) + ptrdiff_t from, ptrdiff_t 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); - EMACS_INT incoming_nbytes = to_byte - from_byte; - EMACS_INT outgoing_nbytes = incoming_nbytes; + ptrdiff_t chunk, chunk_expanded; + ptrdiff_t from_byte = buf_charpos_to_bytepos (buf, from); + ptrdiff_t to_byte = buf_charpos_to_bytepos (buf, from + nchars); + ptrdiff_t incoming_nbytes = to_byte - from_byte; + ptrdiff_t outgoing_nbytes = incoming_nbytes; INTERVAL intervals; /* Make OUTGOING_NBYTES describe the text @@ -1166,8 +1077,8 @@ insert_from_buffer_1 (struct buffer *buf, outgoing_nbytes = nchars; else if (NILP (BVAR (buf, enable_multibyte_characters))) { - EMACS_INT outgoing_before_gap = 0; - EMACS_INT outgoing_after_gap = 0; + ptrdiff_t outgoing_before_gap = 0; + ptrdiff_t outgoing_after_gap = 0; if (from < BUF_GPT (buf)) { @@ -1190,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. */ @@ -1288,11 +1194,11 @@ insert_from_buffer_1 (struct buffer *buf, PREV_TEXT nil means the new text was just inserted. */ -void -adjust_after_replace (EMACS_INT from, EMACS_INT from_byte, - Lisp_Object prev_text, EMACS_INT len, EMACS_INT len_byte) +static void +adjust_after_replace (ptrdiff_t from, ptrdiff_t from_byte, + Lisp_Object prev_text, ptrdiff_t len, ptrdiff_t len_byte) { - EMACS_INT nchars_del = 0, nbytes_del = 0; + ptrdiff_t nchars_del = 0, nbytes_del = 0; #ifdef BYTE_COMBINING_DEBUG if (count_combining_before (GPT_ADDR, len_byte, from, from_byte) @@ -1351,68 +1257,16 @@ 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 - FROM) may be incorrect, the correct length is NEWLEN. */ void -adjust_after_insert (EMACS_INT from, EMACS_INT from_byte, - EMACS_INT to, EMACS_INT to_byte, EMACS_INT newlen) +adjust_after_insert (ptrdiff_t from, ptrdiff_t from_byte, + ptrdiff_t to, ptrdiff_t to_byte, ptrdiff_t newlen) { - EMACS_INT len = to - from, len_byte = to_byte - from_byte; + ptrdiff_t len = to - from, len_byte = to_byte - from_byte; if (GPT != to) move_gap_both (to, to_byte); @@ -1436,17 +1290,16 @@ adjust_after_insert (EMACS_INT from, EMACS_INT from_byte, But if MARKERS is 0, don't relocate markers. */ void -replace_range (EMACS_INT from, EMACS_INT to, Lisp_Object new, +replace_range (ptrdiff_t from, ptrdiff_t to, Lisp_Object new, int prepare, int inherit, int markers) { - EMACS_INT inschars = SCHARS (new); - EMACS_INT insbytes = SBYTES (new); - EMACS_INT from_byte, to_byte; - EMACS_INT nbytes_del, nchars_del; - register Lisp_Object temp; + ptrdiff_t inschars = SCHARS (new); + ptrdiff_t insbytes = SBYTES (new); + ptrdiff_t from_byte, to_byte; + ptrdiff_t nbytes_del, nchars_del; struct gcpro gcpro1; INTERVAL intervals; - EMACS_INT outgoing_insbytes = insbytes; + ptrdiff_t outgoing_insbytes = insbytes; Lisp_Object deletion; CHECK_MARKERS (); @@ -1456,7 +1309,7 @@ replace_range (EMACS_INT from, EMACS_INT to, Lisp_Object new, if (prepare) { - EMACS_INT range_length = to - from; + ptrdiff_t range_length = to - from; prepare_to_modify_buffer (from, to, &from); to = from + range_length; } @@ -1487,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. */ @@ -1523,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. */ @@ -1616,13 +1464,12 @@ replace_range (EMACS_INT from, EMACS_INT to, Lisp_Object new, prepare_to_modify_buffer and never call signal_after_change. */ void -replace_range_2 (EMACS_INT from, EMACS_INT from_byte, - EMACS_INT to, EMACS_INT to_byte, - const char *ins, EMACS_INT inschars, EMACS_INT insbytes, +replace_range_2 (ptrdiff_t from, ptrdiff_t from_byte, + ptrdiff_t to, ptrdiff_t to_byte, + const char *ins, ptrdiff_t inschars, ptrdiff_t insbytes, int markers) { - EMACS_INT nbytes_del, nchars_del; - Lisp_Object temp; + ptrdiff_t nbytes_del, nchars_del; CHECK_MARKERS (); @@ -1632,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); @@ -1729,7 +1571,7 @@ replace_range_2 (EMACS_INT from, EMACS_INT from_byte, If TO comes before FROM, we delete nothing. */ void -del_range (EMACS_INT from, EMACS_INT to) +del_range (ptrdiff_t from, ptrdiff_t to) { del_range_1 (from, to, 1, 0); } @@ -1738,9 +1580,9 @@ del_range (EMACS_INT from, EMACS_INT to) RET_STRING says to return the deleted text. */ Lisp_Object -del_range_1 (EMACS_INT from, EMACS_INT to, int prepare, int ret_string) +del_range_1 (ptrdiff_t from, ptrdiff_t to, int prepare, int ret_string) { - EMACS_INT from_byte, to_byte; + ptrdiff_t from_byte, to_byte; Lisp_Object deletion; struct gcpro gcpro1; @@ -1755,7 +1597,7 @@ del_range_1 (EMACS_INT from, EMACS_INT to, int prepare, int ret_string) if (prepare) { - EMACS_INT range_length = to - from; + ptrdiff_t range_length = to - from; prepare_to_modify_buffer (from, to, &from); to = min (ZV, from + range_length); } @@ -1764,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; @@ -1774,9 +1616,9 @@ del_range_1 (EMACS_INT from, EMACS_INT to, int prepare, int ret_string) /* Like del_range_1 but args are byte positions, not char positions. */ void -del_range_byte (EMACS_INT from_byte, EMACS_INT to_byte, int prepare) +del_range_byte (ptrdiff_t from_byte, ptrdiff_t to_byte, int prepare) { - EMACS_INT from, to; + ptrdiff_t from, to; /* Make args be valid */ if (from_byte < BEGV_BYTE) @@ -1792,8 +1634,8 @@ del_range_byte (EMACS_INT from_byte, EMACS_INT to_byte, int prepare) if (prepare) { - EMACS_INT old_from = from, old_to = Z - to; - EMACS_INT range_length = to - from; + ptrdiff_t old_from = from, old_to = Z - to; + ptrdiff_t range_length = to - from; prepare_to_modify_buffer (from, to, &from); to = from + range_length; @@ -1817,8 +1659,8 @@ del_range_byte (EMACS_INT from_byte, EMACS_INT to_byte, int prepare) and bytepos. */ void -del_range_both (EMACS_INT from, EMACS_INT from_byte, - EMACS_INT to, EMACS_INT to_byte, int prepare) +del_range_both (ptrdiff_t from, ptrdiff_t from_byte, + ptrdiff_t to, ptrdiff_t to_byte, int prepare) { /* Make args be valid */ if (from_byte < BEGV_BYTE) @@ -1836,8 +1678,8 @@ del_range_both (EMACS_INT from, EMACS_INT from_byte, if (prepare) { - EMACS_INT old_from = from, old_to = Z - to; - EMACS_INT range_length = to - from; + ptrdiff_t old_from = from, old_to = Z - to; + ptrdiff_t range_length = to - from; prepare_to_modify_buffer (from, to, &from); to = from + range_length; @@ -1863,10 +1705,10 @@ del_range_both (EMACS_INT from, EMACS_INT from_byte, If RET_STRING is true, the deleted area is returned as a string. */ Lisp_Object -del_range_2 (EMACS_INT from, EMACS_INT from_byte, - EMACS_INT to, EMACS_INT to_byte, int ret_string) +del_range_2 (ptrdiff_t from, ptrdiff_t from_byte, + ptrdiff_t to, ptrdiff_t to_byte, int ret_string) { - register EMACS_INT nbytes_del, nchars_del; + register ptrdiff_t nbytes_del, nchars_del; Lisp_Object deletion; CHECK_MARKERS (); @@ -1950,7 +1792,7 @@ del_range_2 (EMACS_INT from, EMACS_INT from_byte, Otherwise set CHARS_MODIFF to the new value of MODIFF. */ void -modify_region (struct buffer *buffer, EMACS_INT start, EMACS_INT end, +modify_region (struct buffer *buffer, ptrdiff_t start, ptrdiff_t end, int preserve_chars_modiff) { struct buffer *old_buffer = current_buffer; @@ -1985,8 +1827,8 @@ modify_region (struct buffer *buffer, EMACS_INT start, EMACS_INT end, by holding its value temporarily in a marker. */ void -prepare_to_modify_buffer (EMACS_INT start, EMACS_INT end, - EMACS_INT *preserve_ptr) +prepare_to_modify_buffer (ptrdiff_t start, ptrdiff_t end, + ptrdiff_t *preserve_ptr) { struct buffer *base_buffer; @@ -2047,8 +1889,8 @@ prepare_to_modify_buffer (EMACS_INT start, EMACS_INT end, : (!NILP (Vselect_active_regions) && !NILP (Vtransient_mark_mode)))) { - EMACS_INT b = XMARKER (BVAR (current_buffer, mark))->charpos; - EMACS_INT e = PT; + ptrdiff_t b = XMARKER (BVAR (current_buffer, mark))->charpos; + ptrdiff_t e = PT; if (b < e) Vsaved_region_selection = make_buffer_string (b, e, 0); else if (b > e) @@ -2115,15 +1957,15 @@ 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 -signal_before_change (EMACS_INT start_int, EMACS_INT end_int, - EMACS_INT *preserve_ptr) +static void +signal_before_change (ptrdiff_t start_int, ptrdiff_t end_int, + ptrdiff_t *preserve_ptr) { Lisp_Object start, end; Lisp_Object start_marker, end_marker; Lisp_Object preserve_marker; struct gcpro gcpro1, gcpro2, gcpro3; - int count = SPECPDL_INDEX (); + ptrdiff_t count = SPECPDL_INDEX (); if (inhibit_modification_hooks) return; @@ -2137,14 +1979,14 @@ signal_before_change (EMACS_INT start_int, EMACS_INT end_int, specbind (Qinhibit_modification_hooks, Qt); - /* If buffer is unmodified, run a special hook for that case. */ + /* If buffer is unmodified, run a special hook for that case. The + check for Vfirst_change_hook is just a minor optimization. */ if (SAVE_MODIFF >= MODIFF - && !NILP (Vfirst_change_hook) - && !NILP (Vrun_hooks)) + && !NILP (Vfirst_change_hook)) { PRESERVE_VALUE; PRESERVE_START_END; - call1 (Vrun_hooks, Qfirst_change_hook); + Frun_hooks (1, &Qfirst_change_hook); } /* Now run the before-change-functions if any. */ @@ -2194,9 +2036,9 @@ signal_before_change (EMACS_INT start_int, EMACS_INT end_int, after the change. */ void -signal_after_change (EMACS_INT charpos, EMACS_INT lendel, EMACS_INT lenins) +signal_after_change (ptrdiff_t charpos, ptrdiff_t lendel, ptrdiff_t lenins) { - int count = SPECPDL_INDEX (); + ptrdiff_t count = SPECPDL_INDEX (); if (inhibit_modification_hooks) return; @@ -2277,9 +2119,9 @@ DEFUN ("combine-after-change-execute", Fcombine_after_change_execute, doc: /* This function is for use internally in `combine-after-change-calls'. */) (void) { - int count = SPECPDL_INDEX (); - EMACS_INT beg, end, change; - EMACS_INT begpos, endpos; + ptrdiff_t count = SPECPDL_INDEX (); + ptrdiff_t beg, end, change; + ptrdiff_t begpos, endpos; Lisp_Object tail; if (NILP (combine_after_change_list)) @@ -2313,7 +2155,7 @@ DEFUN ("combine-after-change-execute", Fcombine_after_change_execute, tail = XCDR (tail)) { Lisp_Object elt; - EMACS_INT thisbeg, thisend, thischange; + ptrdiff_t thisbeg, thisend, thischange; /* Extract the info from the next element. */ elt = XCAR (tail); @@ -2377,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); }