Date: Wed, 27 Jul 2011 22:54:40 +0000 (UTC) From: Gabor Kovesdan <gabor@FreeBSD.org> To: src-committers@freebsd.org, svn-src-user@freebsd.org Subject: svn commit: r224469 - user/gabor/tre-integration/contrib/tre/lib Message-ID: <201107272254.p6RMse3A075626@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: gabor Date: Wed Jul 27 22:54:40 2011 New Revision: 224469 URL: http://svn.freebsd.org/changeset/base/224469 Log: - Add support for REG_ICASE - Eliminate code duplication by using macro Modified: user/gabor/tre-integration/contrib/tre/lib/fastmatch.c user/gabor/tre-integration/contrib/tre/lib/fastmatch.h user/gabor/tre-integration/contrib/tre/lib/tre-compile.c Modified: user/gabor/tre-integration/contrib/tre/lib/fastmatch.c ============================================================================== --- user/gabor/tre-integration/contrib/tre/lib/fastmatch.c Wed Jul 27 11:21:50 2011 (r224468) +++ user/gabor/tre-integration/contrib/tre/lib/fastmatch.c Wed Jul 27 22:54:40 2011 (r224469) @@ -42,7 +42,7 @@ #include "xmalloc.h" static int fastcmp(const void *, const void *, size_t, - tre_str_type_t); + tre_str_type_t, bool); static void revstr(tre_char_t *, int); static void revs(char *str, int len); @@ -90,10 +90,12 @@ static void revs(char *str, int len); { \ case STR_BYTE: \ case STR_MBS: \ - mismatch = fastcmp(fg->pattern, startptr, fg->len, type); \ + mismatch = fastcmp(fg->pattern, startptr, fg->len, type, \ + fg->icase); \ break; \ case STR_WIDE: \ - mismatch = fastcmp(fg->wpattern, startptr, fg->wlen, type); \ + mismatch = fastcmp(fg->wpattern, startptr, fg->wlen, type, \ + fg->icase); \ default: \ break; \ } \ @@ -171,31 +173,76 @@ static void revs(char *str, int len); { \ int k = fg->wlen - i; \ hashtable_put(fg->qsBc_table, &fg->wpattern[i], &k); \ + if (fg->icase) \ + { \ + wint_t wc = iswlower(fg->wpattern[i]) ? \ + towupper(fg->wpattern[i]) : towlower(fg->wpattern[i]); \ + hashtable_put(fg->qsBc_table, &wc, &k); \ + } \ } \ \ for (unsigned int i = 0; i <= UCHAR_MAX; i++) \ fg->qsBc[i] = fg->len - hasDot; \ for (int i = hasDot + 1; i < fg->len; i++) \ - fg->qsBc[(unsigned)fg->pattern[i]] = fg->len - i; + { \ + fg->qsBc[(unsigned)fg->pattern[i]] = fg->len - i; \ + if (fg->icase) \ + { \ + char c = islower(fg->pattern[i]) ? toupper(fg->pattern[i]) \ + : tolower(fg->pattern[i]); \ + fg->qsBc[(unsigned)c] = fg->len - i; \ + } \ + } #else #define FILL_QSBC \ for (unsigned int i = 0; i <= UCHAR_MAX; i++) \ fg->qsBc[i] = fg->wlen - hasDot; \ for (int i = hasDot + 1; i < fg->wlen; i++) \ - fg->qsBc[(unsigned)fg->wpattern[i]] = fg->wlen - i; + { \ + fg->qsBc[(unsigned)fg->wpattern[i]] = fg->wlen - i; \ + if (fg->icase) \ + { \ + char c = islower(fg->wpattern[i]) ? toupper(fg->wpattern[i]) \ + : tolower(fg->wpattern[i]); \ + fg->qsBc[(unsigned)c] = fg->len - i; \ + } \ + } #endif +#define REVFUNC(name, argtype) \ +static inline void \ +name(argtype *str, int len) \ +{ \ + argtype c; \ + \ + for (int i = 0; i < len / 2; i++) \ + { \ + c = str[i]; \ + str[i] = str[len - i - 1]; \ + str[len - i - 1] = c; \ + } \ +} + +REVFUNC(revstr, tre_char_t) +REVFUNC(revs, char) + /* * Returns: REG_OK on success, error code otherwise */ int -tre_fastcomp_literal(fastmatch_t *fg, const tre_char_t *wpat, size_t n) +tre_fastcomp_literal(fastmatch_t *fg, const tre_char_t *wpat, size_t n, + int cflags) { int hasDot = 0; /* Initialize. */ memset(fg, 0, sizeof(*fg)); + fg->icase = (cflags & REG_ICASE); + /* XXX */ + if (fg->icase && (MB_CUR_MAX > 1)) + return REG_BADPAT; + fg->wlen = (n == 0) ? tre_strlen(wpat) : n; fg->wpattern = xmalloc((fg->wlen + 1) * sizeof(tre_char_t)); if (fg->wpattern == NULL) @@ -215,7 +262,8 @@ tre_fastcomp_literal(fastmatch_t *fg, co * Returns: REG_OK on success, error code otherwise */ int -tre_fastcomp(fastmatch_t *fg, const tre_char_t *wpat, size_t n) +tre_fastcomp(fastmatch_t *fg, const tre_char_t *wpat, size_t n, + int cflags) { int firstHalfDot = -1; int firstLastHalfDot = -1; @@ -224,6 +272,11 @@ tre_fastcomp(fastmatch_t *fg, const tre_ /* Initialize. */ memset(fg, 0, sizeof(*fg)); + fg->icase = (cflags & REG_ICASE); + /* XXX */ + if (fg->icase && (MB_CUR_MAX > 1)) + return REG_BADPAT; + fg->wlen = (n == 0) ? tre_strlen(wpat) : n; /* Remove end-of-line character ('$'). */ @@ -427,7 +480,7 @@ tre_fastfree(fastmatch_t *fg) */ static inline int fastcmp(const void *pat, const void *data, size_t len, - tre_str_type_t type) + tre_str_type_t type, bool icase) { const char *str_byte = data; const char *pat_byte = pat; @@ -444,11 +497,13 @@ fastcmp(const void *pat, const void *dat { case STR_BYTE: case STR_MBS: - if (pat_byte[i] == str_byte[i]) + if (icase ? (tolower(pat_byte[i]) == tolower(str_byte[i])) + : (pat_byte[i] == str_byte[i])) continue; break; case STR_WIDE: - if (pat_wide[i] == str_wide[i]) + if (icase ? (towlower(pat_wide[i]) == towlower(str_wide[i])) + : (pat_wide[i] == str_wide[i])) continue; break; default: @@ -461,32 +516,3 @@ fastcmp(const void *pat, const void *dat return ret; } - -static inline void -revstr(tre_char_t *str, int len) -{ - tre_char_t c; - - for (int i = 0; i < len / 2; i++) - { - c = str[i]; - str[i] = str[len - i - 1]; - str[len - i - 1] = c; - } -} - -/* - * XXX: eliminate code duplication - */ -static inline void -revs(char *str, int len) -{ - char c; - - for (int i = 0; i < len / 2; i++) - { - c = str[i]; - str[i] = str[len - i - 1]; - str[len - i - 1] = c; - } -} Modified: user/gabor/tre-integration/contrib/tre/lib/fastmatch.h ============================================================================== --- user/gabor/tre-integration/contrib/tre/lib/fastmatch.h Wed Jul 27 11:21:50 2011 (r224468) +++ user/gabor/tre-integration/contrib/tre/lib/fastmatch.h Wed Jul 27 22:54:40 2011 (r224469) @@ -50,11 +50,12 @@ typedef struct { bool eol; bool reversed; bool word; + bool icase; } fastmatch_t; int tre_fastcomp_literal(fastmatch_t *preg, const tre_char_t *regex, - size_t); -int tre_fastcomp(fastmatch_t *preg, const tre_char_t *regex, size_t); + size_t, int); +int tre_fastcomp(fastmatch_t *preg, const tre_char_t *regex, size_t, int); int tre_fastexec(const fastmatch_t *fg, const void *data, size_t len, tre_str_type_t type, int nmatch, regmatch_t pmatch[]); void tre_fastfree(fastmatch_t *preg); Modified: user/gabor/tre-integration/contrib/tre/lib/tre-compile.c ============================================================================== --- user/gabor/tre-integration/contrib/tre/lib/tre-compile.c Wed Jul 27 11:21:50 2011 (r224468) +++ user/gabor/tre-integration/contrib/tre/lib/tre-compile.c Wed Jul 27 22:54:40 2011 (r224469) @@ -1876,8 +1876,8 @@ tre_compile(regex_t *preg, const tre_cha if (!shortcut) return REG_ESPACE; ret = (cflags & REG_LITERAL) - ? tre_fastcomp_literal(shortcut, regex, n) - : tre_fastcomp(shortcut, regex, n); + ? tre_fastcomp_literal(shortcut, regex, n, cflags) + : tre_fastcomp(shortcut, regex, n, cflags); if (ret == REG_OK) { preg->shortcut = shortcut;
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201107272254.p6RMse3A075626>