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

Gabor Kovesdan gabor at FreeBSD.org
Fri Sep 16 12:13:05 UTC 2011


Author: gabor
Date: Fri Sep 16 12:13:03 2011
New Revision: 225616
URL: http://svn.freebsd.org/changeset/base/225616

Log:
  - Extract duplicated macro into a function to avoid duplication

Modified:
  user/gabor/tre-integration/contrib/tre/lib/fastmatch.c
  user/gabor/tre-integration/contrib/tre/lib/regcomp.c
  user/gabor/tre-integration/contrib/tre/lib/tre-compile.c
  user/gabor/tre-integration/contrib/tre/lib/tre-internal.h

Modified: user/gabor/tre-integration/contrib/tre/lib/fastmatch.c
==============================================================================
--- user/gabor/tre-integration/contrib/tre/lib/fastmatch.c	Fri Sep 16 12:12:26 2011	(r225615)
+++ user/gabor/tre-integration/contrib/tre/lib/fastmatch.c	Fri Sep 16 12:13:03 2011	(r225616)
@@ -38,63 +38,6 @@
 #include "tre-internal.h"
 #include "xmalloc.h"
 
-/* XXX: avoid duplication */
-#define CONV_PAT							\
-  {									\
-    wregex = xmalloc(sizeof(tre_char_t) * (n + 1));			\
-    if (wregex == NULL)							\
-      return REG_ESPACE;						\
-									\
-    if (TRE_MB_CUR_MAX == 1)						\
-      {									\
-	unsigned int i;							\
-	const unsigned char *str = (const unsigned char *)regex;	\
-	tre_char_t *wstr = wregex;					\
-									\
-	for (i = 0; i < n; i++)						\
-	  *(wstr++) = *(str++);						\
-	wlen = n;							\
-      }									\
-    else								\
-      {									\
-	int consumed;							\
-	tre_char_t *wcptr = wregex;					\
-	mbstate_t state;						\
-	memset(&state, '\0', sizeof(state));				\
-	while (n > 0)							\
-	  {								\
-	    consumed = tre_mbrtowc(wcptr, regex, n, &state);		\
-									\
-	    switch (consumed)						\
-	      {								\
-		case 0:							\
-		  if (*regex == '\0')					\
-		    consumed = 1;					\
-		  else							\
-		    {							\
-		      xfree(wregex);					\
-		      return REG_BADPAT;				\
-		    }							\
-		  break;						\
-		case -1:						\
-		  DPRINT(("mbrtowc: error %d: %s.\n", errno,		\
-		  strerror(errno)));					\
-		  xfree(wregex);					\
-		  return REG_BADPAT;					\
-		case -2:						\
-		  consumed = n;						\
-		  break;						\
-	      }								\
-	    regex += consumed;						\
-	    n -= consumed;						\
-	    wcptr++;							\
-	}								\
-        wlen = wcptr - wregex;						\
-      }									\
-									\
-    wregex[wlen] = L'\0';						\
-  }
-
 int
 tre_fixncomp(fastmatch_t *preg, const char *regex, size_t n, int cflags)
 {
@@ -103,14 +46,17 @@ tre_fixncomp(fastmatch_t *preg, const ch
   size_t wlen;
 
   if (n != 0)
-    CONV_PAT
+    {
+      ret = tre_convert_pattern(regex, n, &wregex, &wlen);
+      if (ret != REG_OK)
+	return ret;
+      else 
+	ret = tre_compile_literal(preg, wregex, wlen, cflags);
+      tre_free_pattern(wregex);
+      return ret;
+    }
   else
     return tre_compile_literal(preg, NULL, 0, cflags);
-
-  ret = tre_compile_literal(preg, wregex, wlen, cflags);
-  xfree(wregex);
-
-  return ret;
 }
 
 int
@@ -121,16 +67,19 @@ tre_fastncomp(fastmatch_t *preg, const c
   size_t wlen;
 
   if (n != 0)
-    CONV_PAT
+    {
+      ret = tre_convert_pattern(regex, n, &wregex, &wlen);
+      if (ret != REG_OK)
+	return ret;
+      else
+	ret = (cflags & REG_LITERAL)
+	      ? tre_compile_literal(preg, wregex, wlen, cflags)
+	      : tre_compile_fast(preg, wregex, wlen, cflags);
+      tre_free_pattern(wregex);
+      return ret;
+    }
   else
     return tre_compile_literal(preg, NULL, 0, cflags);
-
-  ret = (cflags & REG_LITERAL) ?
-    tre_compile_literal(preg, wregex, wlen, cflags) :
-    tre_compile_fast(preg, wregex, wlen, cflags);
-  xfree(wregex);
-
-  return ret;
 }
 
 

Modified: user/gabor/tre-integration/contrib/tre/lib/regcomp.c
==============================================================================
--- user/gabor/tre-integration/contrib/tre/lib/regcomp.c	Fri Sep 16 12:12:26 2011	(r225615)
+++ user/gabor/tre-integration/contrib/tre/lib/regcomp.c	Fri Sep 16 12:13:03 2011	(r225616)
@@ -32,80 +32,15 @@ int
 tre_regncomp(regex_t *preg, const char *regex, size_t n, int cflags)
 {
   int ret;
-#if TRE_WCHAR
   tre_char_t *wregex;
   size_t wlen;
 
-  wregex = xmalloc(sizeof(tre_char_t) * (n + 1));
-  if (wregex == NULL)
-    return REG_ESPACE;
-
-  /* If the current locale uses the standard single byte encoding of
-     characters, we don't do a multibyte string conversion.  If we did,
-     many applications which use the default locale would break since
-     the default "C" locale uses the 7-bit ASCII character set, and
-     all characters with the eighth bit set would be considered invalid. */
-#if TRE_MULTIBYTE
-  if (TRE_MB_CUR_MAX == 1)
-#endif /* TRE_MULTIBYTE */
-    {
-      unsigned int i;
-      const unsigned char *str = (const unsigned char *)regex;
-      tre_char_t *wstr = wregex;
-
-      for (i = 0; i < n; i++)
-	*(wstr++) = *(str++);
-      wlen = n;
-    }
-#if TRE_MULTIBYTE
+  ret = tre_convert_pattern(regex, n, &wregex, &wlen);
+  if (ret != REG_OK)
+    return ret;
   else
-    {
-      int consumed;
-      tre_char_t *wcptr = wregex;
-#ifdef HAVE_MBSTATE_T
-      mbstate_t state;
-      memset(&state, '\0', sizeof(state));
-#endif /* HAVE_MBSTATE_T */
-      while (n > 0)
-	{
-	  consumed = tre_mbrtowc(wcptr, regex, n, &state);
-
-	  switch (consumed)
-	    {
-	    case 0:
-	      if (*regex == '\0')
-		consumed = 1;
-	      else
-		{
-		  xfree(wregex);
-		  return REG_BADPAT;
-		}
-	      break;
-	    case -1:
-	      DPRINT(("mbrtowc: error %d: %s.\n", errno, strerror(errno)));
-	      xfree(wregex);
-	      return REG_BADPAT;
-	    case -2:
-	      /* The last character wasn't complete.  Let's not call it a
-		 fatal error. */
-	      consumed = n;
-	      break;
-	    }
-	  regex += consumed;
-	  n -= consumed;
-	  wcptr++;
-	}
-      wlen = wcptr - wregex;
-    }
-#endif /* TRE_MULTIBYTE */
-
-  wregex[wlen] = L'\0';
-  ret = tre_compile(preg, wregex, wlen, cflags);
-  xfree(wregex);
-#else /* !TRE_WCHAR */
-  ret = tre_compile(preg, (const tre_char_t *)regex, n, cflags);
-#endif /* !TRE_WCHAR */
-
+    ret = tre_compile(preg, wregex, wlen, cflags);
+  tre_free_pattern(wregex);
   return ret;
 }
 

Modified: user/gabor/tre-integration/contrib/tre/lib/tre-compile.c
==============================================================================
--- user/gabor/tre-integration/contrib/tre/lib/tre-compile.c	Fri Sep 16 12:12:26 2011	(r225615)
+++ user/gabor/tre-integration/contrib/tre/lib/tre-compile.c	Fri Sep 16 12:13:03 2011	(r225616)
@@ -1842,6 +1842,96 @@ tre_ast_to_tnfa(tre_ast_node_t *node, tr
   return errcode;
 }
 
+int
+tre_convert_pattern(const char *regex, size_t n, tre_char_t **w,
+		    size_t *wn)
+{
+#if TRE_WCHAR
+  tre_char_t *wregex;
+  size_t wlen;
+
+  wregex = xmalloc(sizeof(tre_char_t) * (n + 1));
+  if (wregex == NULL)
+    return REG_ESPACE;
+
+  /* If the current locale uses the standard single byte encoding of
+     characters, we don't do a multibyte string conversion.  If we did,
+     many applications which use the default locale would break since
+     the default "C" locale uses the 7-bit ASCII character set, and
+     all characters with the eighth bit set would be considered invalid. */
+#if TRE_MULTIBYTE
+  if (TRE_MB_CUR_MAX == 1)
+#endif /* TRE_MULTIBYTE */
+    {
+      unsigned int i;
+      const unsigned char *str = (const unsigned char *)regex;
+      tre_char_t *wstr = wregex;
+
+      for (i = 0; i < n; i++)
+	*(wstr++) = *(str++);
+      wlen = n;
+    }
+#if TRE_MULTIBYTE
+  else
+    {
+      int consumed;
+      tre_char_t *wcptr = wregex;
+#ifdef HAVE_MBSTATE_T
+      mbstate_t state;
+      memset(&state, '\0', sizeof(state));
+#endif /* HAVE_MBSTATE_T */
+      while (n > 0)
+	{
+	  consumed = tre_mbrtowc(wcptr, regex, n, &state);
+
+	  switch (consumed)
+	    {
+	    case 0:
+	      if (*regex == '\0')
+		consumed = 1;
+	      else
+		{
+		  xfree(wregex);
+		  return REG_BADPAT;
+		}
+	      break;
+	    case -1:
+	      DPRINT(("mbrtowc: error %d: %s.\n", errno, strerror(errno)));
+	      xfree(wregex);
+	      return REG_BADPAT;
+	    case -2:
+	      /* The last character wasn't complete.  Let's not call it a
+		 fatal error. */
+	      consumed = n;
+	      break;
+	    }
+	  regex += consumed;
+	  n -= consumed;
+	  wcptr++;
+	}
+      wlen = wcptr - wregex;
+    }
+#endif /* TRE_MULTIBYTE */
+  wregex[wlen] = L'\0';
+  *w = wregex;
+  *wn = n;
+  return REG_OK;
+#else /* !TRE_WCHAR */
+  {
+    *w = (tre_char_t * const *)regex;
+    *wn = n;
+    return REG_OK;
+  }
+#endif /* !TRE_WCHAR */
+}
+
+void
+tre_free_pattern(tre_char_t *wregex)
+{
+#if TRE_WCHAR
+  xfree(wregex);
+#endif
+}
 
 #define ERROR_EXIT(err)		  \
   do				  \

Modified: user/gabor/tre-integration/contrib/tre/lib/tre-internal.h
==============================================================================
--- user/gabor/tre-integration/contrib/tre/lib/tre-internal.h	Fri Sep 16 12:12:26 2011	(r225615)
+++ user/gabor/tre-integration/contrib/tre/lib/tre-internal.h	Fri Sep 16 12:13:03 2011	(r225616)
@@ -257,6 +257,13 @@ struct tnfa {
 };
 
 int
+tre_convert_pattern(const char *regex, size_t n, tre_char_t **w,
+		    size_t *wn);
+
+void
+tre_free_pattern(tre_char_t *wregex);
+
+int
 tre_compile(regex_t *preg, const tre_char_t *regex, size_t n, int cflags);
 
 void


More information about the svn-src-user mailing list