I recently learned that our grep does not support the \<\> syntax for
word boundaries, only the somewhat more difficult to use [[:<:]] format.
It's fairly easy to convert one to the other however.

Index: grep.c
===================================================================
RCS file: /home/tedu/cvs/src/usr.bin/grep/grep.c,v
retrieving revision 1.44
diff -u -p -r1.44 grep.c
--- grep.c      8 Jul 2011 01:20:24 -0000       1.44
+++ grep.c      17 Jul 2011 15:38:58 -0000
@@ -163,6 +163,54 @@ struct option long_options[] =
        {NULL,                  no_argument,            NULL, 0}
 };
 
+#ifndef SMALL
+char *
+fix_word_boundaries(char *pat)
+{
+       size_t newlen;
+       int bs, repl;
+       char c, *newpat, *p, *r;
+
+       repl = 0;
+       p = pat;
+       while ((p = strstr(p, "\\<"))) {
+               p += 2;
+               repl++;
+       }
+       p = pat;
+       while ((p = strstr(p, "\\>"))) {
+               p += 2;
+               repl++;
+       }
+       if (!repl)
+               return pat;
+       newlen = strlen(pat) + 1 + repl * 5;
+       newpat = grep_malloc(newlen);
+       p = pat;
+       r = newpat;
+       bs = 0;
+       while ((c = *p++)) {
+               if (bs && (c == '<' || c == '>')) {
+                       /* overwrite previous backspace */
+                       snprintf(r-1, 8, "[[:%c:]]", c);
+                       r += 6;
+                       bs = 0;
+                       continue;
+               } else if (!bs && c == '\\') {
+                       bs = 1;
+               } else {
+                       bs = 0;
+               }
+               *r++ = c;
+       }
+       *r = 0;
+       if (newlen <= strlen(newpat))
+               abort();
+       free(pat);
+       return newpat;
+
+}
+#endif
 
 static void
 add_pattern(char *pat, size_t len)
@@ -198,6 +246,12 @@ add_pattern(char *pat, size_t len)
                pattern[patterns] = grep_malloc(len + 1);
                memcpy(pattern[patterns], pat, len);
                pattern[patterns][len] = '\0';
+#ifndef SMALL
+               if (!Fflag) {
+                       pattern[patterns] = 
fix_word_boundaries(pattern[patterns]);
+               }
+#endif
+
        }
        ++patterns;
 }

Reply via email to