76 lines
1.6 KiB
C
76 lines
1.6 KiB
C
#include <stdio.h>
|
|
#include <string.h>
|
|
|
|
#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;
|
|
}
|