view regex/main.cc @ 41:e1c5ecbf8836

add bmsearch.cc
author Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
date Mon, 02 Mar 2015 23:35:10 +0900
parents c25b75f764a7
children cdb4fd81c31f
line wrap: on
line source

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <math.h>
#include <string.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
#include "regex.h"

const char *usr_help_str = "Usage: ./regex [-file filename] [-sw SearchWord]\n";
extern int *createBMskiptable(BMDataPtr);
extern void *BMmethod(BMDataPtr,ResultPtr);

int main(int argc, char* argv[]) {

    char *filename = 0;
    char *searchWord = 0;

    // check argument
    for (int i = 0; argv[i]; i++) {
        if (strcmp(argv[i], "-file") == 0) {
            filename = (char*)argv[i+1]; i++;
        }else if (strcmp(argv[i], "-sw") == 0) {
            searchWord = (char*)argv[i+1]; i++;
        }
    }

    // prepare file read
    if (filename == 0) {
        puts(usr_help_str);
        exit(1);
    }

    struct stat sb;
    long fd = 0;
    char *textfile;

    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);
    }

    BMDataPtr bmdata = (BMDataPtr)malloc(sizeof(BMData));

    textfile = (char*)malloc(sb.st_size);
    read(fd,textfile,sb.st_size);

    bmdata->readText = textfile;
    bmdata->readTextLen = sb.st_size;
    bmdata->skipTable = (int*)malloc(sizeof(int)*256);

    if (textfile == (char*)-1) {
        fprintf(stderr,"Can't mmap file\n");
        perror(NULL);
        exit(0);
    }

    // prepare Boyer Moore Search
    bmdata->searchWord = searchWord;
    bmdata->searchWordLen = strlen((const char*)bmdata->searchWord);
    bmdata->skipTable = createBMskiptable(bmdata);

    ResultPtr result = (ResultPtr)malloc(sizeof(Result));

    BMmethod(bmdata,result);

    printf("sword: %s len: %d\n",bmdata->searchWord,bmdata->searchWordLen);
    printf("Match : %d\n",result->matchNum);

    free(result);
    free(bmdata);
    return 0;
}