summaryrefslogtreecommitdiff
path: root/src/regex-emacs.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/regex-emacs.c')
-rw-r--r--src/regex-emacs.c21
1 files changed, 20 insertions, 1 deletions
diff --git a/src/regex-emacs.c b/src/regex-emacs.c
index 694431c95e2..38824370e05 100644
--- a/src/regex-emacs.c
+++ b/src/regex-emacs.c
@@ -818,7 +818,8 @@ typedef enum
REG_ESIZE, /* Compiled pattern bigger than 2^16 bytes. */
REG_ERPAREN, /* Unmatched ) or \); not returned from regcomp. */
REG_ERANGEX, /* Range striding over charsets. */
- REG_ESIZEBR /* n or m too big in \{n,m\} */
+ REG_ESIZEBR, /* n or m too big in \{n,m\} */
+ REG_ECLASSBR, /* Missing [] around [:class:]. */
} reg_errcode_t;
static const char *re_error_msgid[] =
@@ -842,6 +843,7 @@ static const char *re_error_msgid[] =
[REG_ERPAREN] = "Unmatched ) or \\)",
[REG_ERANGEX ] = "Range striding over charsets",
[REG_ESIZEBR ] = "Invalid content of \\{\\}",
+ [REG_ECLASSBR] = "Class syntax is [[:digit:]]; missing brackets",
};
/* For 'regs_allocated'. */
@@ -2000,6 +2002,23 @@ regex_compile (re_char *pattern, ptrdiff_t size,
laststart = b;
+ /* Check for the mistake of forgetting the extra square brackets,
+ as in "[:alpha:]". */
+ if (*p == ':')
+ {
+ re_char *q = p + 1;
+ while (q != pend && *q != ']')
+ {
+ if (*q == ':')
+ {
+ if (q + 1 != pend && q[1] == ']' && q > p + 1)
+ FREE_STACK_RETURN (REG_ECLASSBR);
+ break;
+ }
+ q++;
+ }
+ }
+
/* Test '*p == '^' twice, instead of using an if
statement, so we need only one BUF_PUSH. */
BUF_PUSH (*p == '^' ? charset_not : charset);