static void edit_get_rule (WEdit * edit, off_t byte_index) { off_t i; if (byte_index > edit->last_get_rule) { for (i = edit->last_get_rule + 1; i <= byte_index; i++) { off_t d = SYNTAX_MARKER_DENSITY; apply_rules_going_right (edit, i); if (edit->syntax_marker != NULL) d += ((syntax_marker_t *) edit->syntax_marker->data)->offset; if (i > d) { syntax_marker_t *s; s = g_new (syntax_marker_t, 1); s->offset = i; s->rule = edit->rule; edit->syntax_marker = g_slist_prepend (edit->syntax_marker, s); } } } else if (byte_index < edit->last_get_rule) { while (TRUE) { syntax_marker_t *s; if (edit->syntax_marker == NULL) { memset (&edit->rule, 0, sizeof (edit->rule)); for (i = -1; i <= byte_index; i++) apply_rules_going_right (edit, i); break; } s = (syntax_marker_t *) edit->syntax_marker->data; if (byte_index >= s->offset) { edit->rule = s->rule; for (i = s->offset + 1; i <= byte_index; i++) apply_rules_going_right (edit, i); break; } g_free (s); edit->syntax_marker = g_slist_delete_link (edit->syntax_marker, edit->syntax_marker); } } edit->last_get_rule = byte_index; }
static struct syntax_rule edit_get_rule (WEdit * edit, long byte_index) { long i; if (byte_index > edit->last_get_rule) { for (i = edit->last_get_rule + 1; i <= byte_index; i++) { edit->rule = apply_rules_going_right (edit, i, edit->rule); if (i > (edit->syntax_marker ? edit->syntax_marker->offset + SYNTAX_MARKER_DENSITY : SYNTAX_MARKER_DENSITY)) { struct _syntax_marker *s; s = edit->syntax_marker; edit->syntax_marker = g_malloc (sizeof (struct _syntax_marker)); edit->syntax_marker->next = s; edit->syntax_marker->offset = i; edit->syntax_marker->rule = edit->rule; } } } else if (byte_index < edit->last_get_rule) { struct _syntax_marker *s; for (;;) { if (!edit->syntax_marker) { memset (&edit->rule, 0, sizeof (edit->rule)); for (i = -1; i <= byte_index; i++) edit->rule = apply_rules_going_right (edit, i, edit->rule); break; } if (byte_index >= edit->syntax_marker->offset) { edit->rule = edit->syntax_marker->rule; for (i = edit->syntax_marker->offset + 1; i <= byte_index; i++) edit->rule = apply_rules_going_right (edit, i, edit->rule); break; } s = edit->syntax_marker->next; g_free (edit->syntax_marker); edit->syntax_marker = s; } } edit->last_get_rule = byte_index; return edit->rule; }