示例#1
0
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;
}
示例#2
0
文件: syntax.c 项目: artzub/mc
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;
}