svn commit: r224256 - user/gabor/tre-integration/contrib/tre/lib

Gabor Kovesdan gabor at FreeBSD.org
Thu Jul 21 21:53:00 UTC 2011


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;


More information about the svn-src-user mailing list