*** ../src/lisp.h~ Wed Sep 10 03:04:09 1997
--- ../src/lisp.h Fri Feb 27 23:15:39 1998
*************** struct interval
*** 449,454 ****
--- 449,459 ----
unsigned int total_length; /* Length of myself and both children. */
unsigned int position; /* Cache of interval's character position. */
+ /* This field is usually updated
+ simultaneously with an interval
+ traversal, there is no guaranty
+ that it is valid for a random
+ interval. */
struct interval *left; /* Intervals which precede me. */
struct interval *right; /* Intervals which succeed me. */
*** ../src/syntax.c~ Fri Jan 30 17:50:06 1998
--- ../src/syntax.c Sat Feb 28 00:34:13 1998
*************** update_syntax_table (pos, count, init, o
*** 122,127 ****
--- 122,142 ----
invalidate = 0;
if (NULL_INTERVAL_P (i))
return;
+ /* interval_of () updates only ->position of the return value,
+ update the parents manually to speed up update_interval. */
+ while (!NULL_PARENT (i))
+ {
+ if (AM_RIGHT_CHILD (i))
+ i->parent->position = i->position
+ - LEFT_TOTAL_LENGTH (i) + TOTAL_LENGTH (i) /* right end */
+ - TOTAL_LENGTH (i->parent)
+ + LEFT_TOTAL_LENGTH (i->parent);
+ else
+ i->parent->position = i->position - LEFT_TOTAL_LENGTH (i)
+ + TOTAL_LENGTH (i);
+ i = i->parent;
+ }
+ i = gl_state.forward_i;
gl_state.b_property = i->position - 1 - gl_state.offset;
gl_state.e_property = INTERVAL_LAST_POS (i) - gl_state.offset;
goto update;
*** ../src/intervals.c~ Sat Jul 12 02:29:11 1997
--- ../src/intervals.c Sat Feb 28 00:28:56 1998
*************** previous_interval (interval)
*** 672,678 ****
}
/* Find the interval containing POS given some non-NULL INTERVAL
! in the same tree. */
INTERVAL
update_interval (i, pos)
register INTERVAL i;
--- 672,679 ----
}
/* Find the interval containing POS given some non-NULL INTERVAL
! in the same tree. Note that we need to update interval->position
! if we go down the tree. */
INTERVAL
update_interval (i, pos)
register INTERVAL i;
*************** update_interval (i, pos)
*** 686,707 ****
if (pos < i->position)
{
/* Move left. */
! if (pos >= i->position - TOTAL_LENGTH (i->left))
! i = i->left; /* Move to the left child */
else if (NULL_PARENT (i))
error ("Point before start of properties");
! else i = i->parent;
continue;
}
else if (pos >= INTERVAL_LAST_POS (i))
{
/* Move right. */
! if (pos < INTERVAL_LAST_POS (i) + TOTAL_LENGTH (i->right))
! i = i->right; /* Move to the right child */
else if (NULL_PARENT (i))
error ("Point after end of properties");
else
! i = i->parent;
continue;
}
else
--- 687,717 ----
if (pos < i->position)
{
/* Move left. */
! if (pos >= i->position - TOTAL_LENGTH (i->left))
! {
! i->left->position = i->position - TOTAL_LENGTH (i->left)
! + LEFT_TOTAL_LENGTH (i->left);
! i = i->left; /* Move to the left child */
! }
else if (NULL_PARENT (i))
error ("Point before start of properties");
! else
! i = i->parent;
continue;
}
else if (pos >= INTERVAL_LAST_POS (i))
{
/* Move right. */
! if (pos < INTERVAL_LAST_POS (i) + TOTAL_LENGTH (i->right))
! {
! i->right->position = INTERVAL_LAST_POS (i) +
! LEFT_TOTAL_LENGTH (i->right);
! i = i->right; /* Move to the right child */
! }
else if (NULL_PARENT (i))
error ("Point after end of properties");
else
! i = i->parent;
continue;
}
else