Page MenuHomeFreeBSD

D10105.diff
No OneTemporary

D10105.diff

Index: head/usr.bin/grep/util.c
===================================================================
--- head/usr.bin/grep/util.c
+++ head/usr.bin/grep/util.c
@@ -55,6 +55,9 @@
static int linesqueued;
static int procline(struct str *l, int);
+static int lasta;
+static bool ctxover;
+
bool
file_matching(const char *fname)
{
@@ -212,8 +215,10 @@
strcpy(ln.file, fn);
ln.line_no = 0;
ln.len = 0;
+ ctxover = false;
linesqueued = 0;
tail = 0;
+ lasta = 0;
ln.off = -1;
for (c = 0; c == 0 || !(lflag || qflag); ) {
@@ -235,10 +240,24 @@
free(f);
return (0);
}
- /* Process the file line-by-line */
+
+ /* Process the file line-by-line, enqueue non-matching lines */
if ((t = procline(&ln, f->binary)) == 0 && Bflag > 0) {
- enqueue(&ln);
- linesqueued++;
+ /* Except don't enqueue lines that appear in -A ctx */
+ if (ln.line_no == 0 || lasta != ln.line_no) {
+ /* queue is maxed to Bflag number of lines */
+ enqueue(&ln);
+ linesqueued++;
+ ctxover = false;
+ } else {
+ /*
+ * Indicate to procline() that we have ctx
+ * overlap and make sure queue is empty.
+ */
+ if (!ctxover)
+ clearqueue();
+ ctxover = true;
+ }
}
c += t;
if (mflag && mcount <= 0)
@@ -396,17 +415,19 @@
/* Dealing with the context */
if ((tail || c) && !cflag && !qflag && !lflag && !Lflag) {
if (c) {
- if (!first && !prev && !tail && Aflag)
+ if (!first && !prev && !tail && (Bflag || Aflag) &&
+ !ctxover)
printf("--\n");
tail = Aflag;
if (Bflag > 0) {
- if (!first && !prev)
- printf("--\n");
printqueue();
+ ctxover = false;
}
linesqueued = 0;
printline(l, ':', matches, m);
} else {
+ /* Print -A lines following matches */
+ lasta = l->line_no;
printline(l, '-', matches, m);
tail--;
}

File Metadata

Mime Type
text/plain
Expires
Sat, Sep 19, 8:18 PM (13 h, 51 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
39247421
Default Alt Text
D10105.diff (1 KB)

Event Timeline