svn commit: r231825 - user/gabor/tre-integration/contrib/tre/lib
Gabor Kovesdan
gabor at FreeBSD.org
Thu Feb 16 14:54:51 UTC 2012
Author: gabor
Date: Thu Feb 16 14:54:51 2012
New Revision: 231825
URL: http://svn.freebsd.org/changeset/base/231825
Log:
- Implement compilation of multiple patterns for heuristic matching
Modified:
user/gabor/tre-integration/contrib/tre/lib/mregcomp.c
Modified: user/gabor/tre-integration/contrib/tre/lib/mregcomp.c
==============================================================================
--- user/gabor/tre-integration/contrib/tre/lib/mregcomp.c Thu Feb 16 14:54:20 2012 (r231824)
+++ user/gabor/tre-integration/contrib/tre/lib/mregcomp.c Thu Feb 16 14:54:51 2012 (r231825)
@@ -48,19 +48,88 @@ __weak_reference(tre_mregfree, mregfree)
/* TODO:
*
- * - compilation
* - REG_ICASE
* - Test
*/
int
-tre_mcompile(mregex_t *preg, size_t nr, const char *regex[],
- size_t n[], int cflags)
+tre_mcompile(mregex_t *preg, size_t nr, const tre_char_t *wregex[],
+ size_t wn[], int cflags)
{
+ int ret;
+ size_t mfrag = 0;
+ tre_char_t **frags;
+ size_t *siz;
+ wmsearch_t *wm;
+
+ preg->k = nr;
+ preg->patterns = xmalloc(nr * sizeof(regex_t));
+ if (!preg->patterns)
+ return REG_ESPACE;
+
+ for (int i = 0; i < nr; i++)
+ {
+ ret = tre_compile_nfa(&preg->patterns[i], wregex[i], wn[i], cflags);
+ if (ret != REG_OK)
+ goto err;
+ ret = tre_compile_heur(&preg->patterns[i], wregex[i], wn[i], cflags);
+ if (ret != REG_OK)
+ goto err;
+ }
+
+ for (mfrag = 0; mfrag < nr; mfrag++)
+ for (int j = 0; j < nr; j++)
+ if (((heur_t)preg->patterns[j]->heur)->arr[mfrag] == NULL)
+ goto out;
+out:
+
+ preg->mfrag = mfrag;
+
+ /* Worst case, not all patterns have a literal prefix */
+ if (mfrag == 0)
+ return REG_OK;
+
+ wm = xmalloc(mfrag * sizeof(wmsearch_t));
+ if (!wm)
+ goto err;
+
+ frags = xmalloc(nr * sizeof(char *));
+ if (!frags)
+ goto err;
+
+ siz = xmalloc(nr * sizeof(size_t));
+ // XXX: check NULL
- // TODO: Get heuristics and then use Wu-Manber
+ for (int i = 0; i < mfrag; i++)
+ {
+ for (int j = 0; j < nr; j++)
+ {
+ frags[j] = &((heur_t)preg->patterns[j]->heur)->arr[i];
+ siz[j] = ((heur_t)preg->patterns[j]->heur)->siz[i];
+ }
+ ret = tre_wmcomp(&wm[i], nr, frags, siz, cflags);
+ if (ret != REG_OK)
+ goto err;
+ }
+
+ preg->searchdata = wm;
return REG_OK;
+
+err:
+ if (preg->patterns)
+ xfree(preg->patterns);
+ if (wm)
+ {
+ for (int i = 0; i < mfrag; i++)
+ tre_wmfree(&wm[i]);
+ xfree(wm);
+ }
+ if (frags)
+ xfree(frags);
+ if (siz)
+ xfree(siz);
+ return ret;
}
int
More information about the svn-src-user
mailing list