1a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner/* POSIX regex testsuite from IEEE 2003.2. 2a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner Copyright (C) 1998, 2003 Free Software Foundation, Inc. 3a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner This file is part of the GNU C Library. 4a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998. 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#include <regex.h> 27a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#include <stdio.h> 28a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#include <string.h> 29a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 30a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner/* Data structure to describe the tests. */ 31a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turnerstruct test 32a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner{ 33a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner int start; 34a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner int end; 35a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner const char *reg; 36a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner const char *str; 37a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner int options; 38a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner} tests[] = 39a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner{ 40a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#include "ptestcases.h" 41a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner}; 42a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 43a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 44a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turnerint 45a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turnermain (int argc, char *argv[]) 46a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner{ 47a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner size_t cnt; 48a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner int errors = 0; 49a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 50a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner for (cnt = 0; cnt < sizeof (tests) / sizeof (tests[0]); ++cnt) 51a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner if (tests[cnt].str == NULL) 52a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner { 53a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner printf ("\n%s\n%.*s\n", tests[cnt].reg, 54a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner (int) strlen (tests[cnt].reg), 55a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner "-----------------------------------------------------"); 56a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner } 57a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner else if (tests[cnt].reg == NULL) 58a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner printf ("!!! %s\n", tests[cnt].str); 59a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner else 60a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner { 61a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner regex_t re; 62a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner regmatch_t match[20]; 63a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner int err; 64a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 65a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner printf ("regexp: \"%s\", string: \"%s\" -> ", tests[cnt].reg, 66a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner tests[cnt].str); 67a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 68a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner /* Compile the expression. */ 69a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner err = regcomp (&re, tests[cnt].reg, tests[cnt].options); 70a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner if (err != 0) 71a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner { 72a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner if (tests[cnt].start == -2) 73a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner puts ("compiling failed, OK"); 74a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner else 75a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner { 76a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner char buf[100]; 77a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner regerror (err, &re, buf, sizeof (buf)); 78a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner printf ("FAIL: %s\n", buf); 79a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner ++errors; 80a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner } 81a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 82a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner continue; 83a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner } 84a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner else if (tests[cnt].start == -2) 85a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner { 86a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner puts ("compiling suceeds, FAIL"); 87a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner errors++; 88a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner continue; 89a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner } 90a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 91a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner /* Run the actual test. */ 92a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner err = regexec (&re, tests[cnt].str, 20, match, 0); 93a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 94a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner if (err != 0) 95a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner { 96a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner if (tests[cnt].start == -1) 97a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner puts ("no match, OK"); 98a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner else 99a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner { 100a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner puts ("no match, FAIL"); 101a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner ++errors; 102a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner } 103a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner } 104a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner else 105a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner { 106a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner if (match[0].rm_so == 0 && tests[cnt].start == 0 107a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner && match[0].rm_eo == 0 && tests[cnt].end == 0) 108a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner puts ("match, OK"); 109a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner else if (match[0].rm_so + 1 == tests[cnt].start 110a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner && match[0].rm_eo == tests[cnt].end) 111a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner puts ("match, OK"); 112a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner else 113a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner { 114a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner printf ("wrong match (%d to %d): FAIL\n", 115a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner match[0].rm_so, match[0].rm_eo); 116a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner ++errors; 117a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner } 118a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner } 119a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 120a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner /* Free all resources. */ 121a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner regfree (&re); 122a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner } 123a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 124a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner printf ("\n%u tests, %d errors\n", (int) cnt, errors); 125a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 126a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner return errors != 0; 127a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner} 128