staticint subpattern(u8 *pattern, int i, int j, int g)
{ int x = i+g-1, y = j+g-1, ret = 0;
while(pattern[x--] == pattern[y--]) { if (y < 0) {
ret = 1; break;
} if (--g == 0) {
ret = pattern[i-1] != pattern[j-1]; break;
}
}
return ret;
}
staticvoid compute_prefix_tbl(struct ts_bm *bm, int flags)
{ int i, j, g;
for (i = 0; i < ASIZE; i++)
bm->bad_shift[i] = bm->patlen; for (i = 0; i < bm->patlen - 1; i++) {
bm->bad_shift[bm->pattern[i]] = bm->patlen - 1 - i; if (flags & TS_IGNORECASE)
bm->bad_shift[tolower(bm->pattern[i])]
= bm->patlen - 1 - i;
}
/* Compute the good shift array, used to match reocurrences
* of a subpattern */
bm->good_shift[0] = 1; for (i = 1; i < bm->patlen; i++)
bm->good_shift[i] = bm->patlen; for (i = bm->patlen-1, g = 1; i > 0; g++, i--) { for (j = i-1; j >= 1-g ; j--) if (subpattern(bm->pattern, i, j, g)) {
bm->good_shift[g] = bm->patlen-j-g; break;
}
}
}
staticstruct ts_config *bm_init(constvoid *pattern, unsignedint len,
gfp_t gfp_mask, int flags)
{ struct ts_config *conf; struct ts_bm *bm; int i; unsignedint prefix_tbl_len = len * sizeof(unsignedint);
size_t priv_size = sizeof(*bm) + len + prefix_tbl_len;
conf = alloc_ts_config(priv_size, gfp_mask); if (IS_ERR(conf)) return conf;
conf->flags = flags;
bm = ts_config_priv(conf);
bm->patlen = len;
bm->pattern = (u8 *) bm->good_shift + prefix_tbl_len; if (flags & TS_IGNORECASE) for (i = 0; i < len; i++)
bm->pattern[i] = toupper(((u8 *)pattern)[i]); else
memcpy(bm->pattern, pattern, len);
compute_prefix_tbl(bm, flags);
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.