summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorPaolo Bonzini <bonzini@gnu.org>2005-01-26 18:11:02 +0000
committerPaolo Bonzini <bonzini@gnu.org>2008-01-09 16:11:43 +0100
commit87cdf728902c3cf3290e4452e7d550082b53aa34 (patch)
tree650b298f755520e05abcc9cb7b04fe61de8761ae /lib
parentb48e80e8ad4f29b6447d2726f72992c0a44649d2 (diff)
downloadsed-87cdf728902c3cf3290e4452e7d550082b53aa34.tar.gz
fix meaning of \B
2005-01-26 Paolo Bonzini <bonzini@gnu.org> * posix/regcomp.c (peek_token): Fix ctx_type for \B. (parse_expression): Lower token->opr.ctx_type == NOT_WORD_DELIM. * posix/regex_internal.h (re_context_type): Add NOT_WORD_DELIM and OUTSIDE_WORD. * posix/PCRE.tests: Adjust \B tests to check if it matches outside a word. git-archimport-id: bonzini@gnu.org--2004b/sed--stable--4.1--patch-36
Diffstat (limited to 'lib')
-rw-r--r--lib/regcomp.c11
-rw-r--r--lib/regex_internal.h4
2 files changed, 9 insertions, 6 deletions
diff --git a/lib/regcomp.c b/lib/regcomp.c
index 586ebc7..93a6d76 100644
--- a/lib/regcomp.c
+++ b/lib/regcomp.c
@@ -1864,7 +1864,7 @@ peek_token (token, input, syntax)
if (!(syntax & RE_NO_GNU_OPS))
{
token->type = ANCHOR;
- token->opr.ctx_type = INSIDE_WORD;
+ token->opr.ctx_type = NOT_WORD_DELIM;
}
break;
case 'w':
@@ -2352,15 +2352,16 @@ parse_expression (regexp, preg, token, syntax, nest, err)
break;
case ANCHOR:
if ((token->opr.ctx_type
- & (WORD_DELIM | INSIDE_WORD | WORD_FIRST | WORD_LAST))
+ & (WORD_DELIM | NOT_WORD_DELIM | WORD_FIRST | WORD_LAST))
&& dfa->word_ops_used == 0)
init_word_char (dfa);
- if (token->opr.ctx_type == WORD_DELIM)
+ if (token->opr.ctx_type >= DUMMY_CONSTRAINT)
{
+ int delim = (token->opr.ctx_type == WORD_DELIM);
bin_tree_t *tree_first, *tree_last;
- token->opr.ctx_type = WORD_FIRST;
+ token->opr.ctx_type = delim ? WORD_FIRST : INSIDE_WORD;
tree_first = create_token_tree (dfa, NULL, NULL, token);
- token->opr.ctx_type = WORD_LAST;
+ token->opr.ctx_type = delim ? WORD_LAST : OUTSIDE_WORD;
tree_last = create_token_tree (dfa, NULL, NULL, token);
tree = create_tree (dfa, tree_first, tree_last, OP_ALT);
if (BE (tree_first == NULL || tree_last == NULL || tree == NULL, 0))
diff --git a/lib/regex_internal.h b/lib/regex_internal.h
index ae77aeb..02bdec7 100644
--- a/lib/regex_internal.h
+++ b/lib/regex_internal.h
@@ -148,13 +148,15 @@ static inline void bitset_mask (bitset dest, const bitset src);
typedef enum
{
INSIDE_WORD = PREV_WORD_CONSTRAINT | NEXT_WORD_CONSTRAINT,
+ OUTSIDE_WORD = PREV_NOTWORD_CONSTRAINT | NEXT_NOTWORD_CONSTRAINT,
WORD_FIRST = PREV_NOTWORD_CONSTRAINT | NEXT_WORD_CONSTRAINT,
WORD_LAST = PREV_WORD_CONSTRAINT | NEXT_NOTWORD_CONSTRAINT,
LINE_FIRST = PREV_NEWLINE_CONSTRAINT,
LINE_LAST = NEXT_NEWLINE_CONSTRAINT,
BUF_FIRST = PREV_BEGBUF_CONSTRAINT,
BUF_LAST = NEXT_ENDBUF_CONSTRAINT,
- WORD_DELIM = DUMMY_CONSTRAINT
+ WORD_DELIM = DUMMY_CONSTRAINT,
+ NOT_WORD_DELIM = DUMMY_CONSTRAINT << 1,
} re_context_type;
typedef struct