To match things more complicated than fixed strings, we need states with multiple out arrows. --- lib/index.cc | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-)
diff --git a/lib/index.cc b/lib/index.cc index 3bb1ac1c..fd66762c 100644 --- a/lib/index.cc +++ b/lib/index.cc @@ -122,23 +122,25 @@ do_filter (const scanner_state_t states[], register const char *inptr = inbuf; const char *inend = inbuf + inlen; char *outptr; - int next; + int next, current; (void) prespace; g_mime_filter_set_size (gmime_filter, inlen, FALSE); outptr = gmime_filter->outbuf; + current = filter->state; while (inptr < inend) { - if (*inptr >= states[filter->state].a && - *inptr <= states[filter->state].b) - { - next = states[filter->state].next_if_match; - } - else - { - next = states[filter->state].next_if_not_match; - } + /* do "fake transitions" until we fire a rule, or run out of rules */ + do { + if (*inptr >= states[current].a && *inptr <= states[current].b) { + next = states[current].next_if_match; + } else { + next = states[current].next_if_not_match; + } + + current = next; + } while (next != states[next].state); if (filter->state < first_skipping_state) *outptr++ = *inptr; -- 2.11.0 _______________________________________________ notmuch mailing list notmuch@notmuchmail.org https://notmuchmail.org/mailman/listinfo/notmuch