Author: gabor
Date: Sun Jun 12 12:51:58 2011
New Revision: 223009
URL: http://svn.freebsd.org/changeset/base/223009

Log:
  - Use REG_NOSUB to bypass submatch counting when not necessary. This may
    yield in somewhat better performance in a few cases.
  
  Approved by:  delphij (mentor)

Modified:
  head/usr.bin/grep/grep.c
  head/usr.bin/grep/util.c

Modified: head/usr.bin/grep/grep.c
==============================================================================
--- head/usr.bin/grep/grep.c    Sun Jun 12 12:44:02 2011        (r223008)
+++ head/usr.bin/grep/grep.c    Sun Jun 12 12:51:58 2011        (r223009)
@@ -73,7 +73,7 @@ const char    *errstr[] = {
 };
 
 /* Flags passed to regcomp() and regexec() */
-int             cflags = 0;
+int             cflags = REG_NOSUB;
 int             eflags = REG_STARTEND;
 
 /* Shortcut for matching all cases like empty regex */
@@ -519,6 +519,7 @@ main(int argc, char *argv[])
                        break;
                case 'o':
                        oflag = true;
+                       cflags &= ~REG_NOSUB;
                        break;
                case 'p':
                        linkbehave = LINK_SKIP;
@@ -552,9 +553,11 @@ main(int argc, char *argv[])
                        break;
                case 'w':
                        wflag = true;
+                       cflags &= ~REG_NOSUB;
                        break;
                case 'x':
                        xflag = true;
+                       cflags &= ~REG_NOSUB;
                        break;
                case 'Z':
                        filebehave = FILE_GZIP;
@@ -588,6 +591,7 @@ main(int argc, char *argv[])
                            strcasecmp("none", optarg) != 0 &&
                            strcasecmp("no", optarg) != 0)
                                errx(2, getstr(3), "--color");
+                       cflags &= ~REG_NOSUB;
                        break;
                case LABEL_OPT:
                        label = optarg;

Modified: head/usr.bin/grep/util.c
==============================================================================
--- head/usr.bin/grep/util.c    Sun Jun 12 12:44:02 2011        (r223008)
+++ head/usr.bin/grep/util.c    Sun Jun 12 12:51:58 2011        (r223009)
@@ -309,7 +309,9 @@ procline(struct str *l, int nottext)
                                        r = regexec(&r_pattern[i], l->dat, 1,
                                            &pmatch, eflags);
                                r = (r == 0) ? 0 : REG_NOMATCH;
-                               st = pmatch.rm_eo;
+                               st = (cflags & REG_NOSUB)
+                                       ? (size_t)l->len
+                                       : (size_t)pmatch.rm_eo;
                                if (r == REG_NOMATCH)
                                        continue;
                                /* Check for full match */
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to