From 1ca8a314f80274d06c887aa347ecb142487a946d Mon Sep 17 00:00:00 2001 From: Michael Forney Date: Sun, 2 Nov 2014 03:08:12 +0000 Subject: [PATCH] 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 " --- grep.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/grep.c b/grep.c index 715f864..1376513 100644 --- a/grep.c +++ b/grep.c @@ -129,6 +129,9 @@ grep(FILE *fp, const char *str) int match = NoMatch; 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) { if(regexec(&pnode->preg, buf, 0, NULL, 0) ^ vflag) continue; @@ -146,9 +149,7 @@ grep(FILE *fp, const char *str) printf("%s:", str); if(mode == 'n') printf("%ld:", n); - printf("%s", buf); - if(len && buf[len - 1] != '\n') - putchar('\n'); + puts(buf); break; } match = Match;