aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/intervals.c44
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