grep: Remove newlines before matching a line

Otherwise, a pattern with a '$' anchor will never match and POSIX says that

  "By default, an input line shall be selected if any pattern ... matches any
   part of the line excluding the terminating <newline>"
This commit is contained in:
Michael Forney 2014-11-02 03:08:12 +00:00 committed by sin
parent 7ed4866556
commit 1ca8a314f8

7
grep.c
View File

@ -129,6 +129,9 @@ grep(FILE *fp, const char *str)
int match = NoMatch; int match = NoMatch;
for(n = 1; (len = agetline(&buf, &size, fp)) != -1; n++) { for(n = 1; (len = agetline(&buf, &size, fp)) != -1; n++) {
/* Remove the trailing newline if one is present. */
if (len && buf[len - 1] == '\n')
buf[len - 1] = '\0';
for(pnode = phead; pnode; pnode = pnode->next) { for(pnode = phead; pnode; pnode = pnode->next) {
if(regexec(&pnode->preg, buf, 0, NULL, 0) ^ vflag) if(regexec(&pnode->preg, buf, 0, NULL, 0) ^ vflag)
continue; continue;
@ -146,9 +149,7 @@ grep(FILE *fp, const char *str)
printf("%s:", str); printf("%s:", str);
if(mode == 'n') if(mode == 'n')
printf("%ld:", n); printf("%ld:", n);
printf("%s", buf); puts(buf);
if(len && buf[len - 1] != '\n')
putchar('\n');
break; break;
} }
match = Match; match = Match;