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