summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTed Unangst <tedu@cvs.openbsd.org>2014-09-08 15:45:21 +0000
committerTed Unangst <tedu@cvs.openbsd.org>2014-09-08 15:45:21 +0000
commitfcfb3954c19b8e4128e762c0e1d30da5da5bc42f (patch)
tree14fa8ef0240a97746cbc5f7eada159b692faddfb
parent61c1a96f801d8483312f0db6653dcc0cc4ca7734 (diff)
add \<word\> support to regcomp. prompted by renewed interest from jsg
because such support is reportedly common and in somewhat wide use. undocumented for now because we don't endorse this. ok jsg millert
-rw-r--r--lib/libc/regex/regcomp.c30
1 files changed, 28 insertions, 2 deletions
diff --git a/lib/libc/regex/regcomp.c b/lib/libc/regex/regcomp.c
index d49b921302d..d52febf337d 100644
--- a/lib/libc/regex/regcomp.c
+++ b/lib/libc/regex/regcomp.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: regcomp.c,v 1.24 2014/05/06 15:48:38 tedu Exp $ */
+/* $OpenBSD: regcomp.c,v 1.25 2014/09/08 15:45:20 tedu Exp $ */
/*-
* Copyright (c) 1992, 1993, 1994 Henry Spencer.
* Copyright (c) 1992, 1993, 1994
@@ -81,6 +81,7 @@ static char p_b_coll_elem(struct parse *, int);
static char othercase(int);
static void bothcases(struct parse *, int);
static void ordinary(struct parse *, int);
+static void backslash(struct parse *, int);
static void nonnewline(struct parse *);
static void repeat(struct parse *, sopno, int, int);
static int seterr(struct parse *, int);
@@ -349,7 +350,7 @@ p_ere_exp(struct parse *p)
case '\\':
REQUIRE(MORE(), REG_EESCAPE);
c = GETNEXT();
- ordinary(p, c);
+ backslash(p, c);
break;
case '{': /* okay as ordinary except if digit follows */
REQUIRE(!MORE() || !isdigit((uch)PEEK()), REG_BADRPT);
@@ -501,6 +502,12 @@ p_simp_re(struct parse *p,
case '[':
p_bracket(p);
break;
+ case BACKSL|'<':
+ EMIT(OBOW, 0);
+ break;
+ case BACKSL|'>':
+ EMIT(OEOW, 0);
+ break;
case BACKSL|'{':
SETERROR(REG_BADRPT);
break;
@@ -896,6 +903,25 @@ ordinary(struct parse *p, int ch)
}
/*
+ * do something magic with this character, but only if it's extra magic
+ */
+static void
+backslash(struct parse *p, int ch)
+{
+ switch (ch) {
+ case '<':
+ EMIT(OBOW, 0);
+ break;
+ case '>':
+ EMIT(OEOW, 0);
+ break;
+ default:
+ ordinary(p, ch);
+ break;
+ }
+}
+
+/*
- nonnewline - emit REG_NEWLINE version of OANY
*
* Boy, is this implementation ever a kludge...