aboutsummaryrefslogtreecommitdiff
path: root/toys/posix
diff options
context:
space:
mode:
Diffstat (limited to 'toys/posix')
-rw-r--r--toys/posix/grep.c26
1 files changed, 15 insertions, 11 deletions
diff --git a/toys/posix/grep.c b/toys/posix/grep.c
index fce8d564..2ddb6b93 100644
--- a/toys/posix/grep.c
+++ b/toys/posix/grep.c
@@ -372,13 +372,24 @@ static void parse_regex(void)
// exit to free. Not supporting nofork for this command any time soon.)
al = TT.f ? TT.f : TT.e;
while (al) {
- if (TT.f) s = ss = xreadfile(al->arg, 0, 0);
- else s = ss = al->arg;
+ if (TT.f) {
+ if (!*(s = ss = xreadfile(al->arg, 0, 0))) {
+ free(ss);
+ s = 0;
+ }
+ } else s = ss = al->arg;
+
+ // Advance, when we run out of -f switch to -e.
+ al = al->next;
+ if (!al && TT.f) {
+ TT.f = 0;
+ al = TT.e;
+ }
+ if (!s) continue;
// Split lines at \n, add individual lines to new list.
do {
-// TODO: NUL terminated input shouldn't split -e at \n
- ss = strchr(s, '\n');
+ ss = FLAG(z) ? 0 : strchr(s, '\n');
if (ss) *(ss++) = 0;
new = xmalloc(sizeof(struct arg_list));
new->next = list;
@@ -386,13 +397,6 @@ static void parse_regex(void)
list = new;
s = ss;
} while (ss && *s);
-
- // Advance, when we run out of -f switch to -e.
- al = al->next;
- if (!al && TT.f) {
- TT.f = 0;
- al = TT.e;
- }
}
TT.e = list;