commit c2c5ea9c60f41bcda89782228cbd8b590923cbba
parent 171ef71c7407bffd8b418b1142b1ee4879e97259
Author: Connor Lane Smith <cls@lubutu.com>
Date: Thu, 31 May 2012 19:38:25 +0100
grep: ARGBEGIN
Diffstat:
M | grep.c | | | 67 | +++++++++++++++++++++++++++++++++++++------------------------------ |
1 file changed, 37 insertions(+), 30 deletions(-)
diff --git a/grep.c b/grep.c
@@ -11,6 +11,7 @@
enum { Match = 0, NoMatch = 1, Error = 2 };
static void grep(FILE *, const char *, regex_t *);
+static void usage(void);
static bool vflag = false;
static bool many;
@@ -21,46 +22,46 @@ int
main(int argc, char *argv[])
{
char c;
- int n, flags = REG_NOSUB;
+ int i, n, flags = REG_NOSUB;
regex_t preg;
FILE *fp;
- while((c = getopt(argc, argv, "Ecilnqv")) != -1)
- switch(c) {
- case 'E':
- flags |= REG_EXTENDED;
- break;
- case 'c':
- case 'l':
- case 'n':
- case 'q':
- mode = c;
- break;
- case 'i':
- flags |= REG_ICASE;
- break;
- case 'v':
- vflag = true;
- break;
- default:
- exit(Error);
- }
- if(optind == argc)
- enprintf(Error, "usage: %s [-Ecilnqv] pattern [files...]\n", argv[0]);
+ ARGBEGIN {
+ case 'E':
+ flags |= REG_EXTENDED;
+ break;
+ case 'c':
+ case 'l':
+ case 'n':
+ case 'q':
+ mode = c;
+ break;
+ case 'i':
+ flags |= REG_ICASE;
+ break;
+ case 'v':
+ vflag = true;
+ break;
+ default:
+ usage();
+ } ARGEND;
- if((n = regcomp(&preg, argv[optind++], flags)) != 0) {
+ if(argc == 0)
+ usage(); /* no pattern */
+
+ if((n = regcomp(&preg, argv[0], flags)) != 0) {
char buf[BUFSIZ];
regerror(n, &preg, buf, sizeof buf);
enprintf(Error, "invalid pattern: %s\n", buf);
}
- many = (argc > optind+1);
- if(optind == argc)
+ many = (argc > 1);
+ if(argc == 1)
grep(stdin, "<stdin>", &preg);
- else for(; optind < argc; optind++) {
- if(!(fp = fopen(argv[optind], "r")))
- enprintf(Error, "fopen %s:", argv[optind]);
- grep(fp, argv[optind], &preg);
+ else for(i = 1; i < argc; i++) {
+ if(!(fp = fopen(argv[i], "r")))
+ enprintf(Error, "fopen %s:", argv[i]);
+ grep(fp, argv[i], &preg);
fclose(fp);
}
return match ? Match : NoMatch;
@@ -104,3 +105,9 @@ end:
enprintf(Error, "%s: read error:", str);
free(buf);
}
+
+void
+usage(void)
+{
+ enprintf(Error, "usage: %s [-Ecilnqv] pattern [files...]\n", argv0);
+}