view example/bm_search/main.cc @ 2064:f786ffb2a198 draft

add bm.h
author Nozomi
date Wed, 17 Feb 2016 17:37:06 +0900
parents 455e620ad2b2
children 53643db3f0f9
line wrap: on
line source

#include <stdio.h>
#include <string.h>
#include <sys/time.h>
#include "TaskManager.h"
#include "SchedTask.h"
#include "Func.h"
#include "FileMapReduce.h"
#include "bm.h"

/* ;TODO
 * PS3でCPU数が2以上の時に、あまりが計算されてない
 */

extern void task_init();
void TMend(TaskManager *);
static double st_time;
static double ed_time;
const char* usr_help_str = "";

static double
getTime() {
    struct timeval tv;
    gettimeofday(&tv, NULL);
    return tv.tv_sec + (double)tv.tv_usec*1e-6;
}

//Boyer Moore法に使用するテーブルを作成
static void
create_BMskiptable(BMPtr bm)
{
    for (int i = 0; i < 256; ++i) {
        bm->skip_table[i] = bm->search_word_len;
    }

    for (int j = 0; j < bm->search_word_len - 1; ++j) {
        bm->skip_table[bm->search_word[j]] = bm->search_word_len - j - 1;
    }
}

int
TMmain(TaskManager *manager, int argc, char *argv[])
{

    char *filename = 0;
    FileMapReduce *fmp = new FileMapReduce(manager,TASK_EXEC,TASK_EXEC_DATA_PARALLEL,TASK_PRINT);
    filename = fmp->init(argc, argv);
    BMPtr bm = new BM;
    bm->search_word = NULL;
    bm->next = NULL;
    bm->skip_table = (int*)malloc(sizeof(int)*256);
    BM dummy;
    dummy.next = NULL;
    BMPtr *b = &dummy.next;
    for (int i = 1; i < argc; i++) {
        if (strcmp(argv[i],"-sw") == 0) {
            BMPtr bm = *b = new BM;
            bm->search_word = (unsigned char*)argv[i+1]; i++;
            bm->search_word_len = strlen((const char*)bm->search_word);
            create_BMskiptable(bm);
            bm->next = NULL;
            b = &bm->next;
        }
    }
    BMPtr bmp = dummy.next;
    if (filename < 0 || bmp == NULL) {
        return -1;
    }
    fmp->w->global = (void*)bmp;
    fmp->division_out_size = sizeof(unsigned long long);
    task_init();
    st_time = getTime();
    fmp->run_start(manager, filename);
    manager->set_TMend(TMend);
    return 0;
}

void
TMend(TaskManager *manager)
{
    ed_time = getTime();
    printf("Time: %0.6f\n",ed_time-st_time);
}

/* end */