svn commit: r225315 - in user/gabor/grep/trunk: . regex

Gabor Kovesdan gabor at FreeBSD.org
Thu Sep 1 16:47:50 UTC 2011


Author: gabor
Date: Thu Sep  1 16:47:49 2011
New Revision: 225315
URL: http://svn.freebsd.org/changeset/base/225315

Log:
  - Rely on the matcher when having a match-all empty pattern

Modified:
  user/gabor/grep/trunk/grep.c
  user/gabor/grep/trunk/regex/fastmatch.c
  user/gabor/grep/trunk/regex/tre-fastmatch.c
  user/gabor/grep/trunk/util.c

Modified: user/gabor/grep/trunk/grep.c
==============================================================================
--- user/gabor/grep/trunk/grep.c	Thu Sep  1 16:43:23 2011	(r225314)
+++ user/gabor/grep/trunk/grep.c	Thu Sep  1 16:47:49 2011	(r225315)
@@ -227,9 +227,20 @@ static void
 add_pattern(char *pat, size_t len)
 {
 
+	/* Do not add further pattern is we already match everything */
+	if (matchall)
+	  return;
+
 	/* Check if we can do a shortcut */
-	if (len == 0 || matchall) {
+	if (len == 0) {
 		matchall = true;
+		for (int i = 0; i < patterns; i++) {
+			free(pattern[i].pat);
+		}
+		pattern = grep_realloc(pattern, sizeof(struct pat));
+		pattern[0].pat = NULL;
+		pattern[0].len = 0;
+		patterns = 1;
 		return;
 	}
 	/* Increase size if necessary */

Modified: user/gabor/grep/trunk/regex/fastmatch.c
==============================================================================
--- user/gabor/grep/trunk/regex/fastmatch.c	Thu Sep  1 16:43:23 2011	(r225314)
+++ user/gabor/grep/trunk/regex/fastmatch.c	Thu Sep  1 16:47:49 2011	(r225315)
@@ -38,67 +38,72 @@
 
 /* XXX: avoid duplication */
 #define CONV_PAT							\
-  int ret;								\
-  tre_char_t *wregex;							\
-  size_t wlen;								\
-									\
-  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);		\
+  {									\
+    wregex = xmalloc(sizeof(tre_char_t) * (n + 1));			\
+    if (wregex == NULL)							\
+      return REG_ESPACE;						\
 									\
-          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;						\
-    }									\
+    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';
+    wregex[wlen] = L'\0';						\
+  }
 
 int
 tre_fixncomp(fastmatch_t *preg, const char *regex, size_t n, int cflags)
 {
-  CONV_PAT;
+  int ret;
+  tre_char_t *wregex;
+  size_t wlen;
+
+  if (n != 0)
+    CONV_PAT
+  else
+    return tre_compile_literal(preg, NULL, 0, cflags);
 
   ret = tre_compile_literal(preg, wregex, wlen, cflags);
   xfree(wregex);
@@ -109,7 +114,14 @@ tre_fixncomp(fastmatch_t *preg, const ch
 int
 tre_fastncomp(fastmatch_t *preg, const char *regex, size_t n, int cflags)
 {
-  CONV_PAT;
+  int ret;
+  tre_char_t *wregex;
+  size_t wlen;
+
+  if (n != 0)
+    CONV_PAT
+  else
+    return tre_compile_literal(preg, NULL, 0, cflags);
 
   ret = (cflags & REG_LITERAL) ?
     tre_compile_literal(preg, wregex, wlen, cflags) :

Modified: user/gabor/grep/trunk/regex/tre-fastmatch.c
==============================================================================
--- user/gabor/grep/trunk/regex/tre-fastmatch.c	Thu Sep  1 16:43:23 2011	(r225314)
+++ user/gabor/grep/trunk/regex/tre-fastmatch.c	Thu Sep  1 16:47:49 2011	(r225315)
@@ -390,6 +390,8 @@ static int	fastcmp(const void *, const v
   if (n == 0)								\
     {									\
       fg->matchall = true;						\
+      fg->pattern = "";							\
+      fg->wpattern = TRE_CHAR("");					\
       return REG_OK;							\
     }									\
 									\

Modified: user/gabor/grep/trunk/util.c
==============================================================================
--- user/gabor/grep/trunk/util.c	Thu Sep  1 16:43:23 2011	(r225314)
+++ user/gabor/grep/trunk/util.c	Thu Sep  1 16:47:49 2011	(r225315)
@@ -281,74 +281,72 @@ procline(struct str *l, int nottext)
 	unsigned int i;
 	int c = 0, m = 0, r = 0;
 
-	if (!matchall) {
-		/* Loop to process the whole line */
-		while (st <= l->len) {
-			pmatch.rm_so = st;
-			pmatch.rm_eo = l->len;
-
-			/* Loop to compare with all the patterns */
-			for (i = 0; i < patterns; i++) {
-				if (fg_pattern[i].pattern)
-					r = fastexec(&fg_pattern[i],
-					    l->dat, 1, &pmatch, eflags);
-				else
-					r = regexec(&r_pattern[i], l->dat, 1,
-					    &pmatch, eflags);
-				r = (r == 0) ? 0 : REG_NOMATCH;
-				st = (cflags & REG_NOSUB)
-					? (size_t)l->len
-					: (size_t)pmatch.rm_eo;
-				if (r == REG_NOMATCH)
-					continue;
-				/* Check for full match */
-				if (r == 0 && xflag)
-					if (pmatch.rm_so != 0 ||
-					    (size_t)pmatch.rm_eo != l->len)
-						r = REG_NOMATCH;
-				/* Check for whole word match */
-				if (r == 0 && (wflag || fg_pattern[i].word)) {
-					wint_t wbegin, wend;
-
-					wbegin = wend = L' ';
-					if (pmatch.rm_so != 0 &&
-					    sscanf(&l->dat[pmatch.rm_so - 1],
-					    "%lc", &wbegin) != 1)
-						r = REG_NOMATCH;
-					else if ((size_t)pmatch.rm_eo !=
-					    l->len &&
-					    sscanf(&l->dat[pmatch.rm_eo],
-					    "%lc", &wend) != 1)
-						r = REG_NOMATCH;
-					else if (iswword(wbegin) ||
-					    iswword(wend))
-						r = REG_NOMATCH;
-				}
-				if (r == 0) {
-					if (m == 0)
-						c++;
-					if (m < MAX_LINE_MATCHES)
-						matches[m++] = pmatch;
-					/* matches - skip further patterns */
-					if ((color == NULL && !oflag) ||
-					    qflag || lflag)
-						break;
-				}
+	/* Loop to process the whole line */
+	while (st <= l->len) {
+		pmatch.rm_so = st;
+		pmatch.rm_eo = l->len;
+
+		/* Loop to compare with all the patterns */
+		for (i = 0; i < patterns; i++) {
+			if (fg_pattern[i].pattern)
+				r = fastexec(&fg_pattern[i],
+				    l->dat, 1, &pmatch, eflags);
+			else
+				r = regexec(&r_pattern[i], l->dat, 1,
+				    &pmatch, eflags);
+			r = (r == 0) ? 0 : REG_NOMATCH;
+			st = (cflags & REG_NOSUB)
+				? (size_t)l->len
+				: (size_t)pmatch.rm_eo;
+			if (r == REG_NOMATCH)
+				continue;
+			/* Check for full match */
+			if (r == 0 && xflag)
+				if (pmatch.rm_so != 0 ||
+				    (size_t)pmatch.rm_eo != l->len)
+					r = REG_NOMATCH;
+			/* Check for whole word match */
+			if (r == 0 && (wflag || fg_pattern[i].word)) {
+				wint_t wbegin, wend;
+
+				wbegin = wend = L' ';
+				if (pmatch.rm_so != 0 &&
+				    sscanf(&l->dat[pmatch.rm_so - 1],
+				    "%lc", &wbegin) != 1)
+					r = REG_NOMATCH;
+				else if ((size_t)pmatch.rm_eo !=
+				    l->len &&
+				    sscanf(&l->dat[pmatch.rm_eo],
+				    "%lc", &wend) != 1)
+					r = REG_NOMATCH;
+				else if (iswword(wbegin) ||
+				    iswword(wend))
+					r = REG_NOMATCH;
 			}
-
-			if (vflag) {
-				c = !c;
-				break;
+			if (r == 0) {
+				if (m == 0)
+					c++;
+				if (m < MAX_LINE_MATCHES)
+					matches[m++] = pmatch;
+				/* matches - skip further patterns */
+				if ((color == NULL && !oflag) ||
+				    qflag || lflag)
+					break;
 			}
-			/* One pass if we are not recording matches */
-			if ((color == NULL && !oflag) || qflag || lflag)
-				break;
+		}
 
-			if (st == (size_t)pmatch.rm_so)
-				break; 	/* No matches */
+		if (vflag) {
+			c = !c;
+			break;
 		}
-	} else
-		c = !vflag;
+
+		/* One pass if we are not recording matches */
+		if ((color == NULL && !oflag) || qflag || lflag)
+			break;
+
+		if (st == (size_t)pmatch.rm_so)
+			break; 	/* No matches */
+	}
 
 	if (c && binbehave == BINFILE_BIN && nottext)
 		return (c); /* Binary file */


More information about the svn-src-user mailing list