diff options
author | Paolo Bonzini <bonzini@gnu.org> | 2005-01-26 18:11:02 +0000 |
---|---|---|
committer | Paolo Bonzini <bonzini@gnu.org> | 2008-01-09 16:11:43 +0100 |
commit | 87cdf728902c3cf3290e4452e7d550082b53aa34 (patch) | |
tree | 650b298f755520e05abcc9cb7b04fe61de8761ae /lib | |
parent | b48e80e8ad4f29b6447d2726f72992c0a44649d2 (diff) | |
download | sed-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.c | 11 | ||||
-rw-r--r-- | lib/regex_internal.h | 4 |
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 |