From owner-svn-src-user@FreeBSD.ORG Thu Jul 21 21:53:00 2011 Return-Path: Delivered-To: svn-src-user@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id B167A106566C; Thu, 21 Jul 2011 21:52:59 +0000 (UTC) (envelope-from gabor@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 96C608FC08; Thu, 21 Jul 2011 21:52:59 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id p6LLqx0O087121; Thu, 21 Jul 2011 21:52:59 GMT (envelope-from gabor@svn.freebsd.org) Received: (from gabor@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id p6LLqx3h087119; Thu, 21 Jul 2011 21:52:59 GMT (envelope-from gabor@svn.freebsd.org) Message-Id: <201107212152.p6LLqx3h087119@svn.freebsd.org> From: Gabor Kovesdan Date: Thu, 21 Jul 2011 21:52:59 +0000 (UTC) To: src-committers@freebsd.org, svn-src-user@freebsd.org X-SVN-Group: user MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r224256 - user/gabor/tre-integration/contrib/tre/lib X-BeenThere: svn-src-user@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the experimental " user" src tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 21 Jul 2011 21:53:00 -0000 Author: gabor Date: Thu Jul 21 21:52:59 2011 New Revision: 224256 URL: http://svn.freebsd.org/changeset/base/224256 Log: - Fix skipping characters in multibyte strings - Faster initialization of matching params - Fix a bug regarding matching . - Compare from behind because it is more efficient Modified: user/gabor/tre-integration/contrib/tre/lib/fastmatch.c Modified: user/gabor/tre-integration/contrib/tre/lib/fastmatch.c ============================================================================== --- user/gabor/tre-integration/contrib/tre/lib/fastmatch.c Thu Jul 21 21:08:33 2011 (r224255) +++ user/gabor/tre-integration/contrib/tre/lib/fastmatch.c Thu Jul 21 21:52:59 2011 (r224256) @@ -61,7 +61,7 @@ static void revstr(tre_char_t *, int); case STR_MBS: \ for (skip = j = 0; j < n; j++) \ { \ - siz = mbrlen(str_byte, MB_CUR_MAX, NULL); \ + siz = mbrlen(str_byte + skip, MB_CUR_MAX, NULL); \ skip += siz; \ } \ startptr = str_byte + skip; \ @@ -83,10 +83,8 @@ tre_fastcomp_literal(fastmatch_t *fg, co { /* Initialize. */ + memset(fg, 0, sizeof(*fg)); fg->len = (n == 0) ? tre_strlen(pat) : n; - fg->bol = false; - fg->eol = false; - fg->reversed = false; fg->pattern = xmalloc((fg->len + 1) * sizeof(tre_char_t)); if (fg->pattern == NULL) return -1; @@ -126,11 +124,8 @@ tre_fastcomp(fastmatch_t *fg, const tre_ int lastHalfDot = 0; /* Initialize. */ + memset(fg, 0, sizeof(*fg)); fg->len = (n == 0) ? tre_strlen(pat) : n; - fg->bol = false; - fg->eol = false; - fg->reversed = false; - fg->word = false; /* Remove end-of-line character ('$'). */ if ((fg->len > 0) && (pat[fg->len - 1] == TRE_CHAR('$'))) @@ -180,7 +175,7 @@ tre_fastcomp(fastmatch_t *fg, const tre_ (fg->pattern[i] == TRE_CHAR('=')) || (fg->pattern[i] == TRE_CHAR('-')) || (fg->pattern[i] == TRE_CHAR(':')) || (fg->pattern[i] == TRE_CHAR('/'))) { continue; - } else if (fg->pattern[i] == TRE_CHAR('\0')) { + } else if (fg->pattern[i] == TRE_CHAR('.')) { hasDot = i; if (i < fg->len / 2) { if (firstHalfDot < 0) @@ -431,13 +426,19 @@ fastcmp(const tre_char_t *pat, const voi tre_str_type_t type) { const char *str_byte = data; + wchar_t *mbs_wide; #ifdef TRE_WCHAR const wchar_t *str_wide = data; - wint_t wc; - size_t s; #endif - for (unsigned int i = 0; i < len; i++) { + if (type == STR_MBS) + { + mbs_wide = alloca((len + 1) * sizeof(wint_t)); + mbstowcs(mbs_wide, str_byte, len); + type = STR_WIDE; + } + + for (int i = len - 1; i >= 0; i--) { if (pat[i] == TRE_CHAR('.')) continue; switch (type) @@ -446,15 +447,6 @@ fastcmp(const tre_char_t *pat, const voi if (pat[i] == btowc(str_byte[i])) continue; break; - case STR_MBS: - s = mbrtowc(&wc, str_byte, MB_CUR_MAX, NULL); - if (s == (size_t)-1) - return i; - else - str_byte += s; - if (pat[i] == wc) - continue; - break; case STR_WIDE: if (pat[i] == str_wide[i]) continue;