Date: Sun, 6 Jul 2008 09:28:27 GMT From: Gabor Kovesdan <gabor@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 144767 for review Message-ID: <200807060928.m669SR5X093824@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=144767 Change 144767 by gabor@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; } }
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200807060928.m669SR5X093824>