aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJens Schmidt2025-12-17 22:06:12 +0100
committerStefan Monnier2025-12-20 13:23:21 -0500
commit875e42d501df262fcd9903528657997d025e5c68 (patch)
treecc3926ffeba03ecf13afe514092826f2a7b1038a /src
parente93a9a905799b2e1e371fe6292a003e6f5480e95 (diff)
downloademacs-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.c16
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);