PERFORCE change 156975 for review
Gabor Kovesdan
gabor at FreeBSD.org
Sat Jan 31 16:22:04 PST 2009
http://perforce.freebsd.org/chv.cgi?CH=156975
Change 156975 by gabor at 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;
More information about the p4-projects
mailing list