diff options
| author | Jens Schmidt | 2025-12-17 22:06:12 +0100 |
|---|---|---|
| committer | Stefan Monnier | 2025-12-20 13:23:21 -0500 |
| commit | 875e42d501df262fcd9903528657997d025e5c68 (patch) | |
| tree | cc3926ffeba03ecf13afe514092826f2a7b1038a /src | |
| parent | e93a9a905799b2e1e371fe6292a003e6f5480e95 (diff) | |
| download | emacs-875e42d501df262fcd9903528657997d025e5c68.tar.gz emacs-875e42d501df262fcd9903528657997d025e5c68.zip | |
Fix byte-vs-char length issue in 'transpose-regions'
* src/editfns.c (Ftranspose_regions): Calculate length of range between
regions both in units of bytes and characters and use these values as
appropriate.
Diffstat (limited to 'src')
| -rw-r--r-- | src/editfns.c | 16 |
1 files changed, 9 insertions, 7 deletions
diff --git a/src/editfns.c b/src/editfns.c index d3a4c226240..52a3e4e4266 100644 --- a/src/editfns.c +++ b/src/editfns.c | |||
| @@ -4520,8 +4520,9 @@ ring. */) | |||
| 4520 | (Lisp_Object startr1, Lisp_Object endr1, Lisp_Object startr2, Lisp_Object endr2, Lisp_Object leave_markers) | 4520 | (Lisp_Object startr1, Lisp_Object endr1, Lisp_Object startr2, Lisp_Object endr2, Lisp_Object leave_markers) |
| 4521 | { | 4521 | { |
| 4522 | register ptrdiff_t start1, end1, start2, end2; | 4522 | register ptrdiff_t start1, end1, start2, end2; |
| 4523 | ptrdiff_t start1_byte, start2_byte, len1_byte, len2_byte, end2_byte; | 4523 | ptrdiff_t start1_byte, end1_byte, start2_byte, end2_byte; |
| 4524 | ptrdiff_t gap, len1, len_mid, len2; | 4524 | ptrdiff_t gap, len1, len_mid, len2; |
| 4525 | ptrdiff_t len1_byte, len_mid_byte, len2_byte; | ||
| 4525 | unsigned char *start1_addr, *start2_addr, *temp; | 4526 | unsigned char *start1_addr, *start2_addr, *temp; |
| 4526 | 4527 | ||
| 4527 | INTERVAL cur_intv, tmp_interval1, tmp_interval2, tmp_interval3; | 4528 | INTERVAL cur_intv, tmp_interval1, tmp_interval2, tmp_interval3; |
| @@ -4607,7 +4608,7 @@ ring. */) | |||
| 4607 | } | 4608 | } |
| 4608 | 4609 | ||
| 4609 | start2_byte = CHAR_TO_BYTE (start2); | 4610 | start2_byte = CHAR_TO_BYTE (start2); |
| 4610 | ptrdiff_t end1_byte = CHAR_TO_BYTE (end1); | 4611 | end1_byte = CHAR_TO_BYTE (end1); |
| 4611 | len1_byte = end1_byte - start1_byte; | 4612 | len1_byte = end1_byte - start1_byte; |
| 4612 | len2_byte = end2_byte - start2_byte; | 4613 | len2_byte = end2_byte - start2_byte; |
| 4613 | 4614 | ||
| @@ -4672,7 +4673,8 @@ ring. */) | |||
| 4672 | } | 4673 | } |
| 4673 | else | 4674 | else |
| 4674 | { | 4675 | { |
| 4675 | len_mid = start2_byte - end1_byte; | 4676 | len_mid = start2 - end1; |
| 4677 | len_mid_byte = start2_byte - end1_byte; | ||
| 4676 | record_change (start1, (end2 - start1)); | 4678 | record_change (start1, (end2 - start1)); |
| 4677 | INTERVAL tmp_interval_mid = copy_intervals (cur_intv, end1, len_mid); | 4679 | INTERVAL tmp_interval_mid = copy_intervals (cur_intv, end1, len_mid); |
| 4678 | tmp_interval3 = validate_interval_range (buf, &startr1, &endr2, 0); | 4680 | tmp_interval3 = validate_interval_range (buf, &startr1, &endr2, 0); |
| @@ -4685,8 +4687,8 @@ ring. */) | |||
| 4685 | start1_addr = BYTE_POS_ADDR (start1_byte); | 4687 | start1_addr = BYTE_POS_ADDR (start1_byte); |
| 4686 | start2_addr = BYTE_POS_ADDR (start2_byte); | 4688 | start2_addr = BYTE_POS_ADDR (start2_byte); |
| 4687 | memcpy (temp, start2_addr, len2_byte); | 4689 | memcpy (temp, start2_addr, len2_byte); |
| 4688 | memcpy (start1_addr + len_mid + len2_byte, start1_addr, len1_byte); | 4690 | memcpy (start1_addr + len_mid_byte + len2_byte, start1_addr, len1_byte); |
| 4689 | memmove (start1_addr + len2_byte, start1_addr + len1_byte, len_mid); | 4691 | memmove (start1_addr + len2_byte, start1_addr + len1_byte, len_mid_byte); |
| 4690 | memcpy (start1_addr, temp, len2_byte); | 4692 | memcpy (start1_addr, temp, len2_byte); |
| 4691 | } | 4693 | } |
| 4692 | else | 4694 | else |
| @@ -4698,8 +4700,8 @@ ring. */) | |||
| 4698 | start2_addr = BYTE_POS_ADDR (start2_byte); | 4700 | start2_addr = BYTE_POS_ADDR (start2_byte); |
| 4699 | memcpy (temp, start1_addr, len1_byte); | 4701 | memcpy (temp, start1_addr, len1_byte); |
| 4700 | memcpy (start1_addr, start2_addr, len2_byte); | 4702 | memcpy (start1_addr, start2_addr, len2_byte); |
| 4701 | memmove (start1_addr + len2_byte, start1_addr + len1_byte, len_mid); | 4703 | memmove (start1_addr + len2_byte, start1_addr + len1_byte, len_mid_byte); |
| 4702 | memcpy (start1_addr + len2_byte + len_mid, temp, len1_byte); | 4704 | memcpy (start1_addr + len2_byte + len_mid_byte, temp, len1_byte); |
| 4703 | } | 4705 | } |
| 4704 | graft_intervals_into_buffer (tmp_interval_mid, start1 + len2, | 4706 | graft_intervals_into_buffer (tmp_interval_mid, start1 + len2, |
| 4705 | len_mid, current_buffer, 0); | 4707 | len_mid, current_buffer, 0); |