diff --git a/osscan.cc b/osscan.cc index 05555101a..18967765b 100644 --- a/osscan.cc +++ b/osscan.cc @@ -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)) { diff --git a/tests/expr_match_test.cc b/tests/expr_match_test.cc index 2cc11d549..b92f21fd1 100644 --- a/tests/expr_match_test.cc +++ b/tests/expr_match_test.cc @@ -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} };