diff options
| author | Richard M. Stallman | 1993-06-05 07:57:32 +0000 |
|---|---|---|
| committer | Richard M. Stallman | 1993-06-05 07:57:32 +0000 |
| commit | 95e3e1ef659f459fcae242391351ef404352c6a2 (patch) | |
| tree | 71a1fed49a1be9672a1fa79a8757aed2d56ae879 | |
| parent | fc4f24da5c464976f2d4be1370ee1121a86bd5c4 (diff) | |
| download | emacs-95e3e1ef659f459fcae242391351ef404352c6a2.tar.gz emacs-95e3e1ef659f459fcae242391351ef404352c6a2.zip | |
(copy_intervals): Don't adjust total_length at the end.
Set lengths of subintervals properly.
(balance_intervals): Balance left as well as right.
| -rw-r--r-- | src/intervals.c | 44 |
1 files changed, 25 insertions, 19 deletions
diff --git a/src/intervals.c b/src/intervals.c index b262412930f..c4bb4c381db 100644 --- a/src/intervals.c +++ b/src/intervals.c | |||
| @@ -1555,23 +1555,30 @@ balance_an_interval (i) | |||
| 1555 | register int threshold = (XFASTINT (interval_balance_threshold) | 1555 | register int threshold = (XFASTINT (interval_balance_threshold) |
| 1556 | * (total_children_size / 100)); | 1556 | * (total_children_size / 100)); |
| 1557 | 1557 | ||
| 1558 | if (LEFT_TOTAL_LENGTH (i) > RIGHT_TOTAL_LENGTH (i) | 1558 | /* Balance within each side. */ |
| 1559 | && (LEFT_TOTAL_LENGTH (i) - RIGHT_TOTAL_LENGTH (i)) > threshold) | 1559 | balance_intervals (i->left); |
| 1560 | return rotate_right (i); | 1560 | balance_intervals (i->right); |
| 1561 | 1561 | ||
| 1562 | if (LEFT_TOTAL_LENGTH (i) > RIGHT_TOTAL_LENGTH (i) | 1562 | if (LEFT_TOTAL_LENGTH (i) > RIGHT_TOTAL_LENGTH (i) |
| 1563 | && (LEFT_TOTAL_LENGTH (i) - RIGHT_TOTAL_LENGTH (i)) > threshold) | 1563 | && (LEFT_TOTAL_LENGTH (i) - RIGHT_TOTAL_LENGTH (i)) > threshold) |
| 1564 | return rotate_right (i); | 1564 | { |
| 1565 | 1565 | i = rotate_right (i); | |
| 1566 | #if 0 | 1566 | /* If that made it unbalanced the other way, take it back. */ |
| 1567 | if (LEFT_TOTAL_LENGTH (i) > | 1567 | if (RIGHT_TOTAL_LENGTH (i) > LEFT_TOTAL_LENGTH (i) |
| 1568 | (RIGHT_TOTAL_LENGTH (i) + XINT (interval_balance_threshold))) | 1568 | && (RIGHT_TOTAL_LENGTH (i) - LEFT_TOTAL_LENGTH (i)) > threshold) |
| 1569 | return rotate_right (i); | 1569 | return rotate_left (i); |
| 1570 | return i; | ||
| 1571 | } | ||
| 1570 | 1572 | ||
| 1571 | if (RIGHT_TOTAL_LENGTH (i) > | 1573 | if (RIGHT_TOTAL_LENGTH (i) > LEFT_TOTAL_LENGTH (i) |
| 1572 | (LEFT_TOTAL_LENGTH (i) + XINT (interval_balance_threshold))) | 1574 | && (RIGHT_TOTAL_LENGTH (i) - LEFT_TOTAL_LENGTH (i)) > threshold) |
| 1573 | return rotate_left (i); | 1575 | { |
| 1574 | #endif | 1576 | i = rotate_left (i); |
| 1577 | if (LEFT_TOTAL_LENGTH (i) > RIGHT_TOTAL_LENGTH (i) | ||
| 1578 | && (LEFT_TOTAL_LENGTH (i) - RIGHT_TOTAL_LENGTH (i)) > threshold) | ||
| 1579 | return rotate_right (i); | ||
| 1580 | return i; | ||
| 1581 | } | ||
| 1575 | 1582 | ||
| 1576 | return i; | 1583 | return i; |
| 1577 | } | 1584 | } |
| @@ -1608,7 +1615,7 @@ copy_intervals (tree, start, length) | |||
| 1608 | int start, length; | 1615 | int start, length; |
| 1609 | { | 1616 | { |
| 1610 | register INTERVAL i, new, t; | 1617 | register INTERVAL i, new, t; |
| 1611 | register int got; | 1618 | register int got, prevlen; |
| 1612 | 1619 | ||
| 1613 | if (NULL_INTERVAL_P (tree) || length <= 0) | 1620 | if (NULL_INTERVAL_P (tree) || length <= 0) |
| 1614 | return NULL_INTERVAL; | 1621 | return NULL_INTERVAL; |
| @@ -1629,17 +1636,16 @@ copy_intervals (tree, start, length) | |||
| 1629 | copy_properties (i, new); | 1636 | copy_properties (i, new); |
| 1630 | 1637 | ||
| 1631 | t = new; | 1638 | t = new; |
| 1639 | prevlen = got; | ||
| 1632 | while (got < length) | 1640 | while (got < length) |
| 1633 | { | 1641 | { |
| 1634 | i = next_interval (i); | 1642 | i = next_interval (i); |
| 1635 | t = split_interval_right (t, got + 1); | 1643 | t = split_interval_right (t, prevlen + 1); |
| 1636 | copy_properties (i, t); | 1644 | copy_properties (i, t); |
| 1637 | got += LENGTH (i); | 1645 | prevlen = LENGTH (i); |
| 1646 | got += prevlen; | ||
| 1638 | } | 1647 | } |
| 1639 | 1648 | ||
| 1640 | if (got > length) | ||
| 1641 | t->total_length -= (got - length); | ||
| 1642 | |||
| 1643 | return balance_intervals (new); | 1649 | return balance_intervals (new); |
| 1644 | } | 1650 | } |
| 1645 | 1651 | ||