Not sure which would be better choice of flag: 'z' or '0', so I arbitrarily chose 'z'.
commit 474a73ae118e6791fc56e616233dd9ccb5c8e92f Author: strake <strake...@gmail.com> Date: Thu Oct 4 19:50:23 2012 -0500 grep: add z flag to use NULL separators diff --git a/grep.c b/grep.c index 9716328..48a54c0 100644 --- a/grep.c +++ b/grep.c @@ -18,6 +18,8 @@ static bool many; static bool match = false; static char mode = 0; +static char delim = '\n'; + int main(int argc, char *argv[]) { @@ -41,6 +43,9 @@ main(int argc, char *argv[]) case 'v': vflag = true; break; + case 'z': + delim = '\0'; + break; default: usage(); } ARGEND; @@ -73,7 +78,7 @@ grep(FILE *fp, const char *str, regex_t *preg) long n, c = 0; size_t size = 0, len; - for(n = 1; afgets(&buf, &size, fp); n++) { + for(n = 1; getdelim(&buf, &size, delim, fp) >= 0; n++) { if(buf[(len = strlen(buf))-1] == '\n') buf[--len] = '\0'; if(regexec(preg, buf, 0, NULL, 0) ^ vflag) @@ -92,7 +97,7 @@ grep(FILE *fp, const char *str, regex_t *preg) printf("%s:", str); if(mode == 'n') printf("%ld:", n); - printf("%s\n", buf); + printf("%s%c", buf, delim); break; } match = true;