From owner-p4-projects@FreeBSD.ORG Wed May 7 21:27:25 2008 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 29654106567A; Wed, 7 May 2008 21:27:25 +0000 (UTC) Delivered-To: perforce@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id B07811065673 for ; Wed, 7 May 2008 21:27:24 +0000 (UTC) (envelope-from gabor@freebsd.org) Received: from repoman.freebsd.org (repoman.freebsd.org [IPv6:2001:4f8:fff6::29]) by mx1.freebsd.org (Postfix) with ESMTP id 9F3188FC1C for ; Wed, 7 May 2008 21:27:24 +0000 (UTC) (envelope-from gabor@freebsd.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.14.1/8.14.1) with ESMTP id m47LROPB073337 for ; Wed, 7 May 2008 21:27:24 GMT (envelope-from gabor@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.1/8.14.1/Submit) id m47LROoS073335 for perforce@freebsd.org; Wed, 7 May 2008 21:27:24 GMT (envelope-from gabor@freebsd.org) Date: Wed, 7 May 2008 21:27:24 GMT Message-Id: <200805072127.m47LROoS073335@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to gabor@freebsd.org using -f From: Gabor Kovesdan To: Perforce Change Reviews Cc: Subject: PERFORCE change 141303 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 07 May 2008 21:27:25 -0000 http://perforce.freebsd.org/chv.cgi?CH=141303 Change 141303 by gabor@gabor_server on 2008/05/07 21:27:21 - Implement -D / --devices Affected files ... .. //depot/projects/soc2008/gabor_textproc/grep/grep.c#8 edit .. //depot/projects/soc2008/gabor_textproc/grep/grep.h#8 edit .. //depot/projects/soc2008/gabor_textproc/grep/util.c#10 edit Differences ... ==== //depot/projects/soc2008/gabor_textproc/grep/grep.c#8 (text+ko) ==== @@ -67,6 +67,7 @@ /* Command-line flags */ int Aflag; /* -A x: print x lines trailing each match */ int Bflag; /* -B x: print x lines leading each match */ +int Dflag; /* -D: do not process device files if optarg is passed */ int Eflag; /* -E: interpret pattern as extended regexp */ int Fflag; /* -F: interpret pattern as list of fixed strings */ int Gflag; /* -G: interpret pattern as basic regexp */ @@ -119,13 +120,13 @@ usage(void) { fprintf(stderr, - "usage: %s [-abcEFGHhIiLlnoPqRSsUVvwxZ] [-A num] [-B num] [-C[num]]\n" + "usage: %s [-abcDEFGHhIiLlnoPqRSsUVvwxZ] [-A num] [-B num] [-C[num]]\n" "\t[-e pattern] [-f file] [--binary-files=value] [--context[=num]]\n" "\t[--line-buffered] [--null] [pattern] [file ...]\n", __progname); exit(2); } -static char *optstr = "0123456789A:B:CEFGHILPSRUVZabce:f:hilnoqrsuvwxy"; +static char *optstr = "0123456789A:B:CD:EFGHILPSRUVZabce:f:hilnoqrsuvwxy"; struct option long_options[] = { @@ -144,8 +145,8 @@ {"byte-offset", no_argument, NULL, 'b'}, {"context", optional_argument, NULL, 'C'}, {"count", no_argument, NULL, 'c'}, -/* XXX: UNDOCUMENTED {"devices", required_argument, NULL, 'D'}, +/* XXX: UNIMPLEMENTED {"directories", required_argument, NULL, 'd'}, */ {"extended-regexp", no_argument, NULL, 'E'}, {"regexp", required_argument, NULL, 'e'}, @@ -248,10 +249,11 @@ int main(int argc, char *argv[]) { - int c, lastc, prevoptind, newarg, i, needpattern; - struct patfile *patfile, *pf_next; - long l; - char *ep; + int c, lastc, prevoptind, newarg, i, needpattern; + struct patfile *patfile, *pf_next; + long l; + char *ep; + struct stat *finfo = 0; SLIST_INIT(&patfilelh); switch (__progname[0]) { @@ -326,6 +328,10 @@ case 'c': cflag = 1; break; + case 'D': + if (strcmp(optarg, "skip") == 0) + Dflag = 1; + break; case 'E': Fflag = Gflag = 0; Eflag++; @@ -495,8 +501,22 @@ if (Rflag) c = grep_tree(argv); else - for (c = 0; argc--; ++argv) - c += procfile(*argv); - + for (c = 0; argc--; ++argv) { + if (Dflag) { + if (!(finfo = malloc(sizeof(struct stat)))) + err(2, NULL); + if (stat(*argv, finfo) == -1) + err(2, NULL); + if (S_ISBLK(finfo->st_mode) || + S_ISCHR(finfo->st_mode) || + S_ISFIFO(finfo->st_mode) || + S_ISSOCK(finfo->st_mode)) { + free(finfo); + continue; + } else + free(finfo); + } + c+= procfile(*argv); + } exit(!c); } ==== //depot/projects/soc2008/gabor_textproc/grep/grep.h#8 (text+ko) ==== @@ -60,7 +60,7 @@ extern int cflags, eflags; /* Command line flags */ -extern int Aflag, Bflag, Eflag, Fflag, Gflag, Hflag, Lflag, Pflag, +extern int Aflag, Bflag, Dflag, Eflag, Fflag, Gflag, Hflag, Lflag, Pflag, Sflag, Rflag, Zflag, bflag, cflag, hflag, iflag, lflag, nflag, oflag, qflag, sflag, vflag, wflag, xflag, ==== //depot/projects/soc2008/gabor_textproc/grep/util.c#10 (text+ko) ==== @@ -63,9 +63,10 @@ int grep_tree(char **argv) { - FTS *fts; - FTSENT *p; - int c, fts_flags; + FTS *fts; + FTSENT *p; + int c, fts_flags; + struct stat *finfo = 0; c = fts_flags = 0; @@ -90,6 +91,20 @@ case FTS_DP: break; default: + if (Dflag) { + if (!(finfo = malloc(sizeof(struct stat)))) + err(2, NULL); + if (stat(p->fts_path, finfo) == -1) + err(2, NULL); + if (S_ISBLK(finfo->st_mode) || + S_ISCHR(finfo->st_mode) || + S_ISFIFO(finfo->st_mode) || + S_ISSOCK(finfo->st_mode)) { + free(finfo); + break; + } else + free(finfo); + } c += procfile(p->fts_path); break; }