/*[nonstandard]*/ /* Test whether BRE optionals work combined with subexpressions. */ #include "suite.h" int main(void) { cflags = 0; 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; }