From f39eef7b5d2539cffa1149b0bbeb75f513a4ace3 Mon Sep 17 00:00:00 2001 From: Ulrich Drepper Date: Tue, 6 Jan 2004 22:12:27 +0000 Subject: Update. 2004-01-05 Jakub Jelinek * posix/regcomp.c (regcomp): Fix comment typo. (regfree): Free preg->translate, clear buffer, allocated, fastmap and translate fields. * posix/regcomp.c (build_charclass, buld_charclass_op): Change first argument to unsigned RE_TRANSLATE_TYPE. * posix/regex_internal.h (re_string_t): Change trans type to unsigned RE_TRANSLATE_TYPE. * posix/regex_internal.c (re_string_construct_common): Cast trans to unsigned RE_TRANSLATE_TYPE. (re_string_peek_byte_case, re_string_fetch_byte_case): Avoid fast path if pstr->trans. Never translate the character through pstr->trans. * posix/Makefile (tests): Add bug-regex22. (bug-regex22-ENV): Set. * posix/bug-regex22.c: New test. --- posix/bug-regex22.c | 109 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 109 insertions(+) create mode 100644 posix/bug-regex22.c (limited to 'posix/bug-regex22.c') diff --git a/posix/bug-regex22.c b/posix/bug-regex22.c new file mode 100644 index 0000000000..4d8357c27b --- /dev/null +++ b/posix/bug-regex22.c @@ -0,0 +1,109 @@ +/* Test re.translate != NULL. + Copyright (C) 2004 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Jakub Jelinek , 2004. + + 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 +#include +#include +#include +#include + +int +main (void) +{ + struct re_pattern_buffer re; + char trans[256]; + int i, result = 0; + const char *s; + + setlocale (LC_ALL, "de_DE.ISO-8859-1"); + + for (i = 0; i < 256; ++i) + trans[i] = tolower (i); + + re_set_syntax (RE_SYNTAX_POSIX_EGREP); + + memset (&re, 0, sizeof (re)); + re.translate = trans; + s = re_compile_pattern ("\\W", 2, &re); + + if (s != NULL) + { + printf ("failed to compile pattern \"\\W\": %s\n", s); + result = 1; + } + else + { + int ret = re_search (&re, "abc.de", 6, 0, 6, NULL); + if (ret != 3) + { + printf ("1st re_search returned %d\n", ret); + result = 1; + } + + ret = re_search (&re, "\xc4\xd6\xae\xf7", 4, 0, 4, NULL); + if (ret != 2) + { + printf ("2nd re_search returned %d\n", ret); + result = 1; + } + re.translate = NULL; + regfree (&re); + } + + memset (&re, 0, sizeof (re)); + re.translate = trans; + s = re_compile_pattern ("\\w", 2, &re); + + if (s != NULL) + { + printf ("failed to compile pattern \"\\w\": %s\n", s); + result = 1; + } + else + { + int ret = re_search (&re, ".,!abc", 6, 0, 6, NULL); + if (ret != 3) + { + printf ("3rd re_search returned %d\n", ret); + result = 1; + } + + ret = re_search (&re, "\xae\xf7\xc4\xd6", 4, 0, 4, NULL); + if (ret != 2) + { + printf ("4th re_search returned %d\n", ret); + result = 1; + } + re.translate = NULL; + regfree (&re); + } + + memset (&re, 0, sizeof (re)); + re.translate = trans; + s = re_compile_pattern ("[[:DIGIT:]]", 2, &re); + if (s == NULL) + { + printf ("compilation of \"[[:DIGIT:]]\" pattern unexpectedly succeeded: %s\n", + s); + result = 1; + } + + return result; +} -- cgit v1.2.3