mirror of
				https://sourceware.org/git/glibc.git
				synced 2025-11-03 20:53:13 +03:00 
			
		
		
		
	2003-11-25 Ulrich Drepper <drepper@redhat.com> * posix/runptests.c (main): Make errors fatal. * posix/PTESTS: One test in GA135 and GA136 check functionality which seems not guaranteed. 2003-11-25 Jakub Jelinek <jakub@redhat.com> * posix/regexec.c (re_search_internal): If prune_impossible_nodes returned REG_NOMATCH, set match_last to -1. Don't initialize pmatch[0] needlessly. Fix comment. (prune_impossible_nodes): Don't segfault on NULL state_log entry. (set_regs): Fix comment. * posix/regcomp.c (parse_bracket_exp): Only set has_plural_match if adding both SIMPLE_BRACKET and COMPLEX_BRACKET. (build_charclass_op): Set has_plural_match if adding both SIMPLE_BRACKET and COMPLEX_BRACKET. * posix/bug-regex11.c (tests): Fix register values for one commented out test. Add new tests. * posix/regex_internal.c (re_string_allocate): Make sure init_len is at least dfa->mb_cur_max. (re_string_reconstruct): If is_utf8, don't fall back into re_string_skip_chars just because idx points into a middle of valid UTF-8 character. Instead, set the wcs bytes which correspond to the partial character bytes to WEOF. * posix/regexec.c (re_search_internal): Allocate input.bufs_len + 1 instead of dfa->nodes_len + 1 state_log entries initially. * posix/bug-regex20.c (main): Uncomment backwards case insensitive tests.
		
			
				
	
	
		
			124 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			124 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/* POSIX regex testsuite from IEEE 2003.2.
 | 
						|
   Copyright (C) 1998, 2003 Free Software Foundation, Inc.
 | 
						|
   This file is part of the GNU C Library.
 | 
						|
   Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998.
 | 
						|
 | 
						|
   The GNU C Library is free software; you can redistribute it and/or
 | 
						|
   modify it under the terms of the GNU Lesser General Public
 | 
						|
   License as published by the Free Software Foundation; either
 | 
						|
   version 2.1 of the License, or (at your option) any later version.
 | 
						|
 | 
						|
   The GNU C Library is distributed in the hope that it will be useful,
 | 
						|
   but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
						|
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 | 
						|
   Lesser General Public License for more details.
 | 
						|
 | 
						|
   You should have received a copy of the GNU Lesser General Public
 | 
						|
   License along with the GNU C Library; if not, write to the Free
 | 
						|
   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
 | 
						|
   02111-1307 USA.  */
 | 
						|
 | 
						|
#include <sys/types.h>
 | 
						|
#include <regex.h>
 | 
						|
#include <stdio.h>
 | 
						|
#include <string.h>
 | 
						|
 | 
						|
/* Data structure to describe the tests.  */
 | 
						|
struct test
 | 
						|
{
 | 
						|
  int start;
 | 
						|
  int end;
 | 
						|
  const char *reg;
 | 
						|
  const char *str;
 | 
						|
  int options;
 | 
						|
} tests[] =
 | 
						|
{
 | 
						|
#include "ptestcases.h"
 | 
						|
};
 | 
						|
 | 
						|
 | 
						|
int
 | 
						|
main (int argc, char *argv[])
 | 
						|
{
 | 
						|
  size_t cnt;
 | 
						|
  int errors = 0;
 | 
						|
 | 
						|
  for (cnt = 0; cnt < sizeof (tests) / sizeof (tests[0]); ++cnt)
 | 
						|
    if (tests[cnt].str == NULL)
 | 
						|
      {
 | 
						|
	printf ("\n%s\n%.*s\n", tests[cnt].reg,
 | 
						|
		(int) strlen (tests[cnt].reg),
 | 
						|
		"-----------------------------------------------------");
 | 
						|
      }
 | 
						|
    else if (tests[cnt].reg == NULL)
 | 
						|
	printf ("!!! %s\n", tests[cnt].str);
 | 
						|
    else
 | 
						|
      {
 | 
						|
	regex_t re;
 | 
						|
	regmatch_t match[20];
 | 
						|
	int err;
 | 
						|
 | 
						|
	printf ("regexp: \"%s\", string: \"%s\" -> ", tests[cnt].reg,
 | 
						|
		tests[cnt].str);
 | 
						|
 | 
						|
	/* Compile the expression.  */
 | 
						|
	err = regcomp (&re, tests[cnt].reg, tests[cnt].options);
 | 
						|
	if (err != 0)
 | 
						|
	  {
 | 
						|
	    if (tests[cnt].start == -2)
 | 
						|
	      puts ("compiling failed, OK");
 | 
						|
	    else
 | 
						|
	      {
 | 
						|
		char buf[100];
 | 
						|
		regerror (err, &re, buf, sizeof (buf));
 | 
						|
		printf ("FAIL: %s\n", buf);
 | 
						|
		++errors;
 | 
						|
	      }
 | 
						|
 | 
						|
	    continue;
 | 
						|
	  }
 | 
						|
	else if (tests[cnt].start == -2)
 | 
						|
	  {
 | 
						|
	    puts ("compiling suceeds, FAIL");
 | 
						|
	    errors++;
 | 
						|
	    continue;
 | 
						|
	  }
 | 
						|
 | 
						|
	/* Run the actual test.  */
 | 
						|
	err = regexec (&re, tests[cnt].str, 20, match, 0);
 | 
						|
 | 
						|
	if (err != 0)
 | 
						|
	  {
 | 
						|
	    if (tests[cnt].start == -1)
 | 
						|
	      puts ("no match, OK");
 | 
						|
	    else
 | 
						|
	      {
 | 
						|
		puts ("no match, FAIL");
 | 
						|
		++errors;
 | 
						|
	      }
 | 
						|
	  }
 | 
						|
	else
 | 
						|
	  {
 | 
						|
	    if (match[0].rm_so == 0 && tests[cnt].start == 0
 | 
						|
		&& match[0].rm_eo == 0 && tests[cnt].end == 0)
 | 
						|
	      puts ("match, OK");
 | 
						|
	    else if (match[0].rm_so + 1 == tests[cnt].start
 | 
						|
		     && match[0].rm_eo == tests[cnt].end)
 | 
						|
	      puts ("match, OK");
 | 
						|
	    else
 | 
						|
	      {
 | 
						|
		printf ("wrong match (%d to %d): FAIL\n",
 | 
						|
			match[0].rm_so, match[0].rm_eo);
 | 
						|
		++errors;
 | 
						|
	      }
 | 
						|
	  }
 | 
						|
 | 
						|
	/* Free all resources.  */
 | 
						|
	regfree (&re);
 | 
						|
      }
 | 
						|
 | 
						|
  printf ("\n%Zu tests, %d errors\n", cnt, errors);
 | 
						|
 | 
						|
  return errors != 0;
 | 
						|
}
 |