char *bmMatch(char *text, int len, char *pattern, int patlen, int *skip, int *next) { int i, j; i = patlen - 1; while (i < len) { j = patlen - 1; while (j >= 0 && text[i] == pattern[j]) { i--; j--; } if (j < 0) return text + i + 1; if (skip[text[i] & 0x00ff] >= next[j]) i += skip[text[i] & 0x00ff]; else i += next[j]; } return NULL; } int bmSkip(int *skip, int slen, char *pattern, int patlen) { int j; if (slen < 256) return -1; for (j = 0; j < 256; j++) skip[j] = patlen; for (j = 0; j < patlen - 1; j++) skip[pattern[j] & 0x00ff] = patlen-1-j; return 0; } int bmNext(int *next, int nlen, char *pattern, int patlen) { int j, k, s; int *g; if (nlen < patlen) return -1; if ((g = (int *)malloc(sizeof(int)*patlen)) == NULL) return -1; for (j = 0; j < patlen; j++) next[j] = 2*patlen - 1 - j; j = patlen; for (k = patlen - 1; k >= 0; k--) { g[k] = j; while (j != patlen && pattern[j] != pattern[k]) { next[j] = (next[j] <= patlen-1-k) ? next[j] : patlen-1-k; j = g[j]; } j--; } s = j; for (j = 0; j < patlen; j++) { next[j] = (next[j] <= s+patlen-j) ? next[j] : s+patlen-j; if (j >= s) s = g[s]; } free(g); return 0; }