Date: Sun, 3 Jul 2011 15:27:20 +0000 (UTC) From: Gabor Kovesdan <gabor@FreeBSD.org> To: src-committers@freebsd.org, svn-src-user@freebsd.org Subject: svn commit: r223737 - user/gabor/tre-integration/contrib/tre/lib Message-ID: <201107031527.p63FRK1Z023540@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: gabor Date: Sun Jul 3 15:27:20 2011 New Revision: 223737 URL: http://svn.freebsd.org/changeset/base/223737 Log: - Finish single-byte, multi-byte and wide character support bits Modified: user/gabor/tre-integration/contrib/tre/lib/fastmatch.c user/gabor/tre-integration/contrib/tre/lib/regexec.c Modified: user/gabor/tre-integration/contrib/tre/lib/fastmatch.c ============================================================================== --- user/gabor/tre-integration/contrib/tre/lib/fastmatch.c Sun Jul 3 13:27:23 2011 (r223736) +++ user/gabor/tre-integration/contrib/tre/lib/fastmatch.c Sun Jul 3 15:27:20 2011 (r223737) @@ -269,7 +269,7 @@ tre_fastexec(const fastmatch_t *fg, cons int cnt = 0; int ret = REG_NOMATCH; const char *str_byte = data; - const void *startptr; + const void *startptr = NULL; #ifdef TRE_WCHAR const wchar_t *str_wide = data; #endif @@ -334,14 +334,34 @@ tre_fastexec(const fastmatch_t *fg, cons break; #ifdef TRE_WCHAR { - int k, r; - - r = hashtable_get(fg->qsBc, &data[j - fg->len - 1], &k); + int k, r = -1; + wint_t wc; + const char *ch; + const wchar_t *ws; + + SKIP_CHARS(j - fg->len - 1); + switch (type) + { + case STR_BYTE: + case STR_MBS: + ch = startptr; + mbrtowc(&wc, ch, MB_CUR_MAX, NULL); + r = hashtable_get(fg->qsBc, &wc, &k); + break; + case STR_WIDE: + ws = startptr; + r = hashtable_get(fg->qsBc, ws, &k); + break; + default: + /* XXX */ + break; + } k = (r == 0) ? k : fg->defBc; - j -= k; + j += k; } #else - j -= fg->qsBc[data[j - fg->len - 1]]; + SKIP_CHARS(j - fg->len - 1); + j += fg->qsBc[startptr[0]]; #endif } while (j >= fg->len); } else { @@ -369,14 +389,34 @@ tre_fastexec(const fastmatch_t *fg, cons break; #ifdef TRE_WCHAR { - int k, r; - - r = hashtable_get(fg->qsBc, &data[j + fg->len], &k); + int k, r = -1; + wint_t wc; + const char *ch; + const wchar_t *ws; + + SKIP_CHARS(j + fg->len); + switch (type) + { + case STR_BYTE: + case STR_MBS: + ch = startptr; + mbrtowc(&wc, ch, MB_CUR_MAX, NULL); + r = hashtable_get(fg->qsBc, &wc, &k); + break; + case STR_WIDE: + ws = startptr; + r = hashtable_get(fg->qsBc, ws, &k); + break; + default: + /* XXX */ + break; + } k = (r == 0) ? k : fg->defBc; j += k; } #else - j += fg->qsBc[data[j + fg->len]]; + SKIP_CHARS(j + fg->len); + j += fg->qsBc[startptr[0]]; #endif } while (j <= (len - fg->len)); } Modified: user/gabor/tre-integration/contrib/tre/lib/regexec.c ============================================================================== --- user/gabor/tre-integration/contrib/tre/lib/regexec.c Sun Jul 3 13:27:23 2011 (r223736) +++ user/gabor/tre-integration/contrib/tre/lib/regexec.c Sun Jul 3 15:27:20 2011 (r223737) @@ -158,7 +158,7 @@ tre_match(const tre_tnfa_t *tnfa, const /* Check if we can cheat with a fixed string */ if (shortcut != NULL) - return tre_fastexec(shortcut, string, len, nmatch, pmatch); + return tre_fastexec(shortcut, string, len, type, nmatch, pmatch); if (tnfa->num_tags > 0 && nmatch > 0) {
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201107031527.p63FRK1Z023540>