view regexParser/cerium/ppe/Exec.cc @ 266:e51cac73e42a

CeriumGrep start
author masa
date Thu, 28 Jan 2016 21:14:34 +0900
parents
children 6640b0d5bf13
line wrap: on
line source

#include <stdio.h>
#include <string.h>
#include "Exec.h"
#include "Func.h"

/* これは必須 */
SchedDefineTask1(Exec,blockedGrep);

TSValue stateNothing(TSValue tsv) {
    return tsv;
}

TSValue stateSkip(TSValue tsv) {
    tsv.buff.matchBegin = tsv.buff.buffptr;
    return tsv;
}

TSValue stateMatch(TSValue tsv) {
    ResultPtr r = NEW(Result);
    r->begin = tsv.buff.matchBegin;
    r->end = tsv.buff.buffptr;
    *tsv.resultEnd = r;
    r->next = NULL;
    tsv.resultEnd = &r->next;
    tsv.current = tsv.tg->stateList->tState;
    tsv.buff.buffptr--;
    tsv = stateSkip(tsv);
    return tsv;
}

TSValue threadedSearch(TransitionGeneratorPtr tg,Buffer buff) {
    TSValue tsv;
    tsv.buff = buff;
    tsv.tg = tg;
    tsv.result = NULL;
    tsv.resultEnd = &tsv.result;
    tsv.current = generateTState(tg->anyState);
    tsv.tg->stateSkip = stateSkip;
    tsv.tg->stateMatch = stateMatch;
    tsv.tg->stateNothing = stateNothing;
    unsigned char *end = buff.buffend;
    buff.buffend = buff.buff+1;
    tSearch(tsv);
    tsv.blockBegin = tsv.current;
    buff.buffend = end;
    tSearch(tsv);
    tsv.blockEnd = tsv.current;
    if (tsv.blockEnd->bi.bitContainer != 1) {
        ResultPtr r = NEW(Result);
        r->begin = tsv.buff.matchBegin;
        r->end = NULL;
        *tsv.resultEnd = r;
        r->next = NULL;
        tsv.resultEnd = &r->next;
    }
    return tsv;
}

static int
blockedGrep(SchedTask *s, void *rbuf, void *wbuf)
{
    long task_spwaned = (long)s->get_param(0);
    long division_size = (long)s->get_param(1);
    long length = (long)s->get_param(2);
    long out_size = (long)s->get_param(3);
    MapReduce *w = (MapReduce*)s->get_param(4);
    long allocation = task_spwaned + (long)s->x;
    char* i_data;
    unsigned long long* o_data;
    if (division_size) {
        i_data = (char*)s->get_input(rbuf,0) + allocation*division_size;
        o_data = (unsigned long long*)s->get_output(wbuf,1) + allocation*out_size;
    } else {
        i_data = (char*)s->get_input(0);
        o_data = (unsigned long long*)s->get_output(0);
    }
    TransitionGeneratorPtr tg = (TransitionGeneratorPtr)w->global;
    StatePtr startState = tg->anyState;
    Buffer buff;
    buff.buff = buff.buffptr = buff.matchBegin = i_data;
    buff.buffend = buff.buff + division_size;
    TSValue tsv = threadedSearch(tg,buff);
    o_data[0] = (void*)tsv.result;
    o_data[1] = (void*)tsv.blockBegin;
    o_data[2] = (void*)tsv.blockEnd;
    return 0;
}