aboutsummaryrefslogtreecommitdiff
path: root/external/njs_regex.c
diff options
context:
space:
mode:
Diffstat (limited to 'external/njs_regex.c')
-rw-r--r--external/njs_regex.c34
1 files changed, 34 insertions, 0 deletions
diff --git a/external/njs_regex.c b/external/njs_regex.c
index a118666b..cd45afc0 100644
--- a/external/njs_regex.c
+++ b/external/njs_regex.c
@@ -114,6 +114,11 @@ njs_regex_escape(njs_mp_t *mp, njs_str_t *text)
for (p = start; p < end; p++) {
switch (*p) {
+ case '\\':
+ p += 1;
+
+ break;
+
case '[':
if (p + 1 < end && p[1] == ']') {
p += 1;
@@ -122,6 +127,11 @@ njs_regex_escape(njs_mp_t *mp, njs_str_t *text)
} else if (p + 2 < end && p[1] == '^' && p[2] == ']') {
p += 2;
anychars += 1;
+
+ } else {
+ while (p < end && *p != ']') {
+ p += 1;
+ }
}
break;
@@ -146,6 +156,15 @@ njs_regex_escape(njs_mp_t *mp, njs_str_t *text)
for (p = start; p < end; p++) {
switch (*p) {
+ case '\\':
+ *dst++ = *p;
+ if (p + 1 < end) {
+ p += 1;
+ *dst++ = *p;
+ }
+
+ continue;
+
case '[':
if (p + 1 < end && p[1] == ']') {
p += 1;
@@ -156,12 +175,27 @@ njs_regex_escape(njs_mp_t *mp, njs_str_t *text)
p += 2;
dst = njs_cpymem(dst, "[\\s\\S]", 6);
continue;
+
+ } else {
+ *dst++ = *p++; /* Copy '['. */
+
+ while (p < end && *p != ']') {
+ *dst++ = *p++;
+ }
+
+ if (p < end) {
+ *dst++ = *p; /* Copy ']'. */
+ }
+
+ continue;
}
}
*dst++ = *p;
}
+ njs_assert(dst == text->start + text->length);
+
return NJS_OK;
#else