summaryrefslogtreecommitdiffstats
path: root/gnu/usr.bin/grep/search.c
diff options
context:
space:
mode:
Diffstat (limited to 'gnu/usr.bin/grep/search.c')
-rw-r--r--gnu/usr.bin/grep/search.c64
1 files changed, 31 insertions, 33 deletions
diff --git a/gnu/usr.bin/grep/search.c b/gnu/usr.bin/grep/search.c
index cf51e3b..8fb3af0 100644
--- a/gnu/usr.bin/grep/search.c
+++ b/gnu/usr.bin/grep/search.c
@@ -42,7 +42,6 @@ struct matcher matchers[] = {
{ "default", Gcompile, EGexecute },
{ "grep", Gcompile, EGexecute },
{ "egrep", Ecompile, EGexecute },
- { "posix-egrep", Ecompile, EGexecute },
{ "awk", Ecompile, EGexecute },
{ "fgrep", Fcompile, Fexecute },
{ 0, 0, 0 },
@@ -55,7 +54,7 @@ struct matcher matchers[] = {
static struct dfa dfa;
/* Regex compiled regexp. */
-static struct re_pattern_buffer regex;
+static struct re_pattern_buffer regexbuf;
/* KWset compiled pattern. For Ecompile and Gcompile, we compile
a list of strings, at least one of which is known to occur in
@@ -134,9 +133,9 @@ Gcompile(pattern, size)
const char *err;
re_set_syntax(RE_SYNTAX_GREP | RE_HAT_LISTS_NOT_NEWLINE);
- dfasyntax(RE_SYNTAX_GREP | RE_HAT_LISTS_NOT_NEWLINE, match_icase);
+ dfasyntax(RE_SYNTAX_GREP | RE_HAT_LISTS_NOT_NEWLINE, match_icase, eolbyte);
- if ((err = re_compile_pattern(pattern, size, &regex)) != 0)
+ if ((err = re_compile_pattern(pattern, size, &regexbuf)) != 0)
fatal(err, 0);
/* In the match_words and match_lines cases, we use a different pattern
@@ -149,7 +148,8 @@ Gcompile(pattern, size)
(^|[^A-Za-z_])(userpattern)([^A-Za-z_]|$).
In the whole-line case, we use the pattern:
^(userpattern)$.
- BUG: Using [A-Za-z_] is locale-dependent! */
+ BUG: Using [A-Za-z_] is locale-dependent!
+ So will use [:alnum:] */
char *n = malloc(size + 50);
int i = 0;
@@ -159,14 +159,14 @@ Gcompile(pattern, size)
if (match_lines)
strcpy(n, "^\\(");
if (match_words)
- strcpy(n, "\\(^\\|[^0-9A-Za-z_]\\)\\(");
+ strcpy(n, "\\(^\\|[^[:alnum:]_]\\)\\(");
i = strlen(n);
memcpy(n + i, pattern, size);
i += size;
if (match_words)
- strcpy(n + i, "\\)\\([^0-9A-Za-z_]\\|$\\)");
+ strcpy(n + i, "\\)\\([^[:alnum:]_]\\|$\\)");
if (match_lines)
strcpy(n + i, "\\)$");
@@ -186,23 +186,18 @@ Ecompile(pattern, size)
{
const char *err;
- if (strcmp(matcher, "posix-egrep") == 0)
- {
- re_set_syntax(RE_SYNTAX_POSIX_EGREP);
- dfasyntax(RE_SYNTAX_POSIX_EGREP, match_icase);
- }
- else if (strcmp(matcher, "awk") == 0)
+ if (strcmp(matcher, "awk") == 0)
{
re_set_syntax(RE_SYNTAX_AWK);
- dfasyntax(RE_SYNTAX_AWK, match_icase);
+ dfasyntax(RE_SYNTAX_AWK, match_icase, eolbyte);
}
else
{
- re_set_syntax(RE_SYNTAX_EGREP);
- dfasyntax(RE_SYNTAX_EGREP, match_icase);
+ re_set_syntax (RE_SYNTAX_POSIX_EGREP);
+ dfasyntax (RE_SYNTAX_POSIX_EGREP, match_icase, eolbyte);
}
- if ((err = re_compile_pattern(pattern, size, &regex)) != 0)
+ if ((err = re_compile_pattern(pattern, size, &regexbuf)) != 0)
fatal(err, 0);
/* In the match_words and match_lines cases, we use a different pattern
@@ -215,7 +210,8 @@ Ecompile(pattern, size)
(^|[^A-Za-z_])(userpattern)([^A-Za-z_]|$).
In the whole-line case, we use the pattern:
^(userpattern)$.
- BUG: Using [A-Za-z_] is locale-dependent! */
+ BUG: Using [A-Za-z_] is locale-dependent!
+ so will use the char class */
char *n = malloc(size + 50);
int i = 0;
@@ -225,14 +221,14 @@ Ecompile(pattern, size)
if (match_lines)
strcpy(n, "^(");
if (match_words)
- strcpy(n, "(^|[^0-9A-Za-z_])(");
+ strcpy(n, "(^|[^[:alnum:]_])(");
i = strlen(n);
memcpy(n + i, pattern, size);
i += size;
if (match_words)
- strcpy(n + i, ")([^0-9A-Za-z_]|$)");
+ strcpy(n + i, ")([^[:alnum:]_]|$)");
if (match_lines)
strcpy(n + i, ")$");
@@ -252,6 +248,7 @@ EGexecute(buf, size, endp)
char **endp;
{
register char *buflim, *beg, *end, save;
+ char eol = eolbyte;
int backref, start, len;
struct kwsmatch kwsm;
static struct re_registers regs; /* This is static on account of a BRAIN-DEAD
@@ -269,10 +266,10 @@ EGexecute(buf, size, endp)
goto failure;
/* Narrow down to the line containing the candidate, and
run it through DFA. */
- end = memchr(beg, '\n', buflim - beg);
+ end = memchr(beg, eol, buflim - beg);
if (!end)
end = buflim;
- while (beg > buf && beg[-1] != '\n')
+ while (beg > buf && beg[-1] != eol)
--beg;
save = *end;
if (kwsm.index < lastexact)
@@ -296,10 +293,10 @@ EGexecute(buf, size, endp)
if (!beg)
goto failure;
/* Narrow down to the line we've found. */
- end = memchr(beg, '\n', buflim - beg);
+ end = memchr(beg, eol, buflim - beg);
if (!end)
end = buflim;
- while (beg > buf && beg[-1] != '\n')
+ while (beg > buf && beg[-1] != eol)
--beg;
/* Successful, no backreferences encountered! */
if (!backref)
@@ -307,8 +304,8 @@ EGexecute(buf, size, endp)
}
/* If we've made it to this point, this means DFA has seen
a probable match, and we need to run it through Regex. */
- regex.not_eol = 0;
- if ((start = re_search(&regex, beg, end - beg, 0, end - beg, &regs)) >= 0)
+ regexbuf.not_eol = 0;
+ if ((start = re_search(&regexbuf, beg, end - beg, 0, end - beg, &regs)) >= 0)
{
len = regs.end[0] - start;
if ((!match_lines && !match_words)
@@ -331,8 +328,8 @@ EGexecute(buf, size, endp)
{
/* Try a shorter length anchored at the same place. */
--len;
- regex.not_eol = 1;
- len = re_match(&regex, beg, start + len, start, &regs);
+ regexbuf.not_eol = 1;
+ len = re_match(&regexbuf, beg, start + len, start, &regs);
}
if (len <= 0)
{
@@ -340,8 +337,8 @@ EGexecute(buf, size, endp)
if (start == end - beg)
break;
++start;
- regex.not_eol = 0;
- start = re_search(&regex, beg, end - beg,
+ regexbuf.not_eol = 0;
+ start = re_search(&regexbuf, beg, end - beg,
start, end - beg - start, &regs);
len = regs.end[0] - start;
}
@@ -390,6 +387,7 @@ Fexecute(buf, size, endp)
{
register char *beg, *try, *end;
register size_t len;
+ char eol = eolbyte;
struct kwsmatch kwsmatch;
for (beg = buf; beg <= buf + size; ++beg)
@@ -399,9 +397,9 @@ Fexecute(buf, size, endp)
len = kwsmatch.size[0];
if (match_lines)
{
- if (beg > buf && beg[-1] != '\n')
+ if (beg > buf && beg[-1] != eol)
continue;
- if (beg + len < buf + size && beg[len] != '\n')
+ if (beg + len < buf + size && beg[len] != eol)
continue;
goto success;
}
@@ -425,7 +423,7 @@ Fexecute(buf, size, endp)
return 0;
success:
- if ((end = memchr(beg + len, '\n', (buf + size) - (beg + len))) != 0)
+ if ((end = memchr(beg + len, eol, (buf + size) - (beg + len))) != 0)
++end;
else
end = buf + size;
OpenPOWER on IntegriCloud