aboutsummaryrefslogtreecommitdiff
path: root/toys/posix/grep.c
diff options
context:
space:
mode:
authorRob Landley <rob@landley.net>2014-04-16 08:54:19 -0500
committerRob Landley <rob@landley.net>2014-04-16 08:54:19 -0500
commit6c64f5f186d26d4c95d408979d33831935e026f1 (patch)
treeb08b59e7f980f3ab74d856923175dae0d4cd87c2 /toys/posix/grep.c
parent76e1cb3ada7fb12f38e248a08c2deedc5c9ce888 (diff)
downloadtoybox-6c64f5f186d26d4c95d408979d33831935e026f1.tar.gz
Revert lots of half-finished local debris I didn't mean to check in with Isaac's roadmap update.
Mercurial's "import" command is still broken, committing local tree changes to files that weren't even touched by the patch because the hg developers inisist, when I point out how stupid it is, that they meant to do that. (hg record can do hunks, but import can't even track _files_.)
Diffstat (limited to 'toys/posix/grep.c')
-rw-r--r--toys/posix/grep.c98
1 files changed, 19 insertions, 79 deletions
diff --git a/toys/posix/grep.c b/toys/posix/grep.c
index 2837cc24..aba70878 100644
--- a/toys/posix/grep.c
+++ b/toys/posix/grep.c
@@ -4,7 +4,7 @@
*
* See http://pubs.opengroup.org/onlinepubs/9699919799/utilities/grep.html
-USE_GREP(NEWTOY(grep, "A#B#C#ZzEFHabhinorsvwclqe*f*m#x[!wx][!EFw]", TOYFLAG_BIN))
+USE_GREP(NEWTOY(grep, "ZzEFHabhinorsvwclqe*f*m#x[!wx][!EFw]", TOYFLAG_BIN))
USE_GREP(OLDTOY(egrep, grep, OPTSTR_grep, TOYFLAG_BIN))
USE_GREP(OLDTOY(fgrep, grep, OPTSTR_grep, TOYFLAG_BIN))
@@ -46,67 +46,40 @@ GLOBALS(
long m;
struct arg_list *f;
struct arg_list *e;
- long C;
- long B;
- long A;
struct arg_list *regex;
- struct double_list *blist;
)
-struct dlist_off {
- char *next, *prev;
- long offset;
- char *data;
-};
-
static void do_grep(int fd, char *name)
{
FILE *file = fdopen(fd, "r");
long offset = 0;
- int lcount = 0, mcount = 0, which = toys.optflags & FLAG_w ? 2 : 0,
- blines = 0, alines = 0, dash = 0;
+ int lcount = 0, mcount = 0, which = toys.optflags & FLAG_w ? 2 : 0;
char indelim = '\n' * !(toys.optflags&FLAG_z),
outdelim = '\n' * !(toys.optflags&FLAG_Z);
if (!fd) name = "(standard input)";
-fprintf(stderr, "boo\n");
if (!file) {
perror_msg("%s", name);
return;
}
- // Loop through lines of input
for (;;) {
- char *oline = 0, *line = 0, *start;
+ char *line = 0, *start;
regmatch_t matches[3];
size_t unused;
long len;
int mmatch = 0;
- // Read next line of input
lcount++;
if (0 > (len = getdelim(&line, &unused, indelim, file))) break;
if (line[len-1] == indelim) line[len-1] = 0;
-fprintf(stderr, "line=%s\n", line);
- // Unconditionally add line to blist so output can always just dump blist.
- dlist_add(&TT.blist, line);
-fprintf(stderr, "added=%s\n", TT.blist->data);
-fprintf(stderr, "prev=%s\n", TT.blist->prev->data);
- if (blines <= TT.B) blines++;
- else {
- struct double_list *temp = dlist_pop(&TT.blist);
-fprintf(stderr, "bird=%s\n", temp->data);
- free(temp->data);
- free(temp);
- }
start = line;
- // Loop to match multiple times within the same line (if necessary)
- for (;;) {
-fprintf(stderr, "match?\n");
+ for (;;)
+ {
int rc = 0, skip = 0;
if (toys.optflags & FLAG_F) {
@@ -159,51 +132,30 @@ fprintf(stderr, "match?\n");
}
matches[which].rm_so = 0;
} else if (rc) break;
-fprintf(stderr, "got match %s\n", line);
- // We got a match, figure out how to display it
+
mmatch++;
toys.exitval = 0;
if (toys.optflags & FLAG_q) xexit();
if (toys.optflags & FLAG_l) {
printf("%s%c", name, outdelim);
- goto finish;
+ free(line);
+ fclose(file);
+ return;
}
-
- line = 0;
-fprintf(stderr, "here=%s\n", TT.blist->prev->data);
- // Yes, -o sometimes counts things as a match (-c) but doesn't display it
if (toys.optflags & FLAG_o)
if (matches[which].rm_eo == matches[which].rm_so)
break;
-// List of lines that DIDN'T match, print backlog?
-// Except this includes the one we just matched...?
- while (TT.blist) {
- struct double_list *dlist = dlist_pop(&TT.blist);
- char *ll = dlist->data;
-fprintf(stderr, "popped %s\n", ll);
- if (dash) printf("--%c", outdelim);
- dash = 0;
-
- if (!(toys.optflags & FLAG_c)) {
- if (toys.optflags & FLAG_H) printf("%s:", name);
- if (toys.optflags & FLAG_n) printf("%d:", lcount);
- if (toys.optflags & FLAG_b)
- printf("%ld:", offset + (start - dlist->data) +
- ((toys.optflags & FLAG_o) ? matches[which].rm_so : 0));
- if (!(toys.optflags & FLAG_o)) xprintf("%s%c", dlist->data, outdelim);
- else if (!TT.blist) {
-
-// TODO: FLAG_o prints multiple times, can't free it yet?
- xprintf("%.*s%c", matches[which].rm_eo - matches[which].rm_so,
- start + matches[which].rm_so, outdelim);
- line = dlist->data;
- }
- }
- if (oline && !TT.blist) TT.blist = dlist;
+ if (!(toys.optflags & FLAG_c)) {
+ if (toys.optflags & FLAG_H) printf("%s:", name);
+ if (toys.optflags & FLAG_n) printf("%d:", lcount);
+ if (toys.optflags & FLAG_b)
+ printf("%ld:", offset + (start-line) +
+ ((toys.optflags & FLAG_o) ? matches[which].rm_so : 0));
+ if (!(toys.optflags & FLAG_o)) xprintf("%s%c", line, outdelim);
else {
- free(dlist->data);
- free(dlist);
+ xprintf("%.*s%c", matches[which].rm_eo - matches[which].rm_so,
+ start + matches[which].rm_so, outdelim);
}
}
@@ -211,7 +163,7 @@ fprintf(stderr, "popped %s\n", ll);
if (!(toys.optflags & FLAG_o) || !*start) break;
}
offset += len;
-fprintf(stderr, "Spacious skies\n");
+
free(line);
if (mmatch) mcount++;
@@ -223,14 +175,6 @@ fprintf(stderr, "Spacious skies\n");
xprintf("%d%c", mcount, outdelim);
}
-finish:
- while (CFG_TOYBOX_FREE && TT.blist) {
- struct double_list *dlist = dlist_pop(&TT.blist);
-
- free(dlist->data);
- free(dlist);
- }
-
// loopfiles will also close the fd, but this frees an (opaque) struct.
fclose(file);
}
@@ -329,10 +273,6 @@ void grep_main(void)
toys.optc--;
}
- if (!TT.A) TT.A = TT.C;
- if (!TT.B) TT.B = TT.C;
- if (toys.optflags & (FLAG_l|FLAG_o)) TT.B = 0; // avoid memory leak
-
parse_regex();
if (!(toys.optflags & FLAG_h) && toys.optc>1) toys.optflags |= FLAG_H;