#include #include #define MAXLINE 1000 /* maximum input line length */ int grep(char *pattern); /* somewhat optimized book version of grep */ /* find all lines matching pattern */ int main(int argc, char *argv[]) { /* verify arg is given */ if (argc < 2) { printf("error: excpected pattern\n"); return -1; } char *pattern = argv[1]; /* verify pattern */ char c; int i; for (i = 0; (c = pattern[i]) != '\0'; i++) if (c == '\n') { printf("error: newline in pattern\n"); return -2; } int found = grep(pattern); printf("found = %d\n", found); return found; } int getln(char line[], int lim); int strindex(char source[], char searchfor[], int slen); /* grep: prints lines containing pattern, returns number of matching lines */ int grep(char *pattern) { char line[MAXLINE]; int found = 0; int slen = strlen(pattern); while (getln(line, MAXLINE) > 0) if (strindex(line, pattern, slen) >= 0) { printf("%s", line); found++; } return found; } /* getline: get line (including \n) into s, return length */ int getln(char *s, int lim) { int c, i = 0; while (--lim > 0 && (c = getchar()) != EOF && (s[i++] = c) != '\n') ; s[i] = '\0'; return i; } /* strindex: return index of t in s, -1 if none */ int strindex(char s[], char t[], int slen) { int i, j; for (i = j = 0; s[i]; i++) if (s[i] != t[j]) j = 0; else if (++j == slen) { // found match return i - slen + 1; } return -1; }