Mercurial > hg > Game > Cerium
view example/regex_mas/ppe/Exec.cc @ 1761:b98e23499add draft
refactoring in regex_mas
author | Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp> |
---|---|
date | Fri, 22 Nov 2013 22:48:05 +0900 |
parents | 11d3bd9d2244 |
children | 39734c8cbcfe |
line wrap: on
line source
#include <stdio.h> #include <string.h> #include "Exec.h" #include "Func.h" #include "SchedTask.h" #define max(a,b)((a)>(b)?a:b) /* これは必須 */ SchedDefineTask(Exec); //ボイヤームーア法による文字列検索アルゴリズム static int BM_method(unsigned char *text,int text_length, unsigned char *pattern,int sw_len) { int skip[256]; int text_len = (long int)text_length; int pattern_len = sw_len; int i = 0; int match_counter = 0; for (i = 0; i < 256; ++i){ skip[i] = pattern_len; } for (i = 0; i < pattern_len-1 ; ++i){ skip[(int)pattern[i]] = pattern_len - i - 1; } i = pattern_len - 1; while ( i < text_len){ int j = pattern_len - 1; while (text[i] == pattern[j]){ if (j == 0){ match_counter++; } --i; --j; } i = i + max((int)skip[(int)text[i]],pattern_len - j); } return match_counter; } static int run(SchedTask *s, void *rbuf, void *wbuf) { unsigned char *i_data = (unsigned char *)s->get_input(rbuf,0); unsigned char *search_word = (unsigned char*)s->get_input(rbuf,1); int length = (int)s->get_inputSize(0); int sw_len = (int)s->get_inputSize(1); //unsigned char search_word[] = "doing"; unsigned long long *o_data = (unsigned long long*)wbuf; o_data[0] = BM_method(i_data,length,search_word,sw_len); //s->printf("in Exec.cc\n"); return 0; }