view regexParser/CeriumGrep.cc @ 293:948428caf616

NFA maximum match worked
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Tue, 02 Feb 2016 10:38:45 +0900
parents 3a95be4a5bb0
children bdfe0a32c48f
line wrap: on
line source

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include "CeriumGrep.h"
#include "subsetConstruction.h"
#include "node.h"
#include "grepWalk.h"
#include "fileread.h"
#include "threadedSearch.h"

Search grep(int argc,char **argv,bool parallel)
{
    bool generate = true;
    bool subset = false;
    bool generateSequentialSearch = false;
    bool ts = false;
    char *filename = NULL;
    Search s;
    s.filename = 0;
    s.tg = NULL;

    RegexInfo ri;
    ri.stateNumber = 1;
    for (int i = 1; i < argc; i++) {
        if (strcmp(argv[i],"-regex") == 0) {
            ri.ptr = (unsigned char*)argv[i+1]; i++;
        } else if (strcmp(argv[i],"-noGeneration") == 0) {
            generate = false;
        } else if (strcmp(argv[i],"-subset") == 0) {
            subset = true;
        } else if (strcmp(argv[i],"-seq") == 0) {
            generateSequentialSearch = true;
        } else if (strcmp(argv[i],"-file") == 0) {
            s.filename = filename = argv[i+1]; i++;
        } else if (strcmp(argv[i],"-ts") == 0) {
            ts = true;
        }
    }
    if (!ri.ptr) return s;

    printf("regex : %s\n",ri.ptr);
    NodePtr n = regex(&ri);   // parse only
    printTree(n);

    TGValue tgv;
    if (generate && !subset)  {  // NFA generation
        tgv = generateTransitionList(n);
        printTree(n);
        printState(tgv.tg);
        if (generateSequentialSearch) {
            exportState(tgv.tg);
        }
    } else if (subset)  {
        tgv = generateTransitionList(n);
        subsetConstruction(tgv.tg);   // Determinization
        printState(tgv.tg);
        if (generateSequentialSearch) {
            exportState(tgv.tg);
        }
    }

    if (filename != NULL && !parallel) {
        int fd = 0;
        st_mmap_t st_mmap = createSt_mmap(filename,fd);
        Buffer buff = createBuffer(st_mmap);
        if (ts) threadedSearch(tgv.tg,buff);
        else grepWalk(tgv.tg,buff.buffptr,buff);
        close(fd);
    }

    s.tg = tgv.tg;
    return s;
}