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

Gabor Kovesdan gabor at FreeBSD.org
Wed Aug 10 19:40:24 UTC 2011


Author: gabor
Date: Wed Aug 10 19:40:23 2011
New Revision: 224764
URL: http://svn.freebsd.org/changeset/base/224764

Log:
  - Align backslashes of macros
  - Defer copying of pattern after all checks are passed; this also makes
    the code easier to read

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	Wed Aug 10 19:16:04 2011	(r224763)
+++ user/gabor/tre-integration/contrib/tre/lib/fastmatch.c	Wed Aug 10 19:40:23 2011	(r224764)
@@ -60,37 +60,37 @@ static int	fastcmp(const void *, const v
  * so we can handle MB strings as byte sequences just like
  * SB strings.
  */
-#define SKIP_CHARS(n)						\
-  do {								\
-    switch (type)						\
-      {								\
-	case STR_WIDE:						\
-	  startptr = str_wide + n;				\
-	  break;						\
-	default:						\
-	  startptr = str_byte + n;				\
-      }								\
-  } while (0);							\
+#define SKIP_CHARS(n)							\
+  do {									\
+    switch (type)							\
+      {									\
+	case STR_WIDE:							\
+	  startptr = str_wide + n;					\
+	  break;							\
+	default:							\
+	  startptr = str_byte + n;					\
+      }									\
+  } while (0);								\
 
 /*
  * Converts the wide string pattern to SB/MB string and stores
  * it in fg->pattern. Sets fg->len to the byte length of the
  * converted string.
  */
-#define STORE_MBS_PAT						\
-  do {								\
-    size_t siz;							\
-								\
-    siz = wcstombs(NULL, fg->wpattern, 0);			\
-    if (siz == (size_t)-1)					\
-      return REG_BADPAT;					\
-    fg->len = siz;						\
-    fg->pattern = xmalloc(siz + 1);				\
-    if (fg->pattern == NULL)					\
-      return REG_ESPACE;					\
-    wcstombs(fg->pattern, fg->wpattern, siz);			\
-    fg->pattern[siz] = '\0';					\
-  } while (0);							\
+#define STORE_MBS_PAT							\
+  do {									\
+    size_t siz;								\
+									\
+    siz = wcstombs(NULL, fg->wpattern, 0);				\
+    if (siz == (size_t)-1)						\
+      return REG_BADPAT;						\
+    fg->len = siz;							\
+    fg->pattern = xmalloc(siz + 1);					\
+    if (fg->pattern == NULL)						\
+      return REG_ESPACE;						\
+    wcstombs(fg->pattern, fg->wpattern, siz);				\
+    fg->pattern[siz] = '\0';						\
+  } while (0);								\
 
 /*
  * Compares the pattern to the input string at the position
@@ -374,63 +374,57 @@ tre_fastcomp(fastmatch_t *fg, const tre_
   if (fg->icase && (MB_CUR_MAX > 1))
     return REG_BADPAT;
 
-  fg->wlen = (n == 0) ? tre_strlen(pat) : n;
+  n = (n == 0) ? tre_strlen(pat) : n;
 
   /* Remove end-of-line character ('$'). */
-  if ((fg->wlen > 0) && (pat[fg->wlen - 1] == TRE_CHAR('$')))
+  if ((n > 0) && (pat[n - 1] == TRE_CHAR('$')))
   {
     fg->eol = true;
-    fg->wlen--;
+    n--;
   }
 
   /* Remove beginning-of-line character ('^'). */
   if (pat[0] == TRE_CHAR('^'))
   {
     fg->bol = true;
-    fg->wlen--;
+    n--;
     pat++;
   }
 
-  if ((fg->wlen >= 14) &&
+  if ((n >= 14) &&
       (memcmp(pat, TRE_CHAR("[[:<:]]"), 7 * sizeof(tre_char_t)) == 0) &&
-      (memcmp(pat + fg->wlen - 7, TRE_CHAR("[[:>:]]"),
+      (memcmp(pat + n - 7, TRE_CHAR("[[:>:]]"),
 	      7 * sizeof(tre_char_t)) == 0))
   {
-    fg->wlen -= 14;
+    n -= 14;
     pat += 7;
     fg->word = true;
   }
 
-  /*
-   * pat has been adjusted earlier to not include '^', '$' or
-   * the word match character classes at the beginning and ending
-   * of the string respectively.
-   */
-  SAVE_PATTERN(fg->wpattern, fg->wlen);
-
   /* Look for ways to cheat...er...avoid the full regex engine. */
-  for (unsigned int i = 0; i < fg->wlen; i++) {
+  for (unsigned int i = 0; i < n; i++) {
     /* Can still cheat? */
-    if ((tre_isalnum(fg->wpattern[i])) || tre_isspace(fg->wpattern[i]) ||
-      (fg->wpattern[i] == TRE_CHAR('_')) || (fg->wpattern[i] == TRE_CHAR(',')) ||
-      (fg->wpattern[i] == TRE_CHAR('=')) || (fg->wpattern[i] == TRE_CHAR('-')) ||
-      (fg->wpattern[i] == TRE_CHAR(':')) || (fg->wpattern[i] == TRE_CHAR('/'))) {
+    if ((tre_isalnum(pat[i])) || tre_isspace(pat[i]) ||
+      (pat[i] == TRE_CHAR('_')) || (pat[i] == TRE_CHAR(',')) ||
+      (pat[i] == TRE_CHAR('=')) || (pat[i] == TRE_CHAR('-')) ||
+      (pat[i] == TRE_CHAR(':')) || (pat[i] == TRE_CHAR('/')))
 	continue;
-    } else if (fg->wpattern[i] == TRE_CHAR('.'))
+    else if (pat[i] == TRE_CHAR('.'))
       fg->hasdot = i;
-    else {
-	/* Free memory and let others know this is empty. */
-	free(fg->wpattern);
-	fg->wpattern = NULL;
+    else
 	return REG_BADPAT;
-    }
   }
 
+  /*
+   * pat has been adjusted earlier to not include '^', '$' or
+   * the word match character classes at the beginning and ending
+   * of the string respectively.
+   */
 #ifdef TRE_WCHAR
+  SAVE_PATTERN(fg->wpattern, fg->wlen);
   STORE_MBS_PAT;
 #else
-  fg->len = fg->wlen;
-  fg->patter = fg->wpattern;
+  SAVE_PATTERN(fg->pattern, fg->len);
 #endif
 
   FILL_QSBC;


More information about the svn-src-user mailing list