Date: Fri, 8 Jun 2018 01:25:07 +0000 (UTC) From: Kyle Evans <kevans@FreeBSD.org> To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r334821 - head/usr.bin/grep Message-ID: <201806080125.w581P71T097178@repo.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: kevans Date: Fri Jun 8 01:25:07 2018 New Revision: 334821 URL: https://svnweb.freebsd.org/changeset/base/334821 Log: bsdgrep(1): Slooowly peel away the chunky onion (or peel off the band-aid, whatever floats your boat) This addresses two separate issues: 1.) Nothing within bsdgrep actually knew whether it cared about line numbers or not. 2.) The file layer knew nothing about the context in which it was being called. #1 is only important when we're *not* processing line-by-line. #2 is debatably a good idea; the parsing context is only handy because that's where we store current offset information and, as of this commit, whether or not it needs to be line-aware. Modified: head/usr.bin/grep/file.c head/usr.bin/grep/grep.h head/usr.bin/grep/util.c Modified: head/usr.bin/grep/file.c ============================================================================== --- head/usr.bin/grep/file.c Fri Jun 8 00:47:24 2018 (r334820) +++ head/usr.bin/grep/file.c Fri Jun 8 01:25:07 2018 (r334821) @@ -95,7 +95,7 @@ grep_lnbufgrow(size_t newlen) } char * -grep_fgetln(struct file *f, size_t *lenp) +grep_fgetln(struct file *f, struct parsec *pc) { unsigned char *p; char *ret; @@ -109,18 +109,18 @@ grep_fgetln(struct file *f, size_t *lenp) if (bufrem == 0) { /* Return zero length to indicate EOF */ - *lenp = 0; + pc->ln.len= 0; return (bufpos); } - /* Look for a newline in the remaining part of the buffer */ + /* Look for a newline in the remaining part of the [6rbuffer */ if ((p = memchr(bufpos, fileeol, bufrem)) != NULL) { ++p; /* advance over newline */ ret = bufpos; len = p - bufpos; bufrem -= len; bufpos = p; - *lenp = len; + pc->ln.len = len; return (ret); } @@ -155,11 +155,11 @@ grep_fgetln(struct file *f, size_t *lenp) bufpos = p; break; } - *lenp = len; + pc->ln.len = len; return (lnbuf); error: - *lenp = 0; + pc->ln.len = 0; return (NULL); } Modified: head/usr.bin/grep/grep.h ============================================================================== --- head/usr.bin/grep/grep.h Fri Jun 8 00:47:24 2018 (r334820) +++ head/usr.bin/grep/grep.h Fri Jun 8 01:25:07 2018 (r334821) @@ -97,6 +97,21 @@ struct epat { int mode; }; +/* + * Parsing context; used to hold things like matches made and + * other useful bits + */ +struct parsec { + regmatch_t matches[MAX_MATCHES]; /* Matches made */ + /* XXX TODO: This should be a chunk, not a line */ + struct str ln; /* Current line */ + size_t lnstart; /* Position in line */ + size_t matchidx; /* Latest match index */ + int printed; /* Metadata printed? */ + bool binary; /* Binary file? */ + bool cntlines; /* Count lines? */ +}; + /* Flags passed to regcomp() and regexec() */ extern int cflags, eflags; @@ -141,4 +156,4 @@ void clearqueue(void); /* file.c */ void grep_close(struct file *f); struct file *grep_open(const char *path); -char *grep_fgetln(struct file *f, size_t *len); +char *grep_fgetln(struct file *f, struct parsec *pc); Modified: head/usr.bin/grep/util.c ============================================================================== --- head/usr.bin/grep/util.c Fri Jun 8 00:47:24 2018 (r334820) +++ head/usr.bin/grep/util.c Fri Jun 8 01:25:07 2018 (r334821) @@ -57,20 +57,6 @@ __FBSDID("$FreeBSD$"); static bool first_match = true; /* - * Parsing context; used to hold things like matches made and - * other useful bits - */ -struct parsec { - regmatch_t matches[MAX_MATCHES]; /* Matches made */ - /* XXX TODO: This should be a chunk, not a line */ - struct str ln; /* Current line */ - size_t lnstart; /* Position in line */ - size_t matchidx; /* Latest match index */ - int printed; /* Metadata printed? */ - bool binary; /* Binary file? */ -}; - -/* * Match printing context */ struct mprintc { @@ -276,7 +262,7 @@ procmatches(struct mprintc *mc, struct parsec *pc, boo if (mflag) { /* XXX TODO: Decrement by number of matched lines */ mcount -= 1; - if (mflag && mcount <= 0) + if (mcount <= 0) return (false); } } else if (mc->doctx) @@ -327,6 +313,7 @@ procfile(const char *fn) pc.ln.boff = 0; pc.ln.off = -1; pc.binary = f->binary; + pc.cntlines = false; memset(&mc, 0, sizeof(mc)); mc.printmatch = true; if ((pc.binary && binbehave == BINFILE_BIN) || cflag || qflag || @@ -334,6 +321,8 @@ procfile(const char *fn) mc.printmatch = false; if (mc.printmatch && (Aflag != 0 || Bflag != 0)) mc.doctx = true; + if (mc.printmatch && (Aflag != 0 || Bflag != 0 || mflag || nflag)) + pc.cntlines = true; mcount = mlimit; for (lines = 0; lines == 0 || !(lflag || qflag); ) { @@ -349,7 +338,7 @@ procfile(const char *fn) pc.ln.boff = 0; pc.ln.off += pc.ln.len + 1; /* XXX TODO: Grab a chunk */ - if ((pc.ln.dat = grep_fgetln(f, &pc.ln.len)) == NULL || + if ((pc.ln.dat = grep_fgetln(f, &pc)) == NULL || pc.ln.len == 0) break;
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201806080125.w581P71T097178>