#include #include #define MAXLINE 1000 int find(char *pattern, FILE *fp, char *name); int except, number; /* flags */ int main(int argc, char *argv[]) { char *pat; FILE *fp; char name[MAXLINE]; int c, found = 0; while (--argc > 0 && (*++argv)[0] == '-') while ((c = *++argv[0])) switch (c) { case 'x': except = 1; break; case 'n': number = 1; break; default: printf("find: illegal option %c\n", c); argc = 0; found = -1; break; } if (argc == 1) { pat = argv[0]; found += find(pat, stdin, ""); } else if (argc > 1) { pat = argv[0]; while (--argc >= 0 && *++argv != NULL) { if ((fp = fopen(*argv, "r")) == NULL) { fprintf(stderr, "error: unable to open file: %s\n", *argv); exit(1); } strcpy(name, *argv); strcat(name, ": "); found += find(pat, fp, name); } } else printf("Usage: find -x -n pattern [FILES ...]\n"); return found; } int find(char *pat, FILE *fp, char *name) { int found, lineno; char line[MAXLINE]; found = lineno = 0; while(fgets(line, MAXLINE, fp) > 0) { lineno++; if ((strstr(line, pat) != NULL) != except) { printf("%s", name); if (number) printf("%d: ", lineno); printf("%s", line); found++; } } return found; }