# HG changeset patch # User Kenichi Handa # Date 890027467 0 # Node ID b4e925500a713791668210be27300a7ade193c01 # Parent d704dd953837e315504e86f28060986b357023c0 (ADJUST_CHAR_POS): New macro. (combine_bytes): Use the macro ADJUST_CHAR_POS. (adjust_after_replace): New arg REPLACE. If it is zero, give LEN as the arg LENGTH to offset_intervals. (del_range_2): Give correct args to count_combining_before and combine_bytes. Adjust the gap position after record_delete if necessary. Give character position to adjust_overlays_for_delete. diff -r d704dd953837 -r b4e925500a71 src/insdel.c --- a/src/insdel.c Mon Mar 16 05:51:07 1998 +0000 +++ b/src/insdel.c Mon Mar 16 05:51:07 1998 +0000 @@ -841,6 +841,24 @@ return pos_byte - opos_byte; } +/* Adjust the position TARGET/TARGET_BYTE for the combining of NBYTES + following the position POS/POS_BYTE to the character preceding POS. + If TARGET is after POS+NBYTES, we only have to adjust the character + position TARGET, else, if TARGET is after POS, we have to adjust + both the character position TARGET and the byte position + TARGET_BYTE, else we don't have to do any adjustment. */ + +#define ADJUST_CHAR_POS(target, target_byte) \ + do { \ + if (target > pos + nbytes) \ + target -= nbytes; \ + else if (target >= pos) \ + { \ + target = pos; \ + target_byte = pos_byte + nbytes; \ + } \ + } while (0) + /* Combine NBYTES stray trailing-codes, which were formerly separate characters, with the preceding character. These bytes are located after position POS / POS_BYTE, and the preceding character @@ -855,14 +873,10 @@ adjust_overlays_for_delete (pos, nbytes); - if (PT > pos) - BUF_PT (current_buffer) -= nbytes; - if (GPT > pos) - GPT -= nbytes; - if (Z > pos) - Z -= nbytes; - if (ZV > pos) - ZV -= nbytes; + ADJUST_CHAR_POS (BUF_PT (current_buffer), BUF_PT_BYTE (current_buffer)); + ADJUST_CHAR_POS (GPT, GPT_BYTE); + ADJUST_CHAR_POS (Z, Z_BYTE); + ADJUST_CHAR_POS (ZV, ZV_BYTE); if (BUF_INTERVALS (current_buffer) != 0) /* Only defined if Emacs is compiled with USE_TEXT_PROPERTIES. */ @@ -1311,8 +1325,8 @@ making the text a buffer contents. It exists just after GPT_ADDR. */ void -adjust_after_replace (from, from_byte, to, to_byte, len, len_byte) - int from, from_byte, to, to_byte, len, len_byte; +adjust_after_replace (from, from_byte, to, to_byte, len, len_byte, replace) + int from, from_byte, to, to_byte, len, len_byte, replace; { int combined_before_bytes = count_combining_before (GPT_ADDR, len_byte, from, from_byte); @@ -1344,7 +1358,11 @@ combined_before_bytes, combined_after_bytes, 0); #ifdef USE_TEXT_PROPERTIES if (BUF_INTERVALS (current_buffer) != 0) - offset_intervals (current_buffer, from, len - (to - from)); + /* REPLACE zero means that we have not yet adjusted the interval + tree for the text between FROM and TO, thus, we must treat the + new text as a newly inserted text, not as a replacement of + something. */ + offset_intervals (current_buffer, from, len - (replace ? to - from : 0)); #endif { @@ -1701,7 +1719,8 @@ gap_left (to, to_byte, 0); combined_after_bytes - = count_combining_before (GAP_END_ADDR, ZV_BYTE - GPT_BYTE, PT, PT_BYTE); + = count_combining_before (BUF_BYTE_ADDRESS (current_buffer, to_byte), + ZV_BYTE - to_byte, from, from_byte); /* Relocate all markers pointing into the new, larger gap to point at the end of the text before the gap. @@ -1711,6 +1730,11 @@ record_delete (from - !!combined_after_bytes, nchars_del + combined_after_bytes + !!combined_after_bytes); + if (combined_after_bytes) + /* COMBINED_AFTER_BYTES nonzero means that the above record_delete + moved the gap by calling Fbuffer_substring. We must move the + gap again to a proper place. */ + move_gap_both (from, from_byte); MODIFF++; /* Relocate point as if it were a marker. */ @@ -1723,7 +1747,7 @@ /* Adjust the overlay center as needed. This must be done after adjusting the markers that bound the overlays. */ - adjust_overlays_for_delete (from_byte, nchars_del); + adjust_overlays_for_delete (from, nchars_del); GAP_SIZE += nbytes_del; ZV_BYTE -= nbytes_del; @@ -1732,12 +1756,13 @@ Z -= nchars_del; GPT = from; GPT_BYTE = from_byte; - *(GPT_ADDR) = 0; /* Put an anchor. */ if (combined_after_bytes) move_gap_both (GPT + combined_after_bytes, GPT_BYTE + combined_after_bytes); + *(GPT_ADDR) = 0; /* Put an anchor. */ + if (GPT_BYTE < GPT) abort (); @@ -1747,7 +1772,7 @@ end_unchanged = Z - GPT; if (combined_after_bytes) - combine_bytes (PT, PT_BYTE, combined_after_bytes); + combine_bytes (from, from_byte, combined_after_bytes); if (combined_after_bytes) record_insert (GPT - 1, 1);