aboutsummaryrefslogtreecommitdiffstats
path: root/src/intervals.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/intervals.c')
-rw-r--r--src/intervals.c60
1 files changed, 31 insertions, 29 deletions
diff --git a/src/intervals.c b/src/intervals.c
index 1ed93e1302d..f65ce0ecc77 100644
--- a/src/intervals.c
+++ b/src/intervals.c
@@ -1,5 +1,6 @@
1/* Code for doing intervals. 1/* Code for doing intervals.
2 Copyright (C) 1993-1995, 1997-1998, 2001-2012 Free Software Foundation, Inc. 2 Copyright (C) 1993-1995, 1997-1998, 2001-2013 Free Software
3 Foundation, Inc.
3 4
4This file is part of GNU Emacs. 5This file is part of GNU Emacs.
5 6
@@ -109,14 +110,14 @@ create_root_interval (Lisp_Object parent)
109 { 110 {
110 new->total_length = (BUF_Z (XBUFFER (parent)) 111 new->total_length = (BUF_Z (XBUFFER (parent))
111 - BUF_BEG (XBUFFER (parent))); 112 - BUF_BEG (XBUFFER (parent)));
112 eassert (0 <= TOTAL_LENGTH (new)); 113 eassert (TOTAL_LENGTH (new) >= 0);
113 set_buffer_intervals (XBUFFER (parent), new); 114 set_buffer_intervals (XBUFFER (parent), new);
114 new->position = BEG; 115 new->position = BEG;
115 } 116 }
116 else if (STRINGP (parent)) 117 else if (STRINGP (parent))
117 { 118 {
118 new->total_length = SCHARS (parent); 119 new->total_length = SCHARS (parent);
119 eassert (0 <= TOTAL_LENGTH (new)); 120 eassert (TOTAL_LENGTH (new) >= 0);
120 set_string_intervals (parent, new); 121 set_string_intervals (parent, new);
121 new->position = 0; 122 new->position = 0;
122 } 123 }
@@ -370,11 +371,11 @@ rotate_right (INTERVAL interval)
370 371
371 /* A's total length is decreased by the length of B and its left child. */ 372 /* A's total length is decreased by the length of B and its left child. */
372 interval->total_length -= B->total_length - LEFT_TOTAL_LENGTH (interval); 373 interval->total_length -= B->total_length - LEFT_TOTAL_LENGTH (interval);
373 eassert (0 <= TOTAL_LENGTH (interval)); 374 eassert (TOTAL_LENGTH (interval) >= 0);
374 375
375 /* B must have the same total length of A. */ 376 /* B must have the same total length of A. */
376 B->total_length = old_total; 377 B->total_length = old_total;
377 eassert (0 <= TOTAL_LENGTH (B)); 378 eassert (TOTAL_LENGTH (B) >= 0);
378 379
379 return B; 380 return B;
380} 381}
@@ -417,11 +418,11 @@ rotate_left (INTERVAL interval)
417 418
418 /* A's total length is decreased by the length of B and its right child. */ 419 /* A's total length is decreased by the length of B and its right child. */
419 interval->total_length -= B->total_length - RIGHT_TOTAL_LENGTH (interval); 420 interval->total_length -= B->total_length - RIGHT_TOTAL_LENGTH (interval);
420 eassert (0 <= TOTAL_LENGTH (interval)); 421 eassert (TOTAL_LENGTH (interval) >= 0);
421 422
422 /* B must have the same total length of A. */ 423 /* B must have the same total length of A. */
423 B->total_length = old_total; 424 B->total_length = old_total;
424 eassert (0 <= TOTAL_LENGTH (B)); 425 eassert (TOTAL_LENGTH (B) >= 0);
425 426
426 return B; 427 return B;
427} 428}
@@ -555,7 +556,7 @@ split_interval_right (INTERVAL interval, ptrdiff_t offset)
555 { 556 {
556 set_interval_right (interval, new); 557 set_interval_right (interval, new);
557 new->total_length = new_length; 558 new->total_length = new_length;
558 eassert (0 <= TOTAL_LENGTH (new)); 559 eassert (TOTAL_LENGTH (new) >= 0);
559 } 560 }
560 else 561 else
561 { 562 {
@@ -564,7 +565,7 @@ split_interval_right (INTERVAL interval, ptrdiff_t offset)
564 set_interval_parent (interval->right, new); 565 set_interval_parent (interval->right, new);
565 set_interval_right (interval, new); 566 set_interval_right (interval, new);
566 new->total_length = new_length + new->right->total_length; 567 new->total_length = new_length + new->right->total_length;
567 eassert (0 <= TOTAL_LENGTH (new)); 568 eassert (TOTAL_LENGTH (new) >= 0);
568 balance_an_interval (new); 569 balance_an_interval (new);
569 } 570 }
570 571
@@ -600,7 +601,7 @@ split_interval_left (INTERVAL interval, ptrdiff_t offset)
600 { 601 {
601 set_interval_left (interval, new); 602 set_interval_left (interval, new);
602 new->total_length = new_length; 603 new->total_length = new_length;
603 eassert (0 <= TOTAL_LENGTH (new)); 604 eassert (TOTAL_LENGTH (new) >= 0);
604 } 605 }
605 else 606 else
606 { 607 {
@@ -609,7 +610,7 @@ split_interval_left (INTERVAL interval, ptrdiff_t offset)
609 set_interval_parent (new->left, new); 610 set_interval_parent (new->left, new);
610 set_interval_left (interval, new); 611 set_interval_left (interval, new);
611 new->total_length = new_length + new->left->total_length; 612 new->total_length = new_length + new->left->total_length;
612 eassert (0 <= TOTAL_LENGTH (new)); 613 eassert (TOTAL_LENGTH (new) >= 0);
613 balance_an_interval (new); 614 balance_an_interval (new);
614 } 615 }
615 616
@@ -959,7 +960,7 @@ adjust_intervals_for_insertion (INTERVAL tree,
959 for (temp = prev ? prev : i; temp; temp = INTERVAL_PARENT_OR_NULL (temp)) 960 for (temp = prev ? prev : i; temp; temp = INTERVAL_PARENT_OR_NULL (temp))
960 { 961 {
961 temp->total_length += length; 962 temp->total_length += length;
962 eassert (0 <= TOTAL_LENGTH (temp)); 963 eassert (TOTAL_LENGTH (temp) >= 0);
963 temp = balance_possible_root_interval (temp); 964 temp = balance_possible_root_interval (temp);
964 } 965 }
965 966
@@ -1015,7 +1016,7 @@ adjust_intervals_for_insertion (INTERVAL tree,
1015 for (temp = i; temp; temp = INTERVAL_PARENT_OR_NULL (temp)) 1016 for (temp = i; temp; temp = INTERVAL_PARENT_OR_NULL (temp))
1016 { 1017 {
1017 temp->total_length += length; 1018 temp->total_length += length;
1018 eassert (0 <= TOTAL_LENGTH (temp)); 1019 eassert (TOTAL_LENGTH (temp) >= 0);
1019 temp = balance_possible_root_interval (temp); 1020 temp = balance_possible_root_interval (temp);
1020 } 1021 }
1021 } 1022 }
@@ -1217,7 +1218,7 @@ delete_node (register INTERVAL i)
1217 this = this->left; 1218 this = this->left;
1218 this->total_length += migrate_amt; 1219 this->total_length += migrate_amt;
1219 } 1220 }
1220 eassert (0 <= TOTAL_LENGTH (this)); 1221 eassert (TOTAL_LENGTH (this) >= 0);
1221 set_interval_left (this, migrate); 1222 set_interval_left (this, migrate);
1222 set_interval_parent (migrate, this); 1223 set_interval_parent (migrate, this);
1223 1224
@@ -1299,7 +1300,7 @@ interval_deletion_adjustment (register INTERVAL tree, register ptrdiff_t from,
1299 relative_position, 1300 relative_position,
1300 amount); 1301 amount);
1301 tree->total_length -= subtract; 1302 tree->total_length -= subtract;
1302 eassert (0 <= TOTAL_LENGTH (tree)); 1303 eassert (TOTAL_LENGTH (tree) >= 0);
1303 return subtract; 1304 return subtract;
1304 } 1305 }
1305 /* Right branch. */ 1306 /* Right branch. */
@@ -1314,7 +1315,7 @@ interval_deletion_adjustment (register INTERVAL tree, register ptrdiff_t from,
1314 relative_position, 1315 relative_position,
1315 amount); 1316 amount);
1316 tree->total_length -= subtract; 1317 tree->total_length -= subtract;
1317 eassert (0 <= TOTAL_LENGTH (tree)); 1318 eassert (TOTAL_LENGTH (tree) >= 0);
1318 return subtract; 1319 return subtract;
1319 } 1320 }
1320 /* Here -- this node. */ 1321 /* Here -- this node. */
@@ -1329,7 +1330,7 @@ interval_deletion_adjustment (register INTERVAL tree, register ptrdiff_t from,
1329 amount = my_amount; 1330 amount = my_amount;
1330 1331
1331 tree->total_length -= amount; 1332 tree->total_length -= amount;
1332 eassert (0 <= TOTAL_LENGTH (tree)); 1333 eassert (TOTAL_LENGTH (tree) >= 0);
1333 if (LENGTH (tree) == 0) 1334 if (LENGTH (tree) == 0)
1334 delete_interval (tree); 1335 delete_interval (tree);
1335 1336
@@ -1371,7 +1372,7 @@ adjust_intervals_for_deletion (struct buffer *buffer,
1371 if (ONLY_INTERVAL_P (tree)) 1372 if (ONLY_INTERVAL_P (tree))
1372 { 1373 {
1373 tree->total_length -= length; 1374 tree->total_length -= length;
1374 eassert (0 <= TOTAL_LENGTH (tree)); 1375 eassert (TOTAL_LENGTH (tree) >= 0);
1375 return; 1376 return;
1376 } 1377 }
1377 1378
@@ -1434,19 +1435,19 @@ merge_interval_right (register INTERVAL i)
1434 while (! NULL_LEFT_CHILD (successor)) 1435 while (! NULL_LEFT_CHILD (successor))
1435 { 1436 {
1436 successor->total_length += absorb; 1437 successor->total_length += absorb;
1437 eassert (0 <= TOTAL_LENGTH (successor)); 1438 eassert (TOTAL_LENGTH (successor) >= 0);
1438 successor = successor->left; 1439 successor = successor->left;
1439 } 1440 }
1440 1441
1441 successor->total_length += absorb; 1442 successor->total_length += absorb;
1442 eassert (0 <= TOTAL_LENGTH (successor)); 1443 eassert (TOTAL_LENGTH (successor) >= 0);
1443 delete_interval (i); 1444 delete_interval (i);
1444 return successor; 1445 return successor;
1445 } 1446 }
1446 1447
1447 /* Zero out this interval. */ 1448 /* Zero out this interval. */
1448 i->total_length -= absorb; 1449 i->total_length -= absorb;
1449 eassert (0 <= TOTAL_LENGTH (i)); 1450 eassert (TOTAL_LENGTH (i) >= 0);
1450 1451
1451 successor = i; 1452 successor = i;
1452 while (! NULL_PARENT (successor)) /* It's above us. Subtract as 1453 while (! NULL_PARENT (successor)) /* It's above us. Subtract as
@@ -1461,7 +1462,7 @@ merge_interval_right (register INTERVAL i)
1461 1462
1462 successor = INTERVAL_PARENT (successor); 1463 successor = INTERVAL_PARENT (successor);
1463 successor->total_length -= absorb; 1464 successor->total_length -= absorb;
1464 eassert (0 <= TOTAL_LENGTH (successor)); 1465 eassert (TOTAL_LENGTH (successor) >= 0);
1465 } 1466 }
1466 1467
1467 /* This must be the rightmost or last interval and cannot 1468 /* This must be the rightmost or last interval and cannot
@@ -1490,19 +1491,19 @@ merge_interval_left (register INTERVAL i)
1490 while (! NULL_RIGHT_CHILD (predecessor)) 1491 while (! NULL_RIGHT_CHILD (predecessor))
1491 { 1492 {
1492 predecessor->total_length += absorb; 1493 predecessor->total_length += absorb;
1493 eassert (0 <= TOTAL_LENGTH (predecessor)); 1494 eassert (TOTAL_LENGTH (predecessor) >= 0);
1494 predecessor = predecessor->right; 1495 predecessor = predecessor->right;
1495 } 1496 }
1496 1497
1497 predecessor->total_length += absorb; 1498 predecessor->total_length += absorb;
1498 eassert (0 <= TOTAL_LENGTH (predecessor)); 1499 eassert (TOTAL_LENGTH (predecessor) >= 0);
1499 delete_interval (i); 1500 delete_interval (i);
1500 return predecessor; 1501 return predecessor;
1501 } 1502 }
1502 1503
1503 /* Zero out this interval. */ 1504 /* Zero out this interval. */
1504 i->total_length -= absorb; 1505 i->total_length -= absorb;
1505 eassert (0 <= TOTAL_LENGTH (i)); 1506 eassert (TOTAL_LENGTH (i) >= 0);
1506 1507
1507 predecessor = i; 1508 predecessor = i;
1508 while (! NULL_PARENT (predecessor)) /* It's above us. Go up, 1509 while (! NULL_PARENT (predecessor)) /* It's above us. Go up,
@@ -1517,7 +1518,7 @@ merge_interval_left (register INTERVAL i)
1517 1518
1518 predecessor = INTERVAL_PARENT (predecessor); 1519 predecessor = INTERVAL_PARENT (predecessor);
1519 predecessor->total_length -= absorb; 1520 predecessor->total_length -= absorb;
1520 eassert (0 <= TOTAL_LENGTH (predecessor)); 1521 eassert (TOTAL_LENGTH (predecessor) >= 0);
1521 } 1522 }
1522 1523
1523 /* This must be the leftmost or first interval and cannot 1524 /* This must be the leftmost or first interval and cannot
@@ -1624,7 +1625,8 @@ graft_intervals_into_buffer (INTERVAL source, ptrdiff_t position,
1624 XSETBUFFER (buf, buffer); 1625 XSETBUFFER (buf, buffer);
1625 set_text_properties_1 (make_number (position), 1626 set_text_properties_1 (make_number (position),
1626 make_number (position + length), 1627 make_number (position + length),
1627 Qnil, buf, 0); 1628 Qnil, buf,
1629 find_interval (tree, position));
1628 } 1630 }
1629 /* Shouldn't be necessary. --Stef */ 1631 /* Shouldn't be necessary. --Stef */
1630 buffer_balance_intervals (buffer); 1632 buffer_balance_intervals (buffer);
@@ -2270,7 +2272,7 @@ copy_intervals (INTERVAL tree, ptrdiff_t start, ptrdiff_t length)
2270 new->position = 0; 2272 new->position = 0;
2271 got = (LENGTH (i) - (start - i->position)); 2273 got = (LENGTH (i) - (start - i->position));
2272 new->total_length = length; 2274 new->total_length = length;
2273 eassert (0 <= TOTAL_LENGTH (new)); 2275 eassert (TOTAL_LENGTH (new) >= 0);
2274 copy_properties (i, new); 2276 copy_properties (i, new);
2275 2277
2276 t = new; 2278 t = new;
@@ -2353,7 +2355,7 @@ set_intervals_multibyte_1 (INTERVAL i, bool multi_flag,
2353 i->total_length = end - start; 2355 i->total_length = end - start;
2354 else 2356 else
2355 i->total_length = end_byte - start_byte; 2357 i->total_length = end_byte - start_byte;
2356 eassert (0 <= TOTAL_LENGTH (i)); 2358 eassert (TOTAL_LENGTH (i) >= 0);
2357 2359
2358 if (TOTAL_LENGTH (i) == 0) 2360 if (TOTAL_LENGTH (i) == 0)
2359 { 2361 {