svn commit: r223737 - user/gabor/tre-integration/contrib/tre/lib
Gabor Kovesdan
gabor at FreeBSD.org
Sun Jul 3 15:27:21 UTC 2011
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)
{
More information about the svn-src-user
mailing list