changeset 226:b4022ba23de5

add sequentialSearch
author Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
date Fri, 15 Jan 2016 17:53:11 +0900
parents 0c28ff35b4f0
children 8be58af605da
files regexParser/generateSequentialSearch.cc regexParser/sequentialSearch.cc
diffstat 2 files changed, 72 insertions(+), 21 deletions(-) [+]
line wrap: on
line diff
--- a/regexParser/generateSequentialSearch.cc	Fri Jan 15 16:47:03 2016 +0900
+++ b/regexParser/generateSequentialSearch.cc	Fri Jan 15 17:53:11 2016 +0900
@@ -6,28 +6,29 @@
 void exportState(TransitionGeneratorPtr tg) {
     StatePtr state = tg->stateList;
     FILE *fp = fopen("state.cc","w");
-    fputs("unsigned char *buff, *buffptr, buffend;\n",fp);
-    fputs(
-"void stateSkip() {\n"
-"    matchBegin = buffptr;\n"
-"    state1();\n"
-"}\n"
-"\n"
-"void stateMatch() {\n"
-"    fwrite(matchBegin,buffptr-matchBegin,1,fp);\n"
-"    fputs(\"\\n\");\n"
-"    stateSkip();\n"
-"}\n"
-        ,fp);
     for (;state;state = state->next) {
         fprintf(fp,"void state%lx();\n",state->bitState.bitContainer);
     }
+
+    fputs(
+"void stateSkip(BufferList buff) {\n"
+"    buff.matchBegin = buff.buffptr;\n"
+"    state1(buff);\n"
+"}\n"
+"\n"
+"void stateMatch(BufferList buff) {\n"
+"    fwrite(buff.matchBegin,buff.buffptr-buff.matchBegin,1,stdout);\n"
+"    puts(\"\\n\");\n"
+"    stateSkip(buff);\n"
+"}\n"
+        ,fp);
     fputs("\n",fp);
-    for (;state;state = state->next) {
-        fprintf(fp,"void state%lx() {\n",state->bitState.bitContainer);
+    for (state = tg->stateList;state;state = state->next) {
+        fprintf(fp,"void state%lx(BufferList buff) {\n",state->bitState.bitContainer);
         if (state->bitState.bitContainer == 2) { // Accept
-            fputs("    // Accept\n",fp);
+            fputs("    stateMatch(buff);\n",fp);
         } else {  // not Accept
+            fputs("    if (buff.buffptr >= buff.buffend) return;\n",fp);
             fputs("    unsigned char c = *buffptr++;\n",fp);
             CharClassWalkerPtr ccw = createCharClassWalker(state->cc);
             bool flag = true;
@@ -42,16 +43,16 @@
                     fputs("    else ",fp);
                 }
                 if (begin == end) {
-                    fprintf(fp,"    if (c=='%c') state%lu();\n",(unsigned char)begin, bi.bitContainer);
+                    fprintf(fp,"    if (c=='%c') state%lx(buff);\n",(unsigned char)begin, bi.bitContainer);
                 } else {
-                    fprintf(fp,"    if (c<'%c') state1();\n",(unsigned char)begin);
-                    fprintf(fp,"    else if (c<='%c') state%lu();\n",(unsigned char)end, bi.bitContainer);
+                    fprintf(fp,"    if (c<'%c') stateSkip(buff);\n",(unsigned char)begin);
+                    fprintf(fp,"    else if (c<='%c') state%lx(buff);\n",(unsigned char)end, bi.bitContainer);
                 }
             }
             if (state->bitState.bitContainer == 2) {
-                fprintf(fp,"    else stateMatch();\n");
+                fprintf(fp,"    else stateMatch(buff);\n");
             } else {
-                fprintf(fp,"    else stateSkip();\n");
+                fprintf(fp,"    else stateSkip(buff);\n");
             }
         }
         fputs("}\n\n",fp);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/regexParser/sequentialSearch.cc	Fri Jan 15 17:53:11 2016 +0900
@@ -0,0 +1,50 @@
+#include <stdio.h>
+#include <string.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <sys/stat.h>
+#include <sys/mman.h>
+#include <sys/types.h>
+
+typedef struct bufferList {
+    unsigned char buff;
+    unsigned char buffptr;
+    unsigned char buffend;
+    unsigned char matchBegin;
+} BufferList, *BufferListPtr;
+
+typedef struct {
+    caddr_t file_mmap;
+    off_t size;
+} st_mmap_t;
+
+#include "state.cc"
+int main(int argc, char **argv) {
+    char *filename;
+    for (int i = 1; i < argc; i++) {
+        if (strcmp(argv[i],"-file") == 0) {
+            filename = argv[i+1]; i++;
+        }
+    }
+
+    int map = MAP_PRIVATE;
+    st_mmap_t st_mmap;
+    struct stat sb;
+    int fd;
+    if ((fd=open(filename,O_RDONLY,0666))==0) {
+        fprintf(stderr,"can't open %s\n",filename);
+    }
+
+    if (fstat(fd,&sb)) {
+        fprintf(stderr,"can't fstat %s\n",filename);
+    }
+    st_mmap.size = sb.st_size;
+    unsigned char *file_mmap = mmap(NULL,st_mmap.size,PROT_WRITE|PROT_READ,map,fd,(off_t)0);
+
+    BufferList buff;
+    buff.buff = buff.buffptr = buff.matchBegin = file_mmap;
+    buff.buffend = buff.buff + st_mmap.size;
+    stateSkip(buff);
+    close(fd);
+    return 0;
+}