1
0
mirror of https://git.savannah.gnu.org/git/emacs.git synced 2025-01-08 15:35:02 +00:00

(replace_range_2): New function.

This commit is contained in:
Richard M. Stallman 2004-11-02 09:14:11 +00:00
parent 5d19ee8aa5
commit 085db7de2d

View File

@ -1464,7 +1464,7 @@ adjust_after_insert (from, from_byte, to, to_byte, newlen)
Z -= len; Z_BYTE -= len_byte;
adjust_after_replace (from, from_byte, Qnil, newlen, len_byte);
}
/* Replace the text from character positions FROM to TO with NEW,
If PREPARE is nonzero, call prepare_to_modify_buffer.
If INHERIT, the newly inserted text should inherit text properties
@ -1641,6 +1641,122 @@ replace_range (from, to, new, prepare, inherit, markers)
update_compositions (from, GPT, CHECK_BORDER);
}
/* Replace the text from character positions FROM to TO with
the text in INS of length INSCHARS.
Keep the text properties that applied to the old characters
(extending them to all the new chars if there are more new chars).
Note that this does not yet handle markers quite right.
If MARKERS is nonzero, relocate markers.
Unlike most functions at this level, never call
prepare_to_modify_buffer and never call signal_after_change. */
void
replace_range_2 (from, from_byte, to, to_byte, ins, inschars, insbytes, markers)
int from, from_byte, to, to_byte;
char *ins;
int inschars, insbytes, markers;
{
int nbytes_del, nchars_del;
Lisp_Object temp;
CHECK_MARKERS ();
nchars_del = to - from;
nbytes_del = to_byte - 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);
if (to < GPT)
gap_left (to, to_byte, 0);
GAP_SIZE += nbytes_del;
ZV -= nchars_del;
Z -= nchars_del;
ZV_BYTE -= nbytes_del;
Z_BYTE -= nbytes_del;
GPT = from;
GPT_BYTE = from_byte;
if (GAP_SIZE > 0) *(GPT_ADDR) = 0; /* Put an anchor. */
if (GPT_BYTE < GPT)
abort ();
if (GPT - BEG < BEG_UNCHANGED)
BEG_UNCHANGED = GPT - BEG;
if (Z - GPT < END_UNCHANGED)
END_UNCHANGED = Z - GPT;
if (GAP_SIZE < insbytes)
make_gap (insbytes - GAP_SIZE);
/* Copy the replacement text into the buffer. */
bcopy (ins, GPT_ADDR, insbytes);
#ifdef BYTE_COMBINING_DEBUG
/* We have copied text into the gap, but we have not marked
it as part of the buffer. So we can use the old FROM and FROM_BYTE
here, for both the previous text and the following text.
Meanwhile, GPT_ADDR does point to
the text that has been stored by copy_text. */
if (count_combining_before (GPT_ADDR, insbytes, from, from_byte)
|| count_combining_after (GPT_ADDR, insbytes, from, from_byte))
abort ();
#endif
GAP_SIZE -= insbytes;
GPT += inschars;
ZV += inschars;
Z += inschars;
GPT_BYTE += insbytes;
ZV_BYTE += insbytes;
Z_BYTE += insbytes;
if (GAP_SIZE > 0) *(GPT_ADDR) = 0; /* Put an anchor. */
if (GPT_BYTE < GPT)
abort ();
/* Adjust the overlay center as needed. This must be done after
adjusting the markers that bound the overlays. */
if (nchars_del != inschars)
{
adjust_overlays_for_insert (from, inschars);
adjust_overlays_for_delete (from + inschars, nchars_del);
}
/* Adjust markers for the deletion and the insertion. */
if (markers
&& ! (nchars_del == 1 && inschars == 1))
adjust_markers_for_replace (from, from_byte, nchars_del, nbytes_del,
inschars, insbytes);
offset_intervals (current_buffer, from, inschars - nchars_del);
/* Relocate point as if it were a marker. */
if (from < PT && nchars_del != inschars)
adjust_point ((from + inschars - (PT < to ? PT : to)),
(from_byte + insbytes
- (PT_BYTE < to_byte ? PT_BYTE : to_byte)));
if (insbytes == 0)
evaporate_overlays (from);
CHECK_MARKERS ();
MODIFF++;
}
/* Delete characters in current buffer
from FROM up to (but not including) TO.
If TO comes before FROM, we delete nothing. */