#include #include #include long cmps=0; int bruteforce(char* text, char* subst) { int tlen=strlen(text); int flen=strlen(subst); cmps=0; for (int i=0; i<(tlen-flen); i++) { cmps++; int k=0; while (ksiz-1) { siz += sizInc; cc = realloc(cc, siz); } dd=&(cc[ccount]); *dd = ch; dd++; ccount++; //cc[ccount++]=ch; } cc[ccount]='\0'; printf("read %d chars (%d)\n", ccount, strlen(cc)); return cc; } int boyermoore(char* text, char* subst) { int map[128] = {-1}; int tlen=strlen(text); int flen=strlen(subst); for (int i=0; i0) printf("BM last %c %d\n", i, map[i]); } #endif int i=flen-1; int k=flen-1; cmps=0; while (i < tlen) { cmps++; if (subst[k]=='.' || text[i]==subst[k]) { if (k==0) { return i; } i--; k--; } else { i += flen - (k<(1+map[text[i]]) ? k : (1+map[text[i]])); k = flen-1; } } return -1; } int* buildfail(char* subst) { int flen=strlen(subst); int* fail = malloc(flen*sizeof(int)); int j=1; int k=0; for (int i=0; i0) { k=fail[k-1]; } else { j++; } } #ifdef DEBUG for (int i=0; i0) { k=fail[k-1]; } else { j++; } } free(fail); return -1; } int main(int argc, char* argv[]) { char* text = readfile(argv[1]); char* subst = argv[2]; int ii = bruteforce(text, subst); if (ii>=0) { printf("MM Found at %d %d ", ii, cmps); for (int j=0; j=0) { printf("BM Found at %d %d ", ii, cmps); for (int j=0; j=0) { printf("KMP Found at %d %d ", ii, cmps); for (int j=0; j