diff options
| author | Chong Yidong | 2007-04-07 03:37:48 +0000 |
|---|---|---|
| committer | Chong Yidong | 2007-04-07 03:37:48 +0000 |
| commit | 6cd0f4784be94342b1497e5427068c29adbdba4f (patch) | |
| tree | d8e706f4bc82ee76bb95ba75a40000adbf2b0600 /src | |
| parent | b1e553b4673babd3f5fc27f7ca5c3288862ee8b3 (diff) | |
| download | emacs-6cd0f4784be94342b1497e5427068c29adbdba4f.tar.gz emacs-6cd0f4784be94342b1497e5427068c29adbdba4f.zip | |
(Ftranspose_regions): Validate interval before setting text
properties.
Diffstat (limited to 'src')
| -rw-r--r-- | src/editfns.c | 31 |
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); |