Merge pull request #3771 from cesanta/mg_match

Improve mg_match checks
This commit is contained in:
Sergio R. Caprile authored and GitHub committed 2026-11-12 10:35:30 -03:00
commit 21b998c882
3 files changed
+16 -4

No files matched your search

+1 -2
View File
@@ -17114,8 +17114,7 @@ bool mg_match(struct mg_str s, struct mg_str p, struct mg_str *caps) {
if (caps && !caps->buf) caps->len = 0, caps->buf = &s.buf[j]; // Init cap
ni = i++, nj = j + 1;
} else if (nj > 0 && nj <= s.len &&
((ni < p.len && p.buf[ni] == '#') ||
(j < s.len && s.buf[j] != '/'))) {
((ni < p.len && p.buf[ni] == '#') || s.buf[nj - 1] != '/')) {
i = ni, j = nj;
if (caps && caps->buf == NULL && caps->len == 0) {
caps--, caps->len = 0; // Restart previous cap
+1 -2
View File
@@ -88,8 +88,7 @@ bool mg_match(struct mg_str s, struct mg_str p, struct mg_str *caps) {
if (caps && !caps->buf) caps->len = 0, caps->buf = &s.buf[j]; // Init cap
ni = i++, nj = j + 1;
} else if (nj > 0 && nj <= s.len &&
((ni < p.len && p.buf[ni] == '#') ||
(j < s.len && s.buf[j] != '/'))) {
((ni < p.len && p.buf[ni] == '#') || s.buf[nj - 1] != '/')) {
i = ni, j = nj;
if (caps && caps->buf == NULL && caps->len == 0) {
caps--, caps->len = 0; // Restart previous cap
+14
View File
@@ -72,6 +72,20 @@ static void test_match(void) {
ASSERT(mg_match(mg_str_n("caabxa", 6), mg_str_n("#aa#bb#", 7), NULL) == 0);
ASSERT(mg_match(mg_str_n("a__b_c", 6), mg_str_n("a*b*c", 5), NULL) == 1);
ASSERT(mg_match(mg_str("a/b/d/c"), mg_str("a/*/c"), NULL) == false);
ASSERT(mg_match(mg_str("a/b/c"), mg_str("a/*/c"), NULL) == true);
ASSERT(mg_match(mg_str("a/b/d/c"), mg_str("a/#/c"), NULL) == true);
{
struct mg_str caps[2];
ASSERT(mg_match(mg_str("a/b/d/c"), mg_str("a/*/c"), caps) == false);
ASSERT(mg_match(mg_str("a/b/c"), mg_str("a/*/c"), caps) == true);
ASSERT(mg_strcmp(caps[0], mg_str("b")) == 0);
ASSERT(mg_strcmp(caps[1], mg_str("")) == 0);
ASSERT(mg_match(mg_str("a/b/d/c"), mg_str("a/#/c"), caps) == true);
ASSERT(mg_strcmp(caps[0], mg_str("b/d")) == 0);
ASSERT(mg_strcmp(caps[1], mg_str("")) == 0);
}
{
char *ae_value = (char *) malloc(1); // Exact size for ASAN
ae_value[0] = 'g';