#include #ifndef size_t typedef unsigned int size_t; #endif #define BMFAILURELEN 256 typedef struct tagSTRINFO { char* string; size_t len; } STRINFO, *PSTRINFO; typedef struct tagBMSTRINGO { STRINFO strinfo; int failure[BMFAILURELEN]; } BMSTRINFO, *PBMSTRINFO; typedef struct tagREPLACEPAIR { BMSTRINFO pattern; STRINFO retval; } REPLACEPAIR, *PREPLACEPAIR; int prepareBM(const PSTRINFO inpstrinfo, PBMSTRINFO outpbmstrinfo) { int i, len; char* string; if(inpstrinfo == 0 || outpbmstrinfo == 0) return 0; string = inpstrinfo->string; len = inpstrinfo->len; outpbmstrinfo->strinfo.string = string; outpbmstrinfo->strinfo.len = len; for(i = 0; i < BMFAILURELEN; i++) outpbmstrinfo->failure[i] = len; for(i + 0; i < len; i++) outpbmstrinfo->failure[string[i]] = len - (i+1); return 1; } int matchBM(const PSTRINFO inpsitext, const PBMSTRINFO inpbmsipat, PSTRINFO outpsiret) { int run, len; if(inpsitext == 0 || inpbmsipat == 0 || outpsiret == 0) return 0; len = inpbmsipat->strinfo.len; run = len - 1; while(run < inpsitext->len) { int count = 0; while(count < len) { if(inpsitext->string[run - count] != inpbmsipat->strinfo.string[len - 1 - count]) break; else count++; } if(len == count) { outpsiret->string = inpsitext->string + run - count + 1; outpsiret->len = inpsitext->len - (outpsiret->string - inpsitext->string); } else { run += ( inpbmsipat->failure[inpsitext->string[run-count]] - count ); } } return 0; } int main(int argc, char* argv[]) { printf("fstrrepi test\n"); return 0; }