Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 3 Jul 2011 15:27:20 +0000 (UTC)
From:      Gabor Kovesdan <gabor@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-user@freebsd.org
Subject:   svn commit: r223737 - user/gabor/tre-integration/contrib/tre/lib
Message-ID:  <201107031527.p63FRK1Z023540@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
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)
     {



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201107031527.p63FRK1Z023540>