#include "rrex4.h"
#include "rtest.h"
#include "rbench.h"
#include <regex.h>
bool bench_r4(unsigned int times, char *str, char *expr) {
RBENCH(times, {
r4_t *r = r4(str, expr);
if (r->valid == false) {
printf("Bench r4 error\n");
exit(1);
}
r4_free(r);
});
return true;
}
void bench_c(unsigned int times, char *str, char *expr) {
regex_t regex;
if (regcomp(&regex, expr, REG_EXTENDED)) {
printf("Creg: error in regular expression.\n");
exit(1);
}
RBENCH(times, {
if (regexec(&regex, str, 0, NULL, 0)) {
printf("Creg: error executing regular expression.\n");
exit(1);
}
});
regfree(&regex);
}
bool bench(unsigned int times, char *str, char *expr) {
printf("%d:(%s)<%s>\n", times, str, expr);
printf("c:");
bench_c(times, str, expr);
printf("r:");
bench_r4(times, str, expr);
return true;
}
void test_r4_next() {
r4_t *r = r4_new();
char *str = "abcdefghijklmnop";
char *reg = "(\\w\\w\\w\\w)";
r = r4(str, reg);
assert(r->valid);
assert(r->match_count == 1);
assert(!strcmp(r->matches[0], "abcd"));
// Again with same regex as parameter
r = r4_next(r, reg);
assert(r->valid);
assert(r->match_count == 1);
assert(!strcmp(r->matches[0], "efgh"));
// Again with same regex as parameter
r = r4_next(r, reg);
assert(r->valid);
assert(r->match_count == 1);
assert(!strcmp(r->matches[0], "ijkl"));
// Reuse expression, NULL parameter
r = r4_next(r, NULL);
assert(r->valid);
assert(r->match_count == 1);
assert(!strcmp(r->matches[0], "mnop"));
// No results using r4_next
r = r4_next(r, NULL);
assert(r->valid);
assert(r->match_count == 0);
// Again no results using r4_next, Shouldn't crash
r = r4_next(r, NULL);
assert(r->valid);
assert(r->match_count == 0);
r4_free(r);
}
void bench_all(unsigned int times) {
assert(bench(times, "suvw",
"[abcdefghijklmnopqrstuvw][abcdefghijklmnopqrstuvw]["
"abcdefghijklmnopqrstuvw][abcdefghijklmnopqrstuvw]"));
assert(bench(times, "ponyyy", "^p+o.*yyy$$$$"));
assert(bench(times, " ponyyzd", "p+o.*yyzd$$$$"));
assert(bench(times, "abc", "def|gek|abc"));
assert(bench(times, "abc", "def|a?b?c|def"));
assert(bench(times, "NL18RABO0322309700", "([A-Z]{2})([0-9]{2})([A-Z]{4}[0-9])([0-9]+)$"));
}
bool r4_match_stats(char *str, char *expr) {
r4_t *r = r4(str, expr);
bool result = r->valid;
printf("%d:(%s)<%s>\n", r->validation_count, r->_str, r->_expr);
for (unsigned i = 0; i < r->match_count; i++) {
printf(" - match: \"%s\"\n", r->matches[i]);
}
r4_free(r);
return result;
}
int main() {
assert(r4_match_stats("NL18RABO0322309700", "(\\w{2})(\\d{2})(\\w{4}\\d)(\\d{10})"));
unsigned int times = 1000;
bench_all(times);
RBENCH(1, {
assert(r4_match_stats("#define DEFINETEST 1\n", "#define\\s+(\\w[\\d\\w_]+)\\s+([\\w\\d_]+)"));
assert(r4_match_stats("#define DEFINETEST 1\n", "#define\\s+(\\w[\\d\\w_]+)\\s+([\\w\\d_]+)"));
assert(r4_match_stats("ponyyy", "^p+o.*yyy$$$$"));
assert(!r4_match_stats("ponyyy", "p%+o.*yyy$$$$"));
assert(!r4_match_stats("ponyyyd", "^p+o.*yyz$$$$"));
assert(r4_match_stats("123", "[0-2][2-2][1-3]$"));
assert(r4_match_stats("aaaabC5", "(a)(\\w)a*(a)\\w[A-Z][0-9]$"));
assert(r4_match_stats("abcdeeeeee", "ab(cdeee)e"));
assert(r4_match_stats("1234567", "12(.*)67$"));
assert(r4_match_stats("12111678993", "12(.*)67(.*)3$"));
assert(r4_match_stats("NL17RABO0322309700", "NL(.*)R(.*)0(.*)0(.*)0$"));
assert(r4_match_stats("NL18RABO0322309700", "(\\w{2})(\\d{2})(\\w{4}\\d)(\\d+)$"));
assert(r4_match_stats("NL18RABO0322309700garbage", "(\\w{2})(\\d{2})(\\w{4}\\d)(\\d+)"));
assert(r4_match_stats("NL18RABO0322309700", "(\\w{2})(\\d{2})(\\w{4}\\d)(\\d+)$"));
assert(r4_match_stats(" NL18RABO0322309700", "(\\w{2})(\\d{2})(\\w{4}\\d)(\\d+)$"));
assert(r4_match_stats(" NL18RABO0322309700", "(\\w{2})(\\d{2})(\\w{4}\\d)(\\d+)$"));
assert(r4_match_stats("NL18RABO0", "(\\w\\w)(\\d\\d)(\\w\\w\\w\\w\\d)$"));
assert(r4_match_stats("q", "\\q$"));
assert(r4_match_stats("ab123", "[a-z0-9]+$"));
assert(r4_match_stats("ppppony", "p*pppony"));
assert(r4_match_stats("aa", "a{2}$"));
assert(r4_match_stats("A23", "[0-2A-z][2-2][1-3]$"));
assert(r4_match_stats("z23", "[0-2A-z][2-2][1-3]$"));
assert(r4_match_stats("r23", "[0-2Ar][2-2][1-3]$"));
assert(r4_match_stats("test", "\\w\\w\\w\\w$"));
assert(!r4_match_stats("test", "\\W\\w\\w\\w$"));
assert(r4_match_stats("1est", "\\W\\w\\w\\w$"));
assert(r4_match_stats("1est", "\\d\\w\\w\\w$"));
assert(r4_match_stats("Aest", "\\D\\w\\w\\w$"));
assert(r4_match_stats("abc", "[ab]+"));
assert(!r4_match_stats("abc", "[ab]+$"));
assert(r4_match_stats("abc", "[abc]+$"));
assert(!r4_match_stats("a", "[^ba]"));
assert(!r4_match_stats("a", "[^ab]"));
assert(r4_match_stats(" ponyyzd", "p+o.*yyzd$$$$"));
assert(r4_match_stats("abc", "def|gek|abc"));
assert(!r4_match_stats("abc", "def|gek|abd"));
assert(r4_match_stats("abc", "def|abc|def"));
assert(r4_match_stats("suwv", "[abcdesfghijklmnopqrtuvw][abcdefghijklmnopqrstuvw]["
"abcdefghijklmnopqrstuvw][abcdefghijklmnopqrstuvw]"));
test_r4_next();
r4_enable_debug();
assert(r4_match_stats("123", "(.*)(.*)(.*)"));
});
return 0;
}