aboutsummaryrefslogtreecommitdiff
path: root/jimregexp.c
diff options
context:
space:
mode:
authorSteve Bennett <steveb@workware.net.au>2013-11-10 11:07:20 +1000
committerSteve Bennett <steveb@workware.net.au>2016-02-02 12:48:14 +1000
commit1ea06e8f2b15842aa68f2648b7ba70ab1038cf83 (patch)
treede83536b167d10785ccce054e2ae656701551ab4 /jimregexp.c
parent7d0ac6440939ca38cf2f7be89c856f76b0fb9f9a (diff)
downloadjimtcl-1ea06e8f2b15842aa68f2648b7ba70ab1038cf83.zip
jimtcl-1ea06e8f2b15842aa68f2648b7ba70ab1038cf83.tar.gz
jimtcl-1ea06e8f2b15842aa68f2648b7ba70ab1038cf83.tar.bz2
regexp: add support for \D, \W and \S
These are the negated versions of \d, \w and \s Signed-off-by: Steve Bennett <steveb@workware.net.au>
Diffstat (limited to 'jimregexp.c')
-rw-r--r--jimregexp.c14
1 files changed, 9 insertions, 5 deletions
diff --git a/jimregexp.c b/jimregexp.c
index f1b7cd3..e3f7a22 100644
--- a/jimregexp.c
+++ b/jimregexp.c
@@ -797,7 +797,8 @@ static int regatom(regex_t *preg, int *flagp)
preg->err = REG_ERR_COUNT_FOLLOWS_NOTHING;
return 0;
case '\\':
- switch (*preg->regparse++) {
+ ch = *preg->regparse++;
+ switch (ch) {
case '\0':
preg->err = REG_ERR_TRAILING_BACKSLASH;
return 0;
@@ -810,13 +811,15 @@ static int regatom(regex_t *preg, int *flagp)
ret = regnode(preg, WORDZ);
break;
case 'd':
- ret = regnode(preg, ANYOF);
+ case 'D':
+ ret = regnode(preg, ch == 'd' ? ANYOF : ANYBUT);
reg_addrange(preg, '0', '9');
regc(preg, '\0');
*flagp |= HASWIDTH|SIMPLE;
break;
case 'w':
- ret = regnode(preg, ANYOF);
+ case 'W':
+ ret = regnode(preg, ch == 'w' ? ANYOF : ANYBUT);
if ((preg->cflags & REG_ICASE) == 0) {
reg_addrange(preg, 'a', 'z');
}
@@ -827,7 +830,8 @@ static int regatom(regex_t *preg, int *flagp)
*flagp |= HASWIDTH|SIMPLE;
break;
case 's':
- ret = regnode(preg, ANYOF);
+ case 'S':
+ ret = regnode(preg, ch == 's' ? ANYOF : ANYBUT);
reg_addrange_str(preg," \t\r\n\f\v");
regc(preg, '\0');
*flagp |= HASWIDTH|SIMPLE;
@@ -865,7 +869,7 @@ static int regatom(regex_t *preg, int *flagp)
/* Non-trailing backslash.
* Is this a special escape, or a regular escape?
*/
- if (strchr("<>mMwds", preg->regparse[n])) {
+ if (strchr("<>mMwWdDsS", preg->regparse[n])) {
/* A special escape. All done with EXACTLY */
break;
}