Handle leading zeroes in expr_match

This commit is contained in:
dmiller 2023-12-14 19:13:21 +00:00
parent e47b742669
commit 96995a92d9
2 changed files with 66 additions and 5 deletions

View file

@ -354,30 +354,59 @@ bool expr_match(const char *val, size_t vlen, const char *expr, size_t explen, b
if ((explen - (p - expr)) == sublen && !strncmp(subval, p, sublen)) {
return true;
}
else {
goto next_expr;
}
}
// Now sublen is the length of the relevant portion of expr
sublen = q ? q - p : explen - (p - expr);
if (isxdigit(*subval)) {
while (*subval == '0' && vlen > 1) {
subval++;
vlen--;
}
if (*p == '>') {
if ((vlen > sublen - 1)
|| (vlen == sublen - 1 && strncmp(subval, p + 1, vlen) > 0)) {
do {
p++;
sublen--;
} while (*p == '0' && sublen > 1);
if ((vlen > sublen)
|| (vlen == sublen && strncmp(subval, p, vlen) > 0)) {
return true;
}
goto next_expr;
}
else if (*p == '<') {
if ((vlen < sublen - 1)
|| (vlen == sublen - 1 && strncmp(subval, p + 1, vlen) < 0)) {
do {
p++;
sublen--;
} while (*p == '0' && sublen > 1);
if ((vlen < sublen)
|| (vlen == sublen && strncmp(subval, p, vlen) < 0)) {
return true;
}
goto next_expr;
} else {
}
else if (isxdigit(*p)) {
while (sublen > 1 && *p == '0') {
p++;
sublen--;
}
q1 = strchr_p(p, q ? q : p_end, '-');
if (q1 != NULL) {
if (q1 == p) {
p--;
sublen++;
}
size_t sublen1 = q1 - p;
if ((vlen > sublen1)
|| (vlen == sublen1 && strncmp(subval, p, vlen) >= 0)) {
p = q1 + 1;
sublen -= (sublen1 + 1);
while (sublen > 1 && *p == '0') {
p++;
sublen--;
}
if ((vlen < sublen)
|| (vlen == sublen && strncmp(subval, p, vlen) <= 0)) {
return true;
@ -386,6 +415,10 @@ bool expr_match(const char *val, size_t vlen, const char *expr, size_t explen, b
goto next_expr;
}
}
else {
// subval isxdigit, but expr doesn't start with xdigit or < or >
goto next_expr;
}
}
//fprintf(stderr, "cmp(%-.*s, %-.*s)\n", sublen, p, vlen, subval);
if (vlen == sublen && !strncmp(p, subval, vlen)) {

View file

@ -153,6 +153,34 @@ const struct expr_test tests[] = {
{"M[500|5B4]ST11NW[7-9]", "M500ST11NWA", false},
{"M[500|5B4]ST11NW[7-9]", "M5B40ST11NW9", false},
{"A|20-22", "A", true},
{"00-05", "0", true},
{"00-05", "4", true},
{"00-05", "5", true},
{">0000", "5", true},
{">0000", "0", false},
{"<6", "00", true},
{"<06", "07", false},
{"<06", "7", false},
{"0", "00", true},
{"1", "01", true},
{"1", "001", true},
{"1", "0001", true},
{"00", "0", true},
{"01", "1", true},
{"001", "1", true},
{"0001", "1", true},
{"A", "0A", true},
{"A", "00A", true},
{"A", "000A", true},
{"0A", "A", true},
{"00A", "A", true},
{"000A", "A", true},
{"1", "0A", false},
{"1", "00A", false},
{"1", "000A", false},
{"01", "A", false},
{"001", "A", false},
{"0001", "A", false},
{"", "", true}
};