svn commit: r232109 - user/gabor/tre-integration/usr.bin/grep

Gabor Kovesdan gabor at FreeBSD.org
Fri Feb 24 13:05:11 UTC 2012


Author: gabor
Date: Fri Feb 24 13:05:10 2012
New Revision: 232109
URL: http://svn.freebsd.org/changeset/base/232109

Log:
  - Use new multi-pattern interface

Modified:
  user/gabor/tre-integration/usr.bin/grep/Makefile
  user/gabor/tre-integration/usr.bin/grep/grep.c
  user/gabor/tre-integration/usr.bin/grep/grep.h
  user/gabor/tre-integration/usr.bin/grep/util.c

Modified: user/gabor/tre-integration/usr.bin/grep/Makefile
==============================================================================
--- user/gabor/tre-integration/usr.bin/grep/Makefile	Fri Feb 24 12:35:17 2012	(r232108)
+++ user/gabor/tre-integration/usr.bin/grep/Makefile	Fri Feb 24 13:05:10 2012	(r232109)
@@ -61,12 +61,6 @@ MLINKS+= grep.1 bzgrep.1 \
 CFLAGS+= -DWITHOUT_BZIP2
 .endif
 
-.if !defined(WITHOUT_GNU_COMPAT)
-CFLAGS+= -I/usr/include/gnu
-LDADD+=	-lgnuregex
-DPADD+=	${LIBGNUREGEX}
-.endif
-
 .if !defined(WITHOUT_NLS)
 .include "${.CURDIR}/nls/Makefile.inc"
 .else

Modified: user/gabor/tre-integration/usr.bin/grep/grep.c
==============================================================================
--- user/gabor/tre-integration/usr.bin/grep/grep.c	Fri Feb 24 12:35:17 2012	(r232108)
+++ user/gabor/tre-integration/usr.bin/grep/grep.c	Fri Feb 24 13:05:10 2012	(r232109)
@@ -43,6 +43,8 @@ __FBSDID("$FreeBSD$");
 #include <limits.h>
 #include <libgen.h>
 #include <locale.h>
+#include <mregex.h>
+#include <regex.h>
 #include <stdbool.h>
 #include <stdio.h>
 #include <stdlib.h>
@@ -56,6 +58,8 @@ __FBSDID("$FreeBSD$");
 nl_catd	 catalog;
 #endif
 
+#define MAX_PATTERNS 256
+
 /*
  * Default messags to use when NLS is disabled or no catalogue
  * is found.
@@ -81,9 +85,10 @@ int		 eflags = REG_STARTEND;
 bool		 matchall;
 
 /* Searching patterns */
-unsigned int	 patterns, pattern_sz;
-struct pat	*pattern;
-regex_t		*r_pattern;
+unsigned int 	 patterns;
+char		**pats;
+size_t		*lens;
+mregex_t	 preg;
 
 /* Filename exclusion/inclusion patterns */
 unsigned int	 fpatterns, fpattern_sz;
@@ -228,28 +233,21 @@ add_pattern(char *pat, size_t len)
 	/* Check if we can do a shortcut */
 	if (len == 0) {
 		matchall = true;
-		for (unsigned 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;
+		for (unsigned int i = 0; i < patterns; i++)
+			free(pats[i]);
+		pats[0] = grep_strdup("");
 		patterns = 1;
 		return;
 	}
 	/* Increase size if necessary */
-	if (patterns == pattern_sz) {
-		pattern_sz *= 2;
-		pattern = grep_realloc(pattern, ++pattern_sz *
-		    sizeof(struct pat));
-	}
+
 	if (len > 0 && pat[len - 1] == '\n')
 		--len;
 	/* pat may not be NUL-terminated */
-	pattern[patterns].pat = grep_malloc(len + 1);
-	memcpy(pattern[patterns].pat, pat, len);
-	pattern[patterns].len = len;
-	pattern[patterns].pat[len] = '\0';
+	pats[patterns] = grep_malloc(len + 1);
+	memcpy(pats[patterns], pat, len);
+	pats[patterns][len] = '\0';
+	lens[patterns] = len;
 	++patterns;
 }
 
@@ -327,7 +325,7 @@ main(int argc, char *argv[])
 {
 	char **aargv, **eargv, *eopts;
 	char *ep;
-	const char *pn;
+	const char *pn, **ptr;
 	unsigned long long l;
 	unsigned int aargc, eargc, i;
 	int c, lastc, needpattern, newarg, prevoptind;
@@ -338,6 +336,9 @@ main(int argc, char *argv[])
 	catalog = catopen("grep", NL_CAT_LOCALE);
 #endif
 
+	pats = grep_malloc(MAX_PATTERNS * sizeof(char *));
+	lens = grep_malloc(MAX_PATTERNS * sizeof(size_t));
+
 	/* Check what is the program name of the binary.  In this
 	   way we can have all the funcionalities in one binary
 	   without the need of scripting and using ugly hacks. */
@@ -682,16 +683,13 @@ main(int argc, char *argv[])
 		usage();
 	}
 
-	r_pattern = grep_calloc(patterns, sizeof(*r_pattern));
-
-	/* Check if cheating is allowed (always is for fgrep). */
-	for (i = 0; i < patterns; ++i) {
-		c = regcomp(&r_pattern[i], pattern[i].pat, cflags);
-		if (c != 0) {
-			regerror(c, &r_pattern[i], re_error,
-			    RE_ERROR_BUF);
-			errx(2, "%s", re_error);
-		}
+	/* Compile patterns. */
+	ptr = (const char **)pats;
+	c = mregncomp(&preg, patterns, ptr, lens, cflags);
+	if (c != 0) {
+	  // regerror(c, &r_pattern[i], re_error, RE_ERROR_BUF);
+	  // errx(2, "%s", re_error);
+	  errx(2, "%s", "Bad patterns.");
 	}
 
 	if (lbflag)

Modified: user/gabor/tre-integration/usr.bin/grep/grep.h
==============================================================================
--- user/gabor/tre-integration/usr.bin/grep/grep.h	Fri Feb 24 12:35:17 2012	(r232108)
+++ user/gabor/tre-integration/usr.bin/grep/grep.h	Fri Feb 24 13:05:10 2012	(r232109)
@@ -31,6 +31,7 @@
 
 #include <bzlib.h>
 #include <limits.h>
+#include <mregex.h>
 #include <regex.h>
 #include <stdbool.h>
 #include <stdio.h>
@@ -93,16 +94,14 @@ struct str {
 	int		 line_no;
 };
 
-struct pat {
-	char		*pat;
-	int		 len;
-};
-
 struct epat {
 	char		*pat;
 	int		 mode;
 };
 
+extern char **pats;
+extern size_t *lens;
+
 /* Flags passed to regcomp() and regexec() */
 extern int	 cflags, eflags;
 
@@ -122,7 +121,7 @@ extern int	 tail;
 extern unsigned int dpatterns, fpatterns, patterns;
 extern struct pat *pattern;
 extern struct epat *dpattern, *fpattern;
-extern regex_t	*er_pattern, *r_pattern;
+extern mregex_t preg;
 
 /* For regex errors  */
 #define RE_ERROR_BUF	512

Modified: user/gabor/tre-integration/usr.bin/grep/util.c
==============================================================================
--- user/gabor/tre-integration/usr.bin/grep/util.c	Fri Feb 24 12:35:17 2012	(r232108)
+++ user/gabor/tre-integration/usr.bin/grep/util.c	Fri Feb 24 13:05:10 2012	(r232109)
@@ -273,7 +273,6 @@ procline(struct str *l, int nottext)
 	regmatch_t matches[MAX_LINE_MATCHES];
 	regmatch_t pmatch;
 	size_t st = 0;
-	unsigned int i;
 	int c = 0, m = 0, r = 0;
 
 	/* Loop to process the whole line */
@@ -281,44 +280,30 @@ procline(struct str *l, int nottext)
 		pmatch.rm_so = st;
 		pmatch.rm_eo = l->len;
 
-		/* Loop to compare with all the patterns */
-		for (i = 0; i < patterns; i++) {
-			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;
-			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;
-			}
+		r = mregexec(&preg, l->dat, 1, &pmatch, eflags);
+		st = (cflags & REG_NOSUB) ? (size_t)l->len :
+		    (size_t)pmatch.rm_eo;
+		if (r == REG_NOMATCH)
+			continue;
+		/* Check for full match */
+		if (r == REG_OK && xflag)
+			if (pmatch.rm_so != 0 ||
+			    (size_t)pmatch.rm_eo != l->len)
+				r = REG_NOMATCH;
+		if (r == REG_OK) {
+			if (m == 0)
+				c++;
+			if (m < MAX_LINE_MATCHES)
+				matches[m++] = pmatch;
+			/* matches - skip further patterns */
+			if ((color == NULL && !oflag) || qflag || lflag)
+				break;
 		}
 
 		if (vflag) {
 			c = !c;
 			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 */
 	}
 
 


More information about the svn-src-user mailing list