PERFORCE change 141303 for review
Gabor Kovesdan
gabor at FreeBSD.org
Wed May 7 21:27:25 UTC 2008
http://perforce.freebsd.org/chv.cgi?CH=141303
Change 141303 by gabor at 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;
}
More information about the p4-projects
mailing list