[patch v3 2/4] lib/index: separate state table definition from scanner.
David Bremner
david at tethera.net
Wed Jun 7 19:11:47 PDT 2017
We want to reuse the scanner definition with a different table. This
is mainly code movement, and making the state table part of the filter
struct/class.
---
lib/index.cc | 70 ++++++++++++++++++++++++++++++++++--------------------------
1 file changed, 40 insertions(+), 30 deletions(-)
diff --git a/lib/index.cc b/lib/index.cc
index d9612e03..19ddc39c 100644
--- a/lib/index.cc
+++ b/lib/index.cc
@@ -24,6 +24,40 @@
#include <xapian.h>
+
+typedef struct {
+ int state;
+ int a;
+ int b;
+ int next_if_match;
+ int next_if_not_match;
+} scanner_state_t;
+
+/* Simple, linear state-transition diagram for the uuencode filter.
+ *
+ * If the character being processed is within the range of [a, b]
+ * for the current state then we transition next_if_match
+ * state. If not, we transition to the next_if_not_match state.
+ *
+ * The final two states are special in that they are the states in
+ * which we discard data. */
+static const int first_uuencode_skipping_state = 11;
+static const scanner_state_t uuencode_states[] = {
+ {0, 'b', 'b', 1, 0},
+ {1, 'e', 'e', 2, 0},
+ {2, 'g', 'g', 3, 0},
+ {3, 'i', 'i', 4, 0},
+ {4, 'n', 'n', 5, 0},
+ {5, ' ', ' ', 6, 0},
+ {6, '0', '7', 7, 0},
+ {7, '0', '7', 8, 0},
+ {8, '0', '7', 9, 0},
+ {9, ' ', ' ', 10, 0},
+ {10, '\n', '\n', 11, 10},
+ {11, 'M', 'M', 12, 0},
+ {12, ' ', '`', 12, 11}
+};
+
/* Oh, how I wish that gobject didn't require so much noisy boilerplate!
* (Though I have at least eliminated some of the stock set...) */
typedef struct _NotmuchFilterDiscardNonTerm NotmuchFilterDiscardNonTerm;
@@ -57,6 +91,8 @@ typedef struct _NotmuchFilterDiscardNonTermClass NotmuchFilterDiscardNonTermClas
struct _NotmuchFilterDiscardNonTerm {
GMimeFilter parent_object;
int state;
+ int first_skipping_state;
+ const scanner_state_t *states;
};
struct _NotmuchFilterDiscardNonTermClass {
@@ -111,41 +147,13 @@ filter_filter (GMimeFilter *gmime_filter, char *inbuf, size_t inlen, size_t pres
char **outbuf, size_t *outlen, size_t *outprespace)
{
NotmuchFilterDiscardNonTerm *filter = (NotmuchFilterDiscardNonTerm *) gmime_filter;
+ const scanner_state_t *states = filter->states;
register const char *inptr = inbuf;
const char *inend = inbuf + inlen;
char *outptr;
(void) prespace;
- /* Simple, linear state-transition diagram for our filter.
- *
- * If the character being processed is within the range of [a, b]
- * for the current state then we transition next_if_match
- * state. If not, we transition to the next_if_not_match state.
- *
- * The final two states are special in that they are the states in
- * which we discard data. */
- static const struct {
- int state;
- int a;
- int b;
- int next_if_match;
- int next_if_not_match;
- } states[] = {
- {0, 'b', 'b', 1, 0},
- {1, 'e', 'e', 2, 0},
- {2, 'g', 'g', 3, 0},
- {3, 'i', 'i', 4, 0},
- {4, 'n', 'n', 5, 0},
- {5, ' ', ' ', 6, 0},
- {6, '0', '7', 7, 0},
- {7, '0', '7', 8, 0},
- {8, '0', '7', 9, 0},
- {9, ' ', ' ', 10, 0},
- {10, '\n', '\n', 11, 10},
- {11, 'M', 'M', 12, 0},
- {12, ' ', '`', 12, 11}
- };
int next;
g_mime_filter_set_size (gmime_filter, inlen, FALSE);
@@ -162,7 +170,7 @@ filter_filter (GMimeFilter *gmime_filter, char *inbuf, size_t inlen, size_t pres
next = states[filter->state].next_if_not_match;
}
- if (filter->state < 11)
+ if (filter->state < filter->first_skipping_state)
*outptr++ = *inptr;
filter->state = next;
@@ -220,6 +228,8 @@ notmuch_filter_discard_non_term_new (void)
filter = (NotmuchFilterDiscardNonTerm *) g_object_newv (type, 0, NULL);
filter->state = 0;
+ filter->states = uuencode_states;
+ filter->first_skipping_state = first_uuencode_skipping_state;
return (GMimeFilter *) filter;
}
--
2.11.0
More information about the notmuch
mailing list