PERFORCE change 144767 for review

Gabor Kovesdan gabor at FreeBSD.org
Sun Jul 6 09:28:28 UTC 2008


http://perforce.freebsd.org/chv.cgi?CH=144767

Change 144767 by gabor at gabor_server on 2008/07/06 09:28:26

	- Add --exclude for -r

Affected files ...

.. //depot/projects/soc2008/gabor_textproc/grep/grep.c#54 edit
.. //depot/projects/soc2008/gabor_textproc/grep/grep.h#30 edit
.. //depot/projects/soc2008/gabor_textproc/grep/util.c#47 edit

Differences ...

==== //depot/projects/soc2008/gabor_textproc/grep/grep.c#54 (text+ko) ====

@@ -80,10 +80,17 @@
 int		 eflags = REG_STARTEND;
 
 int		 matchall;	/* shortcut */
+
+/* Searching patterns */
 int		 patterns, pattern_sz;
 char		**pattern;
 regex_t		*r_pattern;
 
+/* Filename exclusion patterns */
+int		 epatterns, epattern_sz;
+char		**epattern;
+regex_t		*er_pattern;
+
 /* For regex errors  */
 char	 re_error[RE_ERROR_BUF + 1];
 
@@ -112,6 +119,7 @@
 int	 xflag;		/* -x: pattern must match entire line */
 int	 lbflag;	/* --line-buffered */
 int	 nullflag;	/* --null */
+int	 exclflag;	/* --exclude */
 char	*label;		/* --label */
 char	*color;		/* --color */
 unsigned long long mcount;	/* count for -m */
@@ -128,7 +136,8 @@
 	MMAP_OPT,
 	LINEBUF_OPT,
 	LABEL_OPT,
-	NULL_OPT
+	NULL_OPT,
+	R_EXCLUDE_OPT
 };
 
 /* Housekeeping */
@@ -162,6 +171,7 @@
 	{"null",		no_argument,		NULL, NULL_OPT},
 	{"color",		optional_argument,	NULL, COLOR_OPT},
 	{"colour",		optional_argument,	NULL, COLOR_OPT},
+	{"exclude",		required_argument,	NULL, R_EXCLUDE_OPT},
 	{"after-context",	required_argument,	NULL, 'A'},
 	{"text",		no_argument,		NULL, 'a'},
 	{"before-context",	required_argument,	NULL, 'B'},
@@ -239,6 +249,22 @@
 }
 
 static void
+add_epattern(char *pat, size_t len)
+{
+	if (epatterns == epattern_sz) {
+		epattern_sz *= 2;
+		epattern = grep_realloc(epattern, ++epattern_sz * sizeof(*epattern));
+	}
+	if (len > 0 && pat[len - 1] == '\n')
+		 --len;
+        /* pat may not be NUL-terminated */
+	epattern[epatterns] = grep_malloc(len + 1);
+	memcpy(epattern[epatterns], pat, len);
+	epattern[epatterns][len] = '\0';
+	++epatterns;
+}
+
+static void
 read_patterns(const char *fn)
 {
 	FILE	*f;
@@ -481,6 +507,12 @@
 		case NULL_OPT:
 			nullflag = 1;
 			break;
+		case R_EXCLUDE_OPT:
+			if (dirbehave != DIR_RECURSE)
+				usage();
+			exclflag = 1;
+			add_epattern(optarg, strlen(optarg));
+			break;
 		case HELP_OPT:
 		default:
 			usage();
@@ -516,6 +548,15 @@
 			errx(2, "%s", re_error);
 		}
 	}
+	er_pattern = grep_calloc(epatterns, sizeof(*er_pattern));
+	for (i = 0; i < epatterns; ++i) {
+		c = regcomp(&er_pattern[i], epattern[i], REG_EXTENDED);
+		if (c != 0) {
+			regerror(c, &er_pattern[i], re_error,
+			    RE_ERROR_BUF);
+			errx(2, "%s", re_error);
+		}
+	}
 
 	if (lbflag)
 		setlinebuf(stdout);

==== //depot/projects/soc2008/gabor_textproc/grep/grep.h#30 (text+ko) ====

@@ -82,14 +82,14 @@
 /* Command line flags */
 extern int	 Eflag, Fflag, Gflag, Hflag, Jflag, Lflag, Zflag,
 		 bflag, cflag, hflag, iflag, lflag, mflag, nflag, oflag,
-		 qflag, sflag, vflag, wflag, xflag, nullflag;
+		 qflag, sflag, vflag, wflag, xflag, nullflag, exclflag;
 extern unsigned long long Aflag, Bflag, mcount;
 extern char	*color, *label;
 extern int	 binbehave, devbehave, dirbehave, linkbehave;
 
-extern int	 first, prev, matchall, patterns, tail, notfound;
-extern char    **pattern;
-extern regex_t	*r_pattern;
+extern int	 first, prev, matchall, patterns, epatterns, tail, notfound;
+extern char    **pattern, **epattern;
+extern regex_t	*r_pattern, *er_pattern;
 
 /* For regex errors  */
 #define RE_ERROR_BUF	512

==== //depot/projects/soc2008/gabor_textproc/grep/util.c#47 (text+ko) ====

@@ -62,7 +62,7 @@
 {
 	FTS		*fts;
 	FTSENT		*p;
-	int		 c, fts_flags;
+	int		 i, c, ok, fts_flags;
 
 	c = fts_flags = 0;
 
@@ -92,7 +92,21 @@
 				p->fts_path);
 			break;
 		default:
-			c += procfile(p->fts_path);
+			if (exclflag) {
+				regmatch_t	 pmatch;
+
+				ok = 1;
+				pmatch.rm_so = 0;
+				pmatch.rm_eo = strlen(p->fts_path);
+				for (i = 0; i < patterns; i++)
+					if (regexec(&er_pattern[i], p->fts_path, 0, &pmatch, eflags) == 0) {
+						ok = 0;
+						break;
+					}
+			} else
+				ok = 1;
+			if (ok)
+				c += procfile(p->fts_path);
 			break;
 		}
 	}


More information about the p4-projects mailing list