/* Test whether ERE optionals work combined with subexpressions. */ #include "suite.h" int main(void) { cflags = REG_EXTENDED; reject("(a?b)", ""); reject("(a?b)", "a"); matches("(a?b)", "b", 2, (M[]) { m(0, 1), m(0, 1) }); reject("(a?b)", "aa"); matches("(a?b)", "ab", 2, (M[]) { m(0, 2), m(0, 2) }); matches("(a?b)", "ba", 2, (M[]) { m(0, 1), m(0, 1) }); matches("(a?b)", "bb", 2, (M[]) { m(0, 1), m(0, 1) }); matches("(a?b)", "aab", 2, (M[]) { m(1, 3), m(1, 3) }); reject("(a)?b", ""); reject("(a)?b", "a"); matches("(a)?b", "b", 2, (M[]) { m(0, 1), m(-1, -1) }); reject("(a)?b", "aa"); matches("(a)?b", "ab", 2, (M[]) { m(0, 2), m(0, 1) }); matches("(a)?b", "ba", 2, (M[]) { m(0, 1), m(-1, -1) }); matches("(a)?b", "bb", 2, (M[]) { m(0, 1), m(-1, -1) }); matches("(a)?b", "aab", 2, (M[]) { m(1, 3), m(1, 2) }); reject("(a?b)(a?b)", ""); reject("(a?b)(a?b)", "a"); reject("(a?b)(a?b)", "b"); reject("(a?b)(a?b)", "aa"); reject("(a?b)(a?b)", "ab"); reject("(a?b)(a?b)", "ba"); matches("(a?b)(a?b)", "bb", 3, (M[]) { m(0, 2), m(0, 1), m(1, 2) }); reject("(a?b)(a?b)", "aaa"); reject("(a?b)(a?b)", "aab"); reject("(a?b)(a?b)", "aba"); matches("(a?b)(a?b)", "abb", 3, (M[]) { m(0, 3), m(0, 2), m(2, 3) }); reject("(a?b)(a?b)", "baa"); matches("(a?b)(a?b)", "bab", 3, (M[]) { m(0, 3), m(0, 1), m(1, 3) }); matches("(a?b)(a?b)", "bba", 3, (M[]) { m(0, 2), m(0, 1), m(1, 2) }); matches("(a?b)(a?b)", "bbb", 3, (M[]) { m(0, 2), m(0, 1), m(1, 2) }); reject("(a?b)(a?b)", "aaaa"); reject("(a?b)(a?b)", "aaab"); reject("(a?b)(a?b)", "aaba"); matches("(a?b)(a?b)", "aabb", 3, (M[]) { m(1, 4), m(1, 3), m(3, 4) }); reject("(a?b)(a?b)", "abaa"); matches("(a?b)(a?b)", "abab", 3, (M[]) { m(0, 4), m(0, 2), m(2, 4) }); matches("(a?b)(a?b)", "abba", 3, (M[]) { m(0, 3), m(0, 2), m(2, 3) }); matches("(a?b)(a?b)", "abbb", 3, (M[]) { m(0, 3), m(0, 2), m(2, 3) }); reject("(a?b)(a?b)", "baaa"); reject("(a?b)(a?b)", "baab"); matches("(a?b)(a?b)", "baba", 3, (M[]) { m(0, 3), m(0, 1), m(1, 3) }); matches("(a?b)(a?b)", "babb", 3, (M[]) { m(0, 3), m(0, 1), m(1, 3) }); matches("(a?b)(a?b)", "bbaa", 3, (M[]) { m(0, 2), m(0, 1), m(1, 2) }); matches("(a?b)(a?b)", "bbab", 3, (M[]) { m(0, 2), m(0, 1), m(1, 2) }); matches("(a?b)(a?b)", "bbba", 3, (M[]) { m(0, 2), m(0, 1), m(1, 2) }); matches("(a?b)(a?b)", "bbbb", 3, (M[]) { m(0, 2), m(0, 1), m(1, 2) }); reject("(a?b)?(a?b)", ""); reject("(a?b)?(a?b)", "a"); matches("(a?b)?(a?b)", "b", 3, (M[]) { m(0, 1), m(-1, -1), m(0, 1) }); reject("(a?b)?(a?b)", "aa"); matches("(a?b)?(a?b)", "ab", 3, (M[]) { m(0, 2), m(-1, -1), m(0, 2) }); matches("(a?b)?(a?b)", "ba", 3, (M[]) { m(0, 1), m(-1, -1), m(0, 1) }); matches("(a?b)?(a?b)", "bb", 3, (M[]) { m(0, 2), m(0, 1), m(1, 2) }); reject("(a?b)?(a?b)", "aaa"); matches("(a?b)?(a?b)", "aab", 3, (M[]) { m(1, 3), m(-1, -1), m(1, 3) }); matches("(a?b)?(a?b)", "aba", 3, (M[]) { m(0, 2), m(-1, -1), m(0, 2) }); matches("(a?b)?(a?b)", "abb", 3, (M[]) { m(0, 3), m(0, 2), m(2, 3) }); matches("(a?b)?(a?b)", "baa", 3, (M[]) { m(0, 1), m(-1, -1), m(0, 1) }); matches("(a?b)?(a?b)", "bab", 3, (M[]) { m(0, 3), m(0, 1), m(1, 3) }); matches("(a?b)?(a?b)", "bba", 3, (M[]) { m(0, 2), m(0, 1), m(1, 2) }); matches("(a?b)?(a?b)", "bbb", 3, (M[]) { m(0, 2), m(0, 1), m(1, 2) }); reject("(a?b)?(a?b)", "aaaa"); matches("(a?b)?(a?b)", "aaab", 3, (M[]) { m(2, 4), m(-1, -1), m(2, 4) }); matches("(a?b)?(a?b)", "aaba", 3, (M[]) { m(1, 3), m(-1, -1), m(1, 3) }); matches("(a?b)?(a?b)", "aabb", 3, (M[]) { m(1, 4), m(1, 3), m(3, 4) }); matches("(a?b)?(a?b)", "abaa", 3, (M[]) { m(0, 2), m(-1, -1), m(0, 2) }); matches("(a?b)?(a?b)", "abab", 3, (M[]) { m(0, 4), m(0, 2), m(2, 4) }); matches("(a?b)?(a?b)", "abba", 3, (M[]) { m(0, 3), m(0, 2), m(2, 3) }); matches("(a?b)?(a?b)", "abbb", 3, (M[]) { m(0, 3), m(0, 2), m(2, 3) }); matches("(a?b)?(a?b)", "baaa", 3, (M[]) { m(0, 1), m(-1, -1), m(0, 1) }); matches("(a?b)?(a?b)", "baab", 3, (M[]) { m(0, 1), m(-1, -1), m(0, 1) }); matches("(a?b)?(a?b)", "baba", 3, (M[]) { m(0, 3), m(0, 1), m(1, 3) }); matches("(a?b)?(a?b)", "babb", 3, (M[]) { m(0, 3), m(0, 1), m(1, 3) }); matches("(a?b)?(a?b)", "bbaa", 3, (M[]) { m(0, 2), m(0, 1), m(1, 2) }); matches("(a?b)?(a?b)", "bbab", 3, (M[]) { m(0, 2), m(0, 1), m(1, 2) }); matches("(a?b)?(a?b)", "bbba", 3, (M[]) { m(0, 2), m(0, 1), m(1, 2) }); matches("(a?b)?(a?b)", "bbbb", 3, (M[]) { m(0, 2), m(0, 1), m(1, 2) }); return 0; }