diff regexParser/cerium/ppe/Print.cc @ 302:27414e6fb33c

retrying blocked search fix for CbC support
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Mon, 08 Feb 2016 08:59:38 +0900
parents c5a7caa37f61
children cc770cd8d000
line wrap: on
line diff
--- a/regexParser/cerium/ppe/Print.cc	Thu Feb 04 03:26:18 2016 +0900
+++ b/regexParser/cerium/ppe/Print.cc	Mon Feb 08 08:59:38 2016 +0900
@@ -5,11 +5,22 @@
 #include "FileMapReduce.h"
 #include "regexParser.h"
 #include "CeriumMain.h"
+#include "threadedSearch.h"
 
 #define STATUS_NUM 2
 /* これは必須 */
 SchedDefineTask1(Print,run_print);
 
+static
+TSValue stateSkipOnce(TSValue tsv) {
+    if (tsv.matchEnd) {
+        addResult(tsv,false,tsv.matchBegin,tsv.matchEnd);
+    }
+    tsv.buff.buffend = tsv.buff.buffptr;    // end search
+    return tsv;
+}
+
+
 static int
 run_print(SchedTask *s, void *rbuf, void *wbuf)
 {
@@ -20,6 +31,10 @@
     ResultPtr prev = NULL;
     for (int i = 0; i < out_task_num ; i++) {
         ResultPtr r = (ResultPtr)w->o_data[i*out_size+0];
+        //  first reply contains block begin and block end
+        unsigned char *begin = r->begin;
+        unsigned char *end = r->end;
+        r = r->next;
         if (r == NULL) {
             prev = NULL;
             continue;
@@ -35,13 +50,27 @@
 fwrite(r->begin,r->end - r->begin-1,1,stdout);
 printf(" match %d\n", ((prevBlockEnd->bitState.bitContainer & ~blockBegin->bitState.bitContainer)==0)? 1 : 0  );
 #endif
-            if ((prevBlockEnd->bitState.bitContainer & ~blockBegin->bitState.bitContainer)==0) {
-                // 前のブロックの matchBegin から最初 result の end までがマッチ
-                fwrite(prev->begin,r->end - prev->begin,1,stdout);
-// printf("####");
-                if (!r->continued) puts("");
+            if (prevBlockEnd->bitState.bitContainer !=1) {
+                // そこから最初の stateSkip までやり直し。マッチしたら表示。
+                TransitionGeneratorPtr tg = (TransitionGeneratorPtr)w->global;
+                tg->stateSkip = stateSkipOnce;
+                Buffer buff;
+                buff.buff = buff.buffptr  = begin;
+                buff.buffend = end;
+                TSValue tsv = createTSValue(tg,buff);
+                BlockOutput blk;
+                tsv.blk = &blk;
+                tsv.current = prevBlockEnd->tState;
+                tsv.blk->result = NULL;
+                ResultPtr result = NULL;
+                tsv.blk->resultEnd = &result;
+                tsv.matchBegin = prev->begin;
+                tsv.matchEnd = prev->end;
+                tsv = tSearch(tsv);
+                if (result) {
+                    resultPrint(prev->next,"Print");
+                }
             }
-            r = r->next;
 // printf("%p\n",r);
         } else {
             if ((blockBegin->bitState.bitContainer & 1)!=1) r = r->next;