Commit 1ca585e5 authored by Per Cederqvist's avatar Per Cederqvist
Browse files

Initial revision

parent d9241d55
typedef struct {
unsigned *bits;
unsigned size;
} bits_list_type;
#define BYTEWIDTH 8
#define NULL 0
#define BITS_BLOCK_SIZE (sizeof (unsigned) * BYTEWIDTH)
#define BITS_BLOCK(position) ((position) / BITS_BLOCK_SIZE)
#define BITS_MASK(position) (1 << ((position) % BITS_BLOCK_SIZE))
static unsigned
init_bits_list (bits_list_ptr)
bits_list_type *bits_list_ptr;
{
bits_list_ptr->bits = NULL;
bits_list_ptr->bits = (unsigned *) malloc (sizeof (unsigned));
if (bits_list_ptr->bits == NULL)
return 0;
bits_list_ptr->bits[0] = (unsigned)0;
bits_list_ptr->size = BITS_BLOCK_SIZE;
return 1;
}
main()
{
bits_list_type dummy;
bits_list_type dummy_1;
bits_list_type dummy_2;
bits_list_type dummy_3;
init_bits_list (&dummy);
printf("init 1\n");
init_bits_list (&dummy_1);
printf("init 2\n");
init_bits_list (&dummy_2);
printf("init 3\n");
init_bits_list (&dummy_3);
printf("init 4\n");
}
/* other.c: test (not exhaustively) non-POSIX regular expressions. */
#include "test.h"
void
test_others ()
{
struct re_registers regs;
printf ("\nStarting non-POSIX tests.\n");
t = other_test;
test_should_match = true;
/* The big question: does the group participate in the match, or match
the empty string? */
re_set_syntax (RE_NO_BK_PARENS);
test_match ("(a*)*ab", "ab");
TEST_REGISTERS ("(a*)*ab", "ab", 0, 2, 0, 0, -1, -1);
test_match ("(a*)*", "");
TEST_REGISTERS ("(a*)*ab", "ab", 0, 0, 0, 0, -1, -1);
/* This tests finding the highest and lowest active registers. */
test_match ("(a(b)c(d(e)f)g)h(i(j)k(l(m)n)o)\\1\\2\\3\\4\\5\\6\\7\\8",
"abcdefghijklmnoabcdefgbdefeijklmnojlmnm");
/* Test that \< and \> match at the beginning and end of the string. */
test_match ("\\<abc\\>", "abc");
/* May as well test \` and \' while we're at it. */
test_match ("\\`abc\\'", "abc");
#if 0
/* Test backreferencing and the fastmap -- which doesn't work. */
test_fastmap ("(a)*\\1", "a", 0, 0);
#endif
/* But at least we shouldn't search improperly. */
test_search_return (-1, "(a)\\1", "");
re_set_syntax (RE_SYNTAX_EMACS);
MATCH_SELF("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");
MATCH_SELF ("a^");
MATCH_SELF ("a^b");
MATCH_SELF ("$a");
MATCH_SELF ("a$b");
re_set_syntax (RE_BACKSLASH_ESCAPE_IN_LISTS);
test_match ("[\\^a]", "a");
test_match ("[\\^a]", "^");
/* These op characters should be ordinary if RE_CONTEXT_INVALID_OPS
isn't set. */
re_set_syntax (RE_NO_BK_VBAR | RE_NO_BK_BRACES | RE_INTERVALS
| RE_NO_BK_PARENS);
MATCH_SELF ("*");
test_match ("a|*", "*");
test_match ("(*)", "*");
MATCH_SELF ("+");
test_match ("a|+", "+");
test_match ("(+)", "+");
MATCH_SELF ("?");
test_match ("a|?", "?");
test_match ("(?)", "?");
MATCH_SELF ("{1}");
test_match ("a|{1}", "a");
test_match ("a|{1}", "{1}");
test_match ("({1})", "{1}");
test_match ("\\{", "{");
re_set_syntax (RE_LIMITED_OPS);
MATCH_SELF ("|");
MATCH_SELF ("a|");
MATCH_SELF ("a|");
MATCH_SELF ("a||");
MATCH_SELF ("a||");
MATCH_SELF ("(|)");
re_set_syntax (RE_SYNTAX_EMACS);
TEST_SEARCH ("^a", "b\na", 0, 3);
TEST_SEARCH ("b$", "b\na", 0, 3);
#if 0
/* Newline is no longer special for anchors (16 Sep 92). --karl */
test_match_2 ("a\n^b", "a", "\nb");
test_match_2 ("a$\nb", "a\n", "b");
#endif
/* Test grouping. */
re_set_syntax (RE_NO_BK_PARENS);
test_match ("()", "");
test_fastmap ("()", "", 0, 0);
TEST_REGISTERS ("()", "", 0, 0, 0, 0, -1, -1);
test_match ("((((((((()))))))))", "");
test_fastmap ("((((((((()))))))))", "", 0, 0);
test_match ("a()b", "ab");
TEST_REGISTERS ("a()b", "ab", 0, 2, 1, 1, -1, -1);
test_match ("(((((((((())))))))))", "");
test_fastmap ("(((((((((())))))))))", "", 0, 0);
test_match ("()*", "");
TEST_REGISTERS ("()*", "", 0, 0, 0, 0, -1, -1); /* empty string */
test_match ("(())*", "");
re_set_syntax (RE_CONTEXT_INDEP_OPS);
test_match ("*", "");
re_set_syntax (RE_INTERVALS | RE_CONTEXT_INDEP_OPS | RE_NO_BK_BRACES);
test_match ("{1}", ""); /* Should remain an interval. */
MATCH_SELF ("{1"); /* Not a valid interval. */
re_set_syntax (RE_NEWLINE_ALT);
test_match ("a\nb", "a");
test_match ("a\nb", "b");
re_set_syntax (RE_NO_BK_VBAR | RE_NO_BK_PARENS);
test_match ("^a", "a");
test_match ("(^a)", "a");
test_match ("(a|^b)", "b");
test_match ("a$", "a");
test_match ("(a$)", "a");
test_match ("a$|b", "a");
/* You should be able to have empty alternatives if RE_NO_EMPTY_ALTS
isn't set. */
re_set_syntax (RE_NO_BK_VBAR | RE_NO_BK_PARENS);
test_match ("|", "");
test_match ("^|a", "");
test_match ("^|a", "a");
test_match ("a|", "");
test_match ("a|", "a");
test_match ("a|$", "");
test_match ("a|$", "a");
test_match ("a||b", "a");
test_match ("a||b", "");
test_match ("a||b", "b");
test_match ("(|a)", "");
test_match ("(|a)", "a");
test_match ("(a|)", "");
test_match ("(a|)", "a");
TEST_SEARCH ("a|$", "xa", 0, 2);
TEST_SEARCH ("a|$", "x", 0, 1);
TEST_SEARCH ("$|b", "x", 0, 1);
TEST_SEARCH ("$|b", "xb", 0, 2);
TEST_SEARCH ("c(a|$)", "xca", 0, 3);
TEST_SEARCH ("c(a|$)", "xc", 0, 2);
TEST_SEARCH ("c($|b)", "xcb", 0, 3);
TEST_SEARCH ("c($|b)", "xc", 0, 2);
TEST_SEARCH ("c($|b$)", "xcb", 0, 3);
TEST_SEARCH ("c($|b$)", "xc", 0, 2);
TEST_SEARCH ("c(a$|$)", "xca", 0, 3);
TEST_SEARCH ("c(a$|$)", "xc", 0, 2);
TEST_SEARCH ("(a$|b$)|$", "x", 0, 1);
TEST_SEARCH ("(a$|b$)|$", "xa", 0, 2);
TEST_SEARCH ("(a$|b$)|$", "xb", 0, 2);
TEST_SEARCH ("(a$|$)|c$", "x", 0, 1);
TEST_SEARCH ("(a$|$)|c$", "xa", 0, 2);
TEST_SEARCH ("(a$|$)|c$", "xc", 0, 2);
TEST_SEARCH ("($|b$)|c$", "x", 0, 1);
TEST_SEARCH ("($|b$)|c$", "xb", 0, 2);
TEST_SEARCH ("($|b$)|c$", "xc", 0, 2);
TEST_SEARCH ("c$|(a$|$)", "x", 0, 1);
TEST_SEARCH ("c$|(a$|$)", "xa", 0, 2);
TEST_SEARCH ("c$|(a$|$)", "xc", 0, 2);
TEST_SEARCH ("c$|($|b$)", "x", 0, 1);
TEST_SEARCH ("c$|($|b$)", "xb", 0, 2);
TEST_SEARCH ("c$|($|b$)", "xc", 0, 2);
TEST_SEARCH ("$|(a$|b$)", "x", 0, 1);
TEST_SEARCH ("$|(a$|b$)", "xa", 0, 2);
TEST_SEARCH ("$|(a$|b$)", "xb", 0, 2);
TEST_SEARCH ("c(a$|b$)|$", "x", 0, 1);
TEST_SEARCH ("c(a$|b$)|$", "xca", 0, 3);
TEST_SEARCH ("c(a$|b$)|$", "xcb", 0, 3);
TEST_SEARCH ("c(a$|$)|d$", "xc", 0, 2);
TEST_SEARCH ("c(a$|$)|d$", "xca", 0, 3);
TEST_SEARCH ("c(a$|$)|d$", "xd", 0, 2);
TEST_SEARCH ("c($|b$)|d$", "xc", 0, 2);
TEST_SEARCH ("c($|b$)|d$", "xcb", 0, 3);
TEST_SEARCH ("c($|b$)|d$", "xd", 0, 2);
TEST_SEARCH ("d(c$|e((a$|$)))", "xdc", 0, 3);
TEST_SEARCH ("d(c$|e((a$|$)))", "xde", 0, 3);
TEST_SEARCH ("d(c$|e((a$|$)))", "xdea", 0, 4);
TEST_SEARCH ("d(c$|e(($|b$)))", "xdc", 0, 3);
TEST_SEARCH ("d(c$|e(($|b$)))", "xde", 0, 3);
TEST_SEARCH ("d(c$|e(($|b$)))", "xdeb", 0, 4);
TEST_SEARCH ("d($|e((a$|b$)))", "xd", 0, 2);
TEST_SEARCH ("d($|e((a$|b$)))", "xdea", 0, 4);
TEST_SEARCH ("d($|e((a$|b$)))", "xdeb", 0, 4);
TEST_SEARCH ("a(b$|c$)|$", "x", 0, 1);
TEST_SEARCH ("a(b$|c$)|$", "xab", 0, 3);
TEST_SEARCH ("a(b$|c$)|$", "xac", 0, 3);
TEST_SEARCH ("a(b$|$)|d$", "xa", 0, 2);
TEST_SEARCH ("a(b$|$)|d$", "xab", 0, 3);
TEST_SEARCH ("a(b$|$)|d$", "xd", 0, 2);
TEST_SEARCH ("a($|c$)|d$", "xa", 0, 2);
TEST_SEARCH ("a($|c$)|d$", "xac", 0, 3);
TEST_SEARCH ("a($|c$)|d$", "xd", 0, 2);
TEST_SEARCH ("d$|a(b$|$)", "xd", 0, 2);
TEST_SEARCH ("d$|a(b$|$)", "xa", 0, 2);
TEST_SEARCH ("d$|a(b$|$)", "xab", 0, 3);
TEST_SEARCH ("d$|a($|c$)", "xd", 0, 2);
TEST_SEARCH ("d$|a($|c$)", "xa", 0, 2);
TEST_SEARCH ("d$|a($|c$)", "xac", 0, 3);
TEST_SEARCH ("$|a(b$|c$)", "x", 0, 1);
TEST_SEARCH ("$|a(b$|c$)", "xab", 0, 3);
TEST_SEARCH ("$|a(b$|c$)", "xac", 0, 3);
TEST_SEARCH ("(a)(b$|c$)|d$", "xab", 0, 3);
TEST_SEARCH ("(a)(b$|c$)|d$", "xac", 0, 3);
TEST_SEARCH ("(a)(b$|c$)|d$", "xd", 0, 2);
TEST_SEARCH ("(a)(b$|$)|d$", "xa", 0, 2);
TEST_SEARCH ("(a)(b$|$)|d$", "xab", 0, 3);
TEST_SEARCH ("(a)(b$|$)|d$", "xd", 0, 2);
TEST_SEARCH ("(a)($|c$)|d$", "xa", 0, 2);
TEST_SEARCH ("(a)($|c$)|d$", "xac", 0, 3);
TEST_SEARCH ("(a)($|c$)|d$", "xd", 0, 2);
TEST_SEARCH ("d$|(a)(b$|$)", "xd", 0, 2);
TEST_SEARCH ("d$|(a)(b$|$)", "xa", 0, 2);
TEST_SEARCH ("d$|(a)(b$|$)", "xab", 0, 3);
TEST_SEARCH ("d$|(a)($|c$)", "xd", 0, 2);
TEST_SEARCH ("d$|(a)($|c$)", "xa", 0, 2);
TEST_SEARCH ("d$|(a)($|c$)", "xac", 0, 3);
TEST_SEARCH ("$|(a)(b$|c$)", "x", 0, 1);
TEST_SEARCH ("$|(a)(b$|c$)", "xab", 0, 3);
TEST_SEARCH ("$|(a)(b$|c$)", "xac", 0, 3);
TEST_SEARCH ("d$|(c$|(a$|$))", "x", 0, 1);
TEST_SEARCH ("d$|(c$|(a$|$))", "xd", 0, 2);
TEST_SEARCH ("d$|(c$|(a$|$))", "xc", 0, 2);
TEST_SEARCH ("d$|(c$|(a$|$))", "xa", 0, 2);
TEST_SEARCH ("d$|(c$|($|b$))", "x", 0, 1);
TEST_SEARCH ("d$|(c$|($|b$))", "xd", 0, 2);
TEST_SEARCH ("d$|(c$|($|b$))", "xc", 0, 2);
TEST_SEARCH ("d$|(c$|($|b$))", "xb", 0, 2);
TEST_SEARCH ("d$|($|(a$|b$))", "x", 0, 1);
TEST_SEARCH ("d$|($|(a$|b$))", "xd", 0, 2);
TEST_SEARCH ("d$|($|(a$|b$))", "xa", 0, 2);
TEST_SEARCH ("d$|($|(a$|b$))", "xb", 0, 2);
TEST_SEARCH ("$|(c$|(a$|b$))", "x", 0, 1);
TEST_SEARCH ("$|(c$|(a$|b$))", "xc", 0, 2);
TEST_SEARCH ("$|(c$|(a$|b$))", "xa", 0, 2);
TEST_SEARCH ("$|(c$|(a$|b$))", "xb", 0, 2);
TEST_SEARCH ("d$|c(a$|$)", "xd", 0, 2);
TEST_SEARCH ("d$|c(a$|$)", "xc", 0, 2);
TEST_SEARCH ("d$|c(a$|$)", "xca", 0, 3);
TEST_SEARCH ("d$|c($|b$)", "xd", 0, 2);
TEST_SEARCH ("d$|c($|b$)", "xc", 0, 2);
TEST_SEARCH ("d$|c($|b$)", "xcb", 0, 3);
TEST_SEARCH ("$|c(a$|b$)", "x", 0, 1);
TEST_SEARCH ("$|c(a$|b$)", "xca", 0, 3);
TEST_SEARCH ("$|c(a$|b$)", "xcb", 0, 3);
TEST_SEARCH ("e(d$|c((a$|$)))", "xed", 0, 3);
TEST_SEARCH ("e(d$|c((a$|$)))", "xec", 0, 3);
TEST_SEARCH ("e(d$|c((a$|$)))", "xeca", 0, 3);
TEST_SEARCH ("e(d$|c(($|b$)))", "xed", 0, 3);
TEST_SEARCH ("e(d$|c(($|b$)))", "xec", 0, 3);
TEST_SEARCH ("e(d$|c(($|b$)))", "xecb", 0, 4);
TEST_SEARCH ("e($|c((a$|b$)))", "xe", 0, 2);
TEST_SEARCH ("e($|c((a$|b$)))", "xeca", 0, 4);
TEST_SEARCH ("e($|c((a$|b$)))", "xecb", 0, 4);
TEST_SEARCH ("ed$|(c((a$|$)))", "xed", 0, 3);
TEST_SEARCH ("ed$|(c((a$|$)))", "xc", 0, 2);
TEST_SEARCH ("ed$|(c((a$|$)))", "xca", 0, 3);
TEST_SEARCH ("ed$|(c(($|b$)))", "xed", 0, 3);
TEST_SEARCH ("ed$|(c(($|b$)))", "xc", 0, 2);
TEST_SEARCH ("ed$|(c(($|b$)))", "xcb", 0, 3);
TEST_SEARCH ("$|(c((a$|b$)))", "x", 0, 1);
TEST_SEARCH ("$|(c((a$|b$)))", "xca", 0, 3);
TEST_SEARCH ("$|(c((a$|b$)))", "xcb", 0, 3);
TEST_SEARCH ("d$|($|(a|b)$)", "x", 0, 1);
TEST_SEARCH ("d$|($|(a|b)$)", "xa", 0, 2);
TEST_SEARCH ("d$|($|(a|b)$)", "xb", 0, 2);
TEST_SEARCH ("$|(c$|(a|b)$)", "x", 0, 1);
TEST_SEARCH ("$|(c$|(a|b)$)", "xc", 0, 2);
TEST_SEARCH ("$|(c$|(a|b)$)", "xa", 0, 2);
TEST_SEARCH ("$|(c$|(a|b)$)", "xb", 0, 2);
re_set_syntax (0);
test_match ("[^\n]", "a");
test_match ("[^a]", "\n");
TEST_SEARCH ("^a", "b\na", 0, 3);
TEST_SEARCH ("b$", "b\na", 0, 3);
test_case_fold ("[!-`]", "A");
test_case_fold ("[!-`]", "a");
re_set_syntax (RE_CONTEXT_INDEP_OPS | RE_NO_BK_VBAR | RE_NO_BK_PARENS
| RE_NO_BK_BRACES | RE_INTERVALS);
valid_nonposix_pattern ("()^a");
valid_nonposix_pattern ("()\\1^a");
/* Per Cederqvist (cedar@lysator.liu.se) bug. */
re_set_syntax (RE_SYNTAX_EMACS);
/* One `a' before the \n and 638 a's after it. */
test_search_return (0, "\\(.*\\)\n\\(\\(.\\|\n\\)*\\)$", "a\naaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");
/* No a's before the \n and 639 a's after it. */
test_search_return (0, "\\(.*\\)\n\\(\\(.\\|\n\\)*\\)$", "\naaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");
/* One `a' before the \n and 639 a's after it. */
test_search_return (0, "\\(.*\\)\n\\(\\(.\\|\n\\)*\\)$", "a\naaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");
/* No a's before the \n and 640 a's after it. */
test_search_return (0, "\\(.*\\)\n\\(\\(.\\|\n\\)*\\)$", "\naaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");
re_set_syntax (RE_NO_BK_VBAR | RE_NO_BK_PARENS);
TEST_SEARCH ("^(^a)", "ab", 0, 2);
TEST_SEARCH ("(a$)$", "ba", 0, 2);
test_match ("a|$b", "$b");
/* Mike's curiosity item. */
re_set_syntax (RE_NO_BK_VBAR | RE_NO_BK_PARENS);
test_all_registers ("(foo|foobar)(foo|bar)*\\1(foo|bar)*",
"foobarfoobar", "",
0, 12, 0, 3, 3, 6, 9, 12, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1);
/* Another one from Mike. */
test_match ("(foo|foobarfoo)(bar)*", "foobarfoo");
/* And another. */
test_match("(foo|foobar)(bar|barfoo)?\\1", "foobarfoobar");
re_set_syntax (RE_NO_BK_PARENS | RE_INTERVALS | RE_NO_BK_VBAR
| RE_NO_BK_BRACES); /* xx get new ones from ext.*/
test_match ("((a{0,}{0,0}()\\3\\b\\B\\<\\>\\`\\')|b)*", "bb");
test_all_registers ("((a{0,}{0,0}()\\3\\b\\B\\<\\>\\`\\')|b)*", "", "bb",
0, 2, 1, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1);
test_match ("((a+?*{0,}{0,0}()\\3\\b\\B\\<\\>\\`\\')|b)", "b");
test_all_registers ("((a+?*{0,}{0,0}()\\3\\b\\B\\<\\>\\`\\')|b)", "", "b",
0, 1, 0, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1);
/* Valid anchoring. */
/* See generic_test.c and extended_test.c for more search
tests. xx Not sure all these tests are represented in the
search tests. */
re_set_syntax (RE_NO_BK_PARENS | RE_NO_BK_VBAR);
valid_nonposix_pattern
("(((((((((((((((((((((((((((((((((^a)))))))))))))))))))))))))))))))))");
valid_nonposix_pattern
("(((((((((((((((((((((((((((((((((a$)))))))))))))))))))))))))))))))))");
valid_nonposix_pattern ("\\b\\B\\<\\>\\`\\'^a");
valid_nonposix_pattern ("a$\\b\\B\\<\\>\\`\\'");
valid_nonposix_pattern ("(^a)");
valid_nonposix_pattern ("(a$)");
valid_nonposix_pattern ("(^a)b");
valid_nonposix_pattern ("b(a$)");
valid_nonposix_pattern ("(^a|^b)c");
valid_nonposix_pattern ("c(a$|b$)");
valid_nonposix_pattern ("(^a|^b)|^c");
valid_nonposix_pattern ("(a$|b$)|c$");
valid_nonposix_pattern ("^c|(^a|^b)");
valid_nonposix_pattern ("c$|(a$|b$)");
valid_nonposix_pattern ("(^a|^b)c|^d");
valid_nonposix_pattern ("c(a$|b$)|d$");
valid_nonposix_pattern ("(((^a|^b))c|^d)e");
valid_nonposix_pattern ("(c((a|b))|d)e$");
valid_nonposix_pattern ("^d(c|e((a|b)))");
valid_nonposix_pattern ("d(c$|e((a$|b$)))");
valid_nonposix_pattern ("(((^a|^b))c)|^de");
valid_nonposix_pattern ("(((a|b))c$)|de$");
valid_nonposix_pattern ("((a$)$)$");
valid_nonposix_pattern ("^(^(^a))");
valid_nonposix_pattern ("^de|^(c((a|b)))");
valid_nonposix_pattern ("^de|(^c((a|b)))");
valid_nonposix_pattern ("de$|(c((a|b)$))");
valid_nonposix_pattern ("de$|(c((a|b))$)");
valid_nonposix_pattern ("de$|(c((a|b)))$");
valid_nonposix_pattern ("^a(b|c)|^d");
valid_nonposix_pattern ("a(b$|c$)|d$");
valid_nonposix_pattern ("^d|^a(b|c)");
valid_nonposix_pattern ("d$|a(b$|c$)");
valid_nonposix_pattern ("^d|^(b|c)a");
valid_nonposix_pattern ("d$|(b|c)a$");
valid_nonposix_pattern ("^(a)(b|c)|^d");
valid_nonposix_pattern ("(a)(b|c)$|d$");
valid_nonposix_pattern ("(^a)(b|c)|^d");
valid_nonposix_pattern ("(a)(b$|c$)|d$");
valid_nonposix_pattern ("^d|^(b|c)(a)");
valid_nonposix_pattern ("d$|(b|c)(a)$");
valid_nonposix_pattern ("^d|(^b|^c)(a)");
valid_nonposix_pattern ("d$|(b|c)(a$)");
valid_nonposix_pattern ("^d|^(a)(b|c)");
valid_nonposix_pattern ("^d|(^a)(b|c)");
valid_nonposix_pattern ("d$|(a)(b$|c$)");
valid_nonposix_pattern ("((^a|^b)|^c)|^d");
valid_nonposix_pattern ("d$|(c$|(a$|b$))");
/* Tests shouldn't match. */
test_should_match = false;
/* Test that RE_CONTEXT_INVALID_OPS has precedence over
RE_CONTEXT_INDEP_OPS. */
re_set_syntax (RE_CONTEXT_INDEP_OPS | RE_CONTEXT_INVALID_OPS
| RE_NO_BK_VBAR | RE_NO_BK_PARENS
| RE_NO_BK_BRACES | RE_INTERVALS);
INVALID_PATTERN ("*");
INVALID_PATTERN ("^*");
INVALID_PATTERN ("a|*");
INVALID_PATTERN ("(*)");
INVALID_PATTERN ("^+");
INVALID_PATTERN ("+");
INVALID_PATTERN ("a|+");
INVALID_PATTERN ("(+)");
INVALID_PATTERN ("^?");
INVALID_PATTERN ("?");
INVALID_PATTERN ("a|?");
INVALID_PATTERN ("(?)");
INVALID_PATTERN ("^{1}");
INVALID_PATTERN ("{1}");
INVALID_PATTERN ("a|{1}");
INVALID_PATTERN ("({1})");
#if 0
/* No longer have this syntax option -- POSIX says empty alternatives
are undefined as of draft 11.2. */
/* You can't have empty alternatives if RE_NO_EMPTY_ALTS is set. */
re_set_syntax (RE_NO_BK_VBAR | RE_NO_BK_PARENS | RE_NO_EMPTY_ALTS);
INVALID_PATTERN ("|");
INVALID_PATTERN ("^|a");
INVALID_PATTERN ("a|");
INVALID_PATTERN ("a||");
INVALID_PATTERN ("a||b");
INVALID_PATTERN ("(|a)");
INVALID_PATTERN ("(a|)");
INVALID_PATTERN ("(a|)");
/* Test above with `\(' and `\)'. */
re_set_syntax (RE_NO_BK_VBAR | RE_NO_EMPTY_ALTS);
INVALID_PATTERN ("\\(|a\\)");
INVALID_PATTERN ("\\(a|\\)");
re_set_syntax (RE_NO_BK_VBAR | RE_NO_BK_PARENS | RE_NO_EMPTY_ALTS);
INVALID_PATTERN ("(|)()$|d$");
#endif
/* Test grouping. */
test_match ("()", "a");
/* Test backslashed intervals that are CONTEXTly invalid if have
nothing on which to operate. */
re_set_syntax (RE_INTERVALS | RE_CONTEXT_INVALID_OPS);
INVALID_PATTERN ("\\{1\\}");
re_set_syntax (0);
test_match ("z-a", "a");
re_set_syntax (RE_BK_PLUS_QM);
INVALID_PATTERN ("a*\\");
re_set_syntax (0);
INVALID_PATTERN ("a*\\");
re_set_syntax (RE_BACKSLASH_ESCAPE_IN_LISTS);
INVALID_PATTERN ("[\\");
#if 0
/* Empty groups are always ok now. (13 Sep 92) */
re_set_syntax (RE_NO_BK_VBAR | RE_NO_BK_PARENS | RE_NO_EMPTY_GROUPS);
INVALID_PATTERN ("(|)()$|d$");
#endif
printf ("\nFinished non-POSIX tests.\n");
}
/*
Local variables:
make-backup-files: t
version-control: t
trim-versions-without-asking: nil
End:
*/
void
printchar (c)
char c;
{
if (c < 040 || c >= 0177)
{
putchar ('\\');
putchar (((c >> 6) & 3) + '0');
putchar (((c >> 3) & 7) + '0');
putchar ((c & 7) + '0');
}
else
putchar (c);
}
/* psx-basic.c: Test POSIX basic regular expressions. */
#include "test.h"
void
test_posix_basic ()
{
/* Intervals can only match up to RE_DUP_MAX occurences of anything. */
char dup_max_plus_one[6];
sprintf (dup_max_plus_one, "%d", RE_DUP_MAX + 1);
printf ("\nStarting POSIX basic tests.\n");
t = posix_basic_test;
re_set_syntax (RE_SYNTAX_POSIX_MINIMAL_BASIC);
test_posix_generic ();
printf ("\nContinuing POSIX basic tests.\n");
/* Grouping tests that are not the same. */
test_should_match = false;
invalid_pattern (REG_EPAREN, PARENS_TO_OPS ("a)"));
test_should_match = true;
/* Special characters. */
MATCH_SELF ("*");
test_match ("\\(*\\)", "*");
test_match ("\\(^*\\)", "*");
test_match ("**", "***");
test_match ("***",