1a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner/* Regular expression tests. 2a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner Copyright (C) 2002, 2003 Free Software Foundation, Inc. 3a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner This file is part of the GNU C Library. 4a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner Contributed by Jakub Jelinek <jakub@redhat.com>, 2002. 5a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 6a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner The GNU C Library is free software; you can redistribute it and/or 7a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner modify it under the terms of the GNU Lesser General Public 8a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner License as published by the Free Software Foundation; either 9a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner version 2.1 of the License, or (at your option) any later version. 10a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 11a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner The GNU C Library is distributed in the hope that it will be useful, 12a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner but WITHOUT ANY WARRANTY; without even the implied warranty of 13a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner Lesser General Public License for more details. 15a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 16a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner You should have received a copy of the GNU Lesser General Public 17a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner License along with the GNU C Library; if not, write to the Free 18a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 19a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 02110-1301 USA. */ 20a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 21a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#ifdef HAVE_CONFIG_H 22a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#include "config.h" 23a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#endif 24a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 25a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#include <sys/types.h> 26a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#ifdef HAVE_MCHECK_H 27a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#include <mcheck.h> 28a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#endif 29a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#include <regex.h> 30a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#include <stdio.h> 31a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#include <stdlib.h> 32a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 33a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner/* Tests supposed to match. */ 34a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turnerstruct 35a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner{ 36a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner const char *pattern; 37a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner const char *string; 38a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner int flags, nmatch; 39a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner regmatch_t rm[5]; 40a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner} tests[] = { 41a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner /* Test for newline handling in regex. */ 42a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner { "[^~]*~", "\nx~y", 0, 2, { { 0, 3 }, { -1, -1 } } }, 43a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner /* Other tests. */ 44a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner { "a(.*)b", "a b", REG_EXTENDED, 2, { { 0, 3 }, { 1, 2 } } }, 45a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner { ".*|\\([KIO]\\)\\([^|]*\\).*|?[KIO]", "10~.~|P|K0|I10|O16|?KSb", 0, 3, 46a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner { { 0, 21 }, { 15, 16 }, { 16, 18 } } }, 47a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner { ".*|\\([KIO]\\)\\([^|]*\\).*|?\\1", "10~.~|P|K0|I10|O16|?KSb", 0, 3, 48a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner { { 0, 21 }, { 8, 9 }, { 9, 10 } } }, 49a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner { "^\\(a*\\)\\1\\{9\\}\\(a\\{0,9\\}\\)\\([0-9]*;.*[^a]\\2\\([0-9]\\)\\)", 50a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner "a1;;0a1aa2aaa3aaaa4aaaaa5aaaaaa6aaaaaaa7aaaaaaaa8aaaaaaaaa9aa2aa1a0", 0, 51a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 5, { { 0, 67 }, { 0, 0 }, { 0, 1 }, { 1, 67 }, { 66, 67 } } }, 52a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner /* Test for BRE expression anchoring. POSIX says just that this may match; 53a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner in glibc regex it always matched, so avoid changing it. */ 54a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner { "\\(^\\|foo\\)bar", "bar", 0, 2, { { 0, 3 }, { -1, -1 } } }, 55a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner { "\\(foo\\|^\\)bar", "bar", 0, 2, { { 0, 3 }, { -1, -1 } } }, 56a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner /* In ERE this must be treated as an anchor. */ 57a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner { "(^|foo)bar", "bar", REG_EXTENDED, 2, { { 0, 3 }, { -1, -1 } } }, 58a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner { "(foo|^)bar", "bar", REG_EXTENDED, 2, { { 0, 3 }, { -1, -1 } } }, 59a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner /* Here ^ cannot be treated as an anchor according to POSIX. */ 60a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner { "(^|foo)bar", "(^|foo)bar", 0, 2, { { 0, 10 }, { -1, -1 } } }, 61a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner { "(foo|^)bar", "(foo|^)bar", 0, 2, { { 0, 10 }, { -1, -1 } } }, 62a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner /* More tests on backreferences. */ 63a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner { "()\\1", "x", REG_EXTENDED, 2, { { 0, 0 }, { 0, 0 } } }, 64a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner { "()x\\1", "x", REG_EXTENDED, 2, { { 0, 1 }, { 0, 0 } } }, 65a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner { "()\\1*\\1*", "", REG_EXTENDED, 2, { { 0, 0 }, { 0, 0 } } }, 66a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner { "([0-9]).*\\1(a*)", "7;7a6", REG_EXTENDED, 3, { { 0, 4 }, { 0, 1 }, { 3, 4 } } }, 67a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner { "([0-9]).*\\1(a*)", "7;7a", REG_EXTENDED, 3, { { 0, 4 }, { 0, 1 }, { 3, 4 } } }, 68a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner { "(b)()c\\1", "bcb", REG_EXTENDED, 3, { { 0, 3 }, { 0, 1 }, { 1, 1 } } }, 69a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner { "()(b)c\\2", "bcb", REG_EXTENDED, 3, { { 0, 3 }, { 0, 0 }, { 0, 1 } } }, 70a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner { "a(b)()c\\1", "abcb", REG_EXTENDED, 3, { { 0, 4 }, { 1, 2 }, { 2, 2 } } }, 71a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner { "a()(b)c\\2", "abcb", REG_EXTENDED, 3, { { 0, 4 }, { 1, 1 }, { 1, 2 } } }, 72a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner { "()(b)\\1c\\2", "bcb", REG_EXTENDED, 3, { { 0, 3 }, { 0, 0 }, { 0, 1 } } }, 73a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner { "(b())\\2\\1", "bbbb", REG_EXTENDED, 3, { { 0, 2 }, { 0, 1 }, { 1, 1 } } }, 74a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner { "a()(b)\\1c\\2", "abcb", REG_EXTENDED, 3, { { 0, 4 }, { 1, 1 }, { 1, 2 } } }, 75a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner { "a()d(b)\\1c\\2", "adbcb", REG_EXTENDED, 3, { { 0, 5 }, { 1, 1 }, { 2, 3 } } }, 76a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner { "a(b())\\2\\1", "abbbb", REG_EXTENDED, 3, { { 0, 3 }, { 1, 2 }, { 2, 2 } } }, 77a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner { "(bb())\\2\\1", "bbbb", REG_EXTENDED, 3, { { 0, 4 }, { 0, 2 }, { 2, 2 } } }, 78a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner { "^(.?)(.?)(.?)(.?)(.?).?\\5\\4\\3\\2\\1$", 79a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner "level", REG_NOSUB | REG_EXTENDED, 0, { { -1, -1 } } }, 80a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner { "^(.?)(.?)(.?)(.?)(.?)(.?)(.?)(.?)(.).?\\9\\8\\7\\6\\5\\4\\3\\2\\1$|^.?$", 81a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner "level", REG_NOSUB | REG_EXTENDED, 0, { { -1, -1 } } }, 82a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner { "^(.?)(.?)(.?)(.?)(.?)(.?)(.?)(.?)(.).?\\9\\8\\7\\6\\5\\4\\3\\2\\1$|^.?$", 83a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner "abcdedcba", REG_EXTENDED, 1, { { 0, 9 } } }, 84a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#if 0 85a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner /* XXX Not used since they fail so far. */ 86a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner { "^(.?)(.?)(.?)(.?)(.?)(.?)(.?)(.?)(.).?\\9\\8\\7\\6\\5\\4\\3\\2\\1$|^.?$", 87a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner "ababababa", REG_EXTENDED, 1, { { 0, 9 } } }, 88a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner { "^(.?)(.?)(.?)(.?)(.?)(.?)(.?)(.?)(.?).?\\9\\8\\7\\6\\5\\4\\3\\2\\1$", 89a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner "level", REG_NOSUB | REG_EXTENDED, 0, { { -1, -1 } } }, 90a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner { "^(.?)(.?)(.?)(.?)(.?)(.?)(.?)(.?)(.?).?\\9\\8\\7\\6\\5\\4\\3\\2\\1$", 91a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner "ababababa", REG_EXTENDED, 1, { { 0, 9 } } }, 92a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#endif 93a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner}; 94a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 95a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turnerint 96a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turnermain (void) 97a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner{ 98a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner regex_t re; 99a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner regmatch_t rm[5]; 100a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner size_t i; 101a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner int n, ret = 0; 102a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 103a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#ifdef HAVE_MCHECK_H 104a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner mtrace (); 105a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#endif 106a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 107a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner for (i = 0; i < sizeof (tests) / sizeof (tests[0]); ++i) 108a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner { 109a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner n = regcomp (&re, tests[i].pattern, tests[i].flags); 110a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner if (n != 0) 111a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner { 112a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner char buf[500]; 113a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner regerror (n, &re, buf, sizeof (buf)); 114a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner printf ("%s: regcomp %lu failed: %s\n", tests[i].pattern, i, buf); 115a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner ret = 1; 116a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner continue; 117a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner } 118a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 119a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner if (regexec (&re, tests[i].string, tests[i].nmatch, rm, 0)) 120a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner { 121a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner printf ("%s: regexec %lu failed\n", tests[i].pattern, i); 122a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner ret = 1; 123a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner regfree (&re); 124a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner continue; 125a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner } 126a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 127a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner for (n = 0; n < tests[i].nmatch; ++n) 128a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner if (rm[n].rm_so != tests[i].rm[n].rm_so 129a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner || rm[n].rm_eo != tests[i].rm[n].rm_eo) 130a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner { 131a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner if (tests[i].rm[n].rm_so == -1 && tests[i].rm[n].rm_eo == -1) 132a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner break; 133a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner printf ("%s: regexec %lu match failure rm[%d] %d..%d\n", 134a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner tests[i].pattern, i, n, rm[n].rm_so, rm[n].rm_eo); 135a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner ret = 1; 136a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner break; 137a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner } 138a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 139a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner regfree (&re); 140a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner } 141a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 142a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner return ret; 143a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner} 144