]> git.ipfire.org Git - thirdparty/vectorscan.git/commitdiff
nfaCheckFinalState: define return value
authorJustin Viiret <justin.viiret@intel.com>
Mon, 11 Jan 2016 04:19:09 +0000 (15:19 +1100)
committerMatthew Barr <matthew.barr@intel.com>
Tue, 1 Mar 2016 00:28:03 +0000 (11:28 +1100)
Make nfaCheckFinalState return MO_HALT_MATCHING when the user instructs
us (via the callback return value) to halt matching. In the caller,
check this value and stop matching if told.

src/nfa/gough.c
src/nfa/mcclellan.c
src/nfa/nfa_api.h
src/rose/eod.c

index 42a252e5eb6b0918879140a522f4af997c939209..c52bca065fbfcb2754de484c2666dcb7b1b6e418 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, Intel Corporation
+ * Copyright (c) 2015-2016, Intel Corporation
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions are met:
@@ -1049,15 +1049,16 @@ char nfaExecGough16_inAccept(const struct NFA *n, ReportID report,
 }
 
 static
-void goughCheckEOD(const struct NFA *nfa, u16 s,
+char goughCheckEOD(const struct NFA *nfa, u16 s,
                    const struct gough_som_info *som,
                    u64a offset, SomNfaCallback cb, void *ctxt) {
     const struct mcclellan *m = (const struct mcclellan *)getImplNfa(nfa);
     const struct mstate_aux *aux = get_aux(m, s);
 
-    if (aux->accept_eod) {
-        doReports(cb, ctxt, m, som, s, offset, 1, NULL, NULL, NULL);
+    if (!aux->accept_eod) {
+        return MO_CONTINUE_MATCHING;
     }
+    return doReports(cb, ctxt, m, som, s, offset, 1, NULL, NULL, NULL);
 }
 
 char nfaExecGough8_testEOD(const struct NFA *nfa, const char *state,
@@ -1065,8 +1066,8 @@ char nfaExecGough8_testEOD(const struct NFA *nfa, const char *state,
                           UNUSED NfaCallback callback,
                           SomNfaCallback som_callback, void *context) {
     const struct gough_som_info *som = getSomInfoConst(state);
-    goughCheckEOD(nfa, *(const u8 *)state, som, offset, som_callback, context);
-    return 0;
+    return goughCheckEOD(nfa, *(const u8 *)state, som, offset, som_callback,
+                         context);
 }
 
 char nfaExecGough16_testEOD(const struct NFA *nfa, const char *state,
@@ -1075,8 +1076,8 @@ char nfaExecGough16_testEOD(const struct NFA *nfa, const char *state,
                            SomNfaCallback som_callback, void *context) {
     assert(ISALIGNED_N(state, 8));
     const struct gough_som_info *som = getSomInfoConst(state);
-    goughCheckEOD(nfa, *(const u16 *)state, som, offset, som_callback, context);
-    return 0;
+    return goughCheckEOD(nfa, *(const u16 *)state, som, offset, som_callback,
+                         context);
 }
 
 char nfaExecGough8_queueInitState(UNUSED const struct NFA *nfa, struct mq *q) {
index 694196e6ae9e8f7868737bdd00c347f2c61b9e99..ef670a9300f9a27abe709c6797e607cbe82dd4b8 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, Intel Corporation
+ * Copyright (c) 2015-2016, Intel Corporation
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions are met:
@@ -445,14 +445,15 @@ char mcclellanExec8_i_ni(const struct mcclellan *m, u8 *state, const u8 *buf,
 }
 
 static really_inline
-void mcclellanCheckEOD(const struct NFA *nfa, u16 s, u64a offset,
+char mcclellanCheckEOD(const struct NFA *nfa, u16 s, u64a offset,
                        NfaCallback cb, void *ctxt) {
     const struct mcclellan *m = getImplNfa(nfa);
     const struct mstate_aux *aux = get_aux(m, s);
 
-    if (aux->accept_eod) {
-        doComplexReport(cb, ctxt, m, s, offset, 1, NULL, NULL);
+    if (!aux->accept_eod) {
+        return MO_CONTINUE_MATCHING;
     }
+    return doComplexReport(cb, ctxt, m, s, offset, 1, NULL, NULL);
 }
 
 static really_inline
@@ -1053,8 +1054,8 @@ char nfaExecMcClellan8_testEOD(const struct NFA *nfa, const char *state,
                                UNUSED const char *streamState,
                                u64a offset, NfaCallback callback,
                                UNUSED SomNfaCallback som_cb, void *context) {
-    mcclellanCheckEOD(nfa, *(const u8 *)state, offset, callback, context);
-    return 0;
+    return mcclellanCheckEOD(nfa, *(const u8 *)state, offset, callback,
+                             context);
 }
 
 char nfaExecMcClellan16_testEOD(const struct NFA *nfa, const char *state,
@@ -1062,8 +1063,8 @@ char nfaExecMcClellan16_testEOD(const struct NFA *nfa, const char *state,
                                 u64a offset, NfaCallback callback,
                                 UNUSED SomNfaCallback som_cb, void *context) {
     assert(ISALIGNED_N(state, 2));
-    mcclellanCheckEOD(nfa, *(const u16 *)state, offset, callback, context);
-    return 0;
+    return mcclellanCheckEOD(nfa, *(const u16 *)state, offset, callback,
+                             context);
 }
 
 char nfaExecMcClellan8_queueInitState(UNUSED const struct NFA *nfa, struct mq *q) {
index 4e31a6254ab3ba9cf62dcdc9fe8c965ae3f902fb..84a5417b5989e6abba4216a62d73e4e0611ec111 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, Intel Corporation
+ * Copyright (c) 2015-2016, Intel Corporation
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions are met:
@@ -236,6 +236,9 @@ char nfaBlockExecReverse(const struct NFA *nfa, u64a offset, const u8 *buf,
  * @param callback the callback to call for each match raised
  * @param som_cb the callback to call for each match raised (Haig)
  * @param context context pointer passed to each callback
+ *
+ * @return @ref MO_HALT_MATCHING if the user instructed us to halt, otherwise
+ *         @ref MO_CONTINUE_MATCHING.
  */
 char nfaCheckFinalState(const struct NFA *nfa, const char *state,
                         const char *streamState, u64a offset,
index 1fa2c6dccc563060a83c5e8604f5581c9b920326..93787137fd878a5efad47326d82bca97fc6ddf9f 100644 (file)
@@ -168,8 +168,12 @@ void roseCheckNfaEod(const struct RoseEngine *t, char *state,
             nfaExpandState(nfa, fstate, sstate, offset, key);
         }
 
-        nfaCheckFinalState(nfa, fstate, sstate, offset, scratch->tctxt.cb,
-                           scratch->tctxt.cb_som, scratch->tctxt.userCtx);
+        if (nfaCheckFinalState(nfa, fstate, sstate, offset, scratch->tctxt.cb,
+                               scratch->tctxt.cb_som,
+                               scratch->tctxt.userCtx) == MO_HALT_MATCHING) {
+            DEBUG_PRINTF("user instructed us to stop\n");
+            return;
+        }
     }
 }
 
@@ -213,8 +217,13 @@ void roseCheckEodSuffixes(const struct RoseEngine *t, char *state, u64a offset,
          * history buffer. */
         char rv = nfaQueueExecRose(q->nfa, q, MO_INVALID_IDX);
         if (rv) { /* nfa is still alive */
-            nfaCheckFinalState(nfa, fstate, sstate, offset, scratch->tctxt.cb,
-                               scratch->tctxt.cb_som, scratch->tctxt.userCtx);
+            if (nfaCheckFinalState(nfa, fstate, sstate, offset,
+                                   scratch->tctxt.cb, scratch->tctxt.cb_som,
+                                   scratch->tctxt.userCtx) ==
+                MO_HALT_MATCHING) {
+                DEBUG_PRINTF("user instructed us to stop\n");
+                return;
+            }
         }
     }
 }