/* Test whether BRE asterisks work combined with subexpressions. */ #include "suite.h" int main(void) { cflags = 0; matches("\\(*\\)", "*", 2, (M[]) { m(0, 1), m(0, 1) }); reject("\\(*\\)", "x"); matches("\\(a*\\)\\(b*\\)", "", 3, (M[]) { m(0, 0), m(0, 0), m(0, 0) }); matches("\\(a*\\)\\(b*\\)", "a", 3, (M[]) { m(0, 1), m(0, 1), m(1, 1) }); matches("\\(a*\\)\\(b*\\)", "b", 3, (M[]) { m(0, 1), m(0, 0), m(0, 1) }); matches("\\(a*\\)\\(b*\\)", "aa", 3, (M[]) { m(0, 2), m(0, 2), m(2, 2) }); matches("\\(a*\\)\\(b*\\)", "ab", 3, (M[]) { m(0, 2), m(0, 1), m(1, 2) }); matches("\\(a*\\)\\(b*\\)", "ba", 3, (M[]) { m(0, 1), m(0, 0), m(0, 1) }); matches("\\(a*\\)\\(b*\\)", "bb", 3, (M[]) { m(0, 2), m(0, 0), m(0, 2) }); matches("\\(a\\)*\\(b\\)*", "", 3, (M[]) { m(0, 0), m(-1, -1), m(-1, -1) }); matches("\\(a\\)*\\(b\\)*", "a", 3, (M[]) { m(0, 1), m(0, 1), m(-1, -1) }); matches("\\(a\\)*\\(b\\)*", "b", 3, (M[]) { m(0, 1), m(-1, -1), m(0, 1) }); matches("\\(a\\)*\\(b\\)*", "aa", 3, (M[]) { m(0, 2), m(1, 2), m(-1, -1) }); matches("\\(a\\)*\\(b\\)*", "ab", 3, (M[]) { m(0, 2), m(0, 1), m(1, 2) }); matches("\\(a\\)*\\(b\\)*", "ba", 3, (M[]) { m(0, 1), m(-1, -1), m(0, 1) }); matches("\\(a\\)*\\(b\\)*", "bb", 3, (M[]) { m(0, 2), m(-1, -1), m(1, 2) }); matches("\\(a*\\)\\(a*\\)", "", 3, (M[]) { m(0, 0), m(0, 0), m(0, 0) }); matches("\\(a*\\)\\(a*\\)", "a", 3, (M[]) { m(0, 1), m(0, 1), m(1, 1) }); matches("\\(a*\\)\\(a*\\)", "aa", 3, (M[]) { m(0, 2), m(0, 2), m(2, 2) }); matches("\\(a\\)*\\(a\\)*", "", 3, (M[]) { m(0, 0), m(-1, -1), m(-1, -1) }); matches("\\(a\\)*\\(a\\)*", "a", 3, (M[]) { m(0, 1), m(0, 1), m(-1, -1) }); matches("\\(a\\)*\\(a\\)*", "aa", 3, (M[]) { m(0, 2), m(1, 2), m(-1, -1) }); matches("\\(ab\\)*", "", 2, (M[]) { m(0, 0), m(-1, -1) }); matches("\\(ab\\)*", "a", 2, (M[]) { m(0, 0), m(-1, -1) }); matches("\\(ab\\)*", "ab", 2, (M[]) { m(0, 2), m(0, 2) }); matches("\\(ab\\)*", "aba", 2, (M[]) { m(0, 2), m(0, 2) }); matches("\\(ab\\)*", "abab", 2, (M[]) { m(0, 4), m(2, 4) }); reject("\\(a\\(\\(a*\\)*\\)\\)", ""); matches("\\(a\\(\\(a*\\)*\\)\\)", "a", 4, (M[]) { m(0, 1), m(0, 1), m(1, 1), m(1, 1) }); matches("\\(a\\(\\(a*\\)*\\)\\)", "aa", 4, (M[]) { m(0, 2), m(0, 2), m(1, 2), m(1, 2) }); matches("\\(a\\(\\(a*\\)*\\)\\)", "aaa", 4, (M[]) { m(0, 3), m(0, 3), m(1, 3), m(1, 3) }); matches("\\(a\\(\\(a*\\)*\\)\\)", "aaaa", 4, (M[]) { m(0, 4), m(0, 4), m(1, 4), m(1, 4) }); reject("\\(a\\)*ab", ""); reject("\\(a\\)*ab", "a"); reject("\\(a\\)*ab", "b"); reject("\\(a\\)*ab", "aa"); matches("\\(a\\)*ab", "ab", 2, (M[]) { m(0, 2), m(-1, -1) }); matches("\\(a\\)*ab", "aab", 2, (M[]) { m(0, 3), m(0, 1) }); matches("\\(a\\)*ab", "aaab", 2, (M[]) { m(0, 4), m(1, 2) }); reject("\\(a*\\)ab", ""); reject("\\(a*\\)ab", "a"); reject("\\(a*\\)ab", "b"); reject("\\(a*\\)ab", "aa"); matches("\\(a*\\)ab", "ab", 2, (M[]) { m(0, 2), m(0, 0) }); matches("\\(a*\\)ab", "aab", 2, (M[]) { m(0, 3), m(0, 1) }); matches("\\(a*\\)ab", "aaab", 2, (M[]) { m(0, 4), m(0, 2) }); return 0; }