aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorChong Yidong2007-04-07 03:37:48 +0000
committerChong Yidong2007-04-07 03:37:48 +0000
commit6cd0f4784be94342b1497e5427068c29adbdba4f (patch)
treed8e706f4bc82ee76bb95ba75a40000adbf2b0600 /src
parentb1e553b4673babd3f5fc27f7ca5c3288862ee8b3 (diff)
downloademacs-6cd0f4784be94342b1497e5427068c29adbdba4f.tar.gz
emacs-6cd0f4784be94342b1497e5427068c29adbdba4f.zip
(Ftranspose_regions): Validate interval before setting text
properties.
Diffstat (limited to 'src')
-rw-r--r--src/editfns.c31
1 files changed, 20 insertions, 11 deletions
diff --git a/src/editfns.c b/src/editfns.c
index 59ac4de4c6b..2ab852d2925 100644
--- a/src/editfns.c
+++ b/src/editfns.c
@@ -4119,7 +4119,7 @@ Transposing beyond buffer boundaries is an error. */)
4119 int gap, len1, len_mid, len2; 4119 int gap, len1, len_mid, len2;
4120 unsigned char *start1_addr, *start2_addr, *temp; 4120 unsigned char *start1_addr, *start2_addr, *temp;
4121 4121
4122 INTERVAL cur_intv, tmp_interval1, tmp_interval_mid, tmp_interval2; 4122 INTERVAL cur_intv, tmp_interval1, tmp_interval_mid, tmp_interval2, tmp_interval3;
4123 Lisp_Object buf; 4123 Lisp_Object buf;
4124 4124
4125 XSETBUFFER (buf, current_buffer); 4125 XSETBUFFER (buf, current_buffer);
@@ -4231,8 +4231,9 @@ Transposing beyond buffer boundaries is an error. */)
4231 tmp_interval2 = copy_intervals (cur_intv, start2, len2); 4231 tmp_interval2 = copy_intervals (cur_intv, start2, len2);
4232 /* Don't use Fset_text_properties: that can cause GC, which can 4232 /* Don't use Fset_text_properties: that can cause GC, which can
4233 clobber objects stored in the tmp_intervals. */ 4233 clobber objects stored in the tmp_intervals. */
4234 set_text_properties_1 (make_number (start1), make_number (end2), 4234 tmp_interval3 = validate_interval_range (buf, &startr1, &endr2, 0);
4235 Qnil, buf, NULL); 4235 if (!NULL_INTERVAL_P (tmp_interval3))
4236 set_text_properties_1 (startr1, endr2, Qnil, buf, tmp_interval3);
4236 4237
4237 /* First region smaller than second. */ 4238 /* First region smaller than second. */
4238 if (len1_byte < len2_byte) 4239 if (len1_byte < len2_byte)
@@ -4288,10 +4289,14 @@ Transposing beyond buffer boundaries is an error. */)
4288 record_change (start2, len2); 4289 record_change (start2, len2);
4289 tmp_interval1 = copy_intervals (cur_intv, start1, len1); 4290 tmp_interval1 = copy_intervals (cur_intv, start1, len1);
4290 tmp_interval2 = copy_intervals (cur_intv, start2, len2); 4291 tmp_interval2 = copy_intervals (cur_intv, start2, len2);
4291 set_text_properties_1 (make_number (start1), make_number (end1), 4292
4292 Qnil, buf, NULL); 4293 tmp_interval3 = validate_interval_range (buf, &startr1, &endr1, 0);
4293 set_text_properties_1 (make_number (start2), make_number (end2), 4294 if (!NULL_INTERVAL_P (tmp_interval3))
4294 Qnil, buf, NULL); 4295 set_text_properties_1 (startr1, endr1, Qnil, buf, tmp_interval3);
4296
4297 tmp_interval3 = validate_interval_range (buf, &startr2, &endr2, 0);
4298 if (!NULL_INTERVAL_P (tmp_interval3))
4299 set_text_properties_1 (startr2, endr2, Qnil, buf, tmp_interval3);
4295 4300
4296 SAFE_ALLOCA (temp, unsigned char *, len1_byte); 4301 SAFE_ALLOCA (temp, unsigned char *, len1_byte);
4297 start1_addr = BYTE_POS_ADDR (start1_byte); 4302 start1_addr = BYTE_POS_ADDR (start1_byte);
@@ -4317,8 +4322,10 @@ Transposing beyond buffer boundaries is an error. */)
4317 tmp_interval1 = copy_intervals (cur_intv, start1, len1); 4322 tmp_interval1 = copy_intervals (cur_intv, start1, len1);
4318 tmp_interval_mid = copy_intervals (cur_intv, end1, len_mid); 4323 tmp_interval_mid = copy_intervals (cur_intv, end1, len_mid);
4319 tmp_interval2 = copy_intervals (cur_intv, start2, len2); 4324 tmp_interval2 = copy_intervals (cur_intv, start2, len2);
4320 set_text_properties_1 (make_number (start1), make_number (end2), 4325
4321 Qnil, buf, NULL); 4326 tmp_interval3 = validate_interval_range (buf, &startr1, &endr2, 0);
4327 if (!NULL_INTERVAL_P (tmp_interval3))
4328 set_text_properties_1 (startr1, endr2, Qnil, buf, tmp_interval3);
4322 4329
4323 /* holds region 2 */ 4330 /* holds region 2 */
4324 SAFE_ALLOCA (temp, unsigned char *, len2_byte); 4331 SAFE_ALLOCA (temp, unsigned char *, len2_byte);
@@ -4348,8 +4355,10 @@ Transposing beyond buffer boundaries is an error. */)
4348 tmp_interval1 = copy_intervals (cur_intv, start1, len1); 4355 tmp_interval1 = copy_intervals (cur_intv, start1, len1);
4349 tmp_interval_mid = copy_intervals (cur_intv, end1, len_mid); 4356 tmp_interval_mid = copy_intervals (cur_intv, end1, len_mid);
4350 tmp_interval2 = copy_intervals (cur_intv, start2, len2); 4357 tmp_interval2 = copy_intervals (cur_intv, start2, len2);
4351 set_text_properties_1 (make_number (start1), make_number (end2), 4358
4352 Qnil, buf, NULL); 4359 tmp_interval3 = validate_interval_range (buf, &startr1, &endr2, 0);
4360 if (!NULL_INTERVAL_P (tmp_interval3))
4361 set_text_properties_1 (startr1, endr2, Qnil, buf, tmp_interval3);
4353 4362
4354 /* holds region 1 */ 4363 /* holds region 1 */
4355 SAFE_ALLOCA (temp, unsigned char *, len1_byte); 4364 SAFE_ALLOCA (temp, unsigned char *, len1_byte);