Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 1 Feb 2009 00:22:02 GMT
From:      Gabor Kovesdan <gabor@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 156975 for review
Message-ID:  <200902010022.n110M2Fw066994@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=156975

Change 156975 by gabor@gabor_server on 2009/02/01 00:21:27

	- Some rework on --exclude / --include
	- Extra --exclude-dir / --include-dir options will come

Affected files ...

.. //depot/projects/soc2008/gabor_textproc/grep/grep.c#78 edit
.. //depot/projects/soc2008/gabor_textproc/grep/grep.h#45 edit
.. //depot/projects/soc2008/gabor_textproc/grep/util.c#78 edit

Differences ...

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

@@ -96,7 +96,7 @@
 
 /* Filename exclusion/inclusion patterns */
 int		 epatterns, epattern_sz;
-char		**epattern;
+struct epat	*epattern;
 
 /* For regex errors  */
 char	 re_error[RE_ERROR_BUF + 1];
@@ -123,7 +123,6 @@
 int	 lbflag;	/* --line-buffered */
 int	 nullflag;	/* --null */
 int	 exclflag;	/* --exclude */
-int	 inclflag;	/* --include */
 char	*label;		/* --label */
 char	*color;		/* --color */
 int	 grepbehave = GREP_BASIC;	/* -EFGP: type of the regex */
@@ -142,7 +141,9 @@
 	LABEL_OPT,
 	NULL_OPT,
 	R_EXCLUDE_OPT,
-	R_INCLUDE_OPT
+	R_INCLUDE_OPT,
+	R_DEXCLUDE_OPT,
+	R_DINCLUDE_OPT
 };
 
 /* Housekeeping */
@@ -181,6 +182,8 @@
 	{"colour",		optional_argument,	NULL, COLOR_OPT},
 	{"exclude",		required_argument,	NULL, R_EXCLUDE_OPT},
 	{"include",		required_argument,	NULL, R_INCLUDE_OPT},
+/*	{"exclude-dir",		required_argument,	NULL, R_DEXCLUDE_OPT},
+	{"include-dir",		required_argument,	NULL, R_DINCLUDE_OPT}, */
 	{"after-context",	required_argument,	NULL, 'A'},
 	{"text",		no_argument,		NULL, 'a'},
 	{"before-context",	required_argument,	NULL, 'B'},
@@ -247,19 +250,21 @@
  * Adds an include/exclude pattern to the internal array.
  */
 static void
-add_epattern(char *pat, size_t len)
+add_epattern(char *pat, size_t len, int type, int mode)
 {
 
 	/* Increase size if necessary */
 	if (epatterns == epattern_sz) {
 		epattern_sz *= 2;
-		epattern = grep_realloc(epattern, ++epattern_sz * sizeof(*epattern));
+		epattern = grep_realloc(epattern, ++epattern_sz * sizeof(struct epat));
 	}
 	if (len > 0 && pat[len - 1] == '\n')
 		 --len;
-	epattern[epatterns] = grep_malloc(len + 1);
-	memcpy(epattern[epatterns], pat, len);
-	epattern[epatterns][len] = '\0';
+	epattern[epatterns].pat = grep_malloc(len + 1);
+	memcpy(epattern[epatterns].pat, pat, len);
+	epattern[epatterns].pat[len] = '\0';
+	epattern[epatterns].type = type;
+	epattern[epatterns].mode = mode;
 	++epatterns;
 }
 
@@ -510,16 +515,26 @@
 		case R_INCLUDE_OPT:
 			if (dirbehave != DIR_RECURSE)
 				usage();
-			inclflag = 1;
-			exclflag = 0;
-			add_epattern(basename(optarg), strlen(basename(optarg)));
+			exclflag = 1;
+			add_epattern(basename(optarg), strlen(basename(optarg)), FILE_PAT, INCL_PAT);
 			break;
 		case R_EXCLUDE_OPT:
 			if (dirbehave != DIR_RECURSE)
 				usage();
-			inclflag = 0;
+			exclflag = 1;
+			add_epattern(basename(optarg), strlen(basename(optarg)), FILE_PAT, EXCL_PAT);
+			break;
+		case R_DINCLUDE_OPT:
+			if (dirbehave != DIR_RECURSE)
+				usage();
+			exclflag = 1;
+			add_epattern(basename(optarg), strlen(basename(optarg)), DIR_PAT, INCL_PAT);
+			break;
+		case R_DEXCLUDE_OPT:
+			if (dirbehave != DIR_RECURSE)
+				usage();
 			exclflag = 1;
-			add_epattern(basename(optarg), strlen(basename(optarg)));
+			add_epattern(basename(optarg), strlen(basename(optarg)), DIR_PAT, EXCL_PAT);
 			break;
 		case HELP_OPT:
 		default:

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

@@ -68,6 +68,11 @@
 #define LINK_EXPLICIT	1
 #define LINK_SKIP	2
 
+#define FILE_PAT	0
+#define DIR_PAT		1
+#define EXCL_PAT	0
+#define INCL_PAT	1
+
 #define MAX_LINE_MATCHES	32
 
 struct file {
@@ -87,6 +92,12 @@
 	char		*dat;
 };
 
+struct epat {
+	char		*pat;
+	int		 type;
+	int		 mode;
+};
+
 typedef struct {
 	unsigned char	*pattern;
 	int		 len;
@@ -104,13 +115,14 @@
 extern int	 Eflag, Fflag, Gflag, Hflag, Lflag,
 		 bflag, cflag, hflag, iflag, lflag, mflag, nflag, oflag,
 		 qflag, sflag, vflag, wflag, xflag;
-extern int	 nullflag, exclflag, inclflag;
+extern int	 nullflag, exclflag;
 extern unsigned long long Aflag, Bflag, mcount;
 extern char	*color, *label;
 extern int	 grepbehave, binbehave, filebehave, devbehave, dirbehave, linkbehave;
 
 extern int	 first, prev, matchall, patterns, epatterns, tail, notfound;
-extern char    **pattern, **epattern;
+extern char    **pattern;
+extern struct epat *epattern;
 extern regex_t	*r_pattern, *er_pattern;
 extern fastgrep_t *fg_pattern;
 

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

@@ -97,22 +97,18 @@
 			break;
 		default:
 			/* Check for file exclusion/inclusion */
+			ok = 1;
 			if (exclflag) {
-				ok = 1;
-				for (i = 0; i < epatterns; ++i)
-					if (fnmatch(epattern[i], basename(p->fts_path), 0) == 0) {
-						ok = 0;
-						break;
+				for (i = 0; i < epatterns; ++i) {
+					if (fnmatch(epattern[i].pat, basename(p->fts_path), 0) == 0) {
+						if (epattern[i].mode == EXCL_PAT)
+							ok = 0;
+						else
+							ok = 1;
 					}
-			} else if (inclflag) {
-				ok = 0;
-				for (i = 0; i < epatterns; i++)
-					if (fnmatch(epattern[i], basename(p->fts_path), 0) == 0) {
-						ok = 1;
-						break;
-					}
-			} else
-				ok = 1;
+				}
+			}
+
 			if (ok)
 				c += procfile(p->fts_path);
 			break;



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200902010022.n110M2Fw066994>