(root)/
glibc-2.38/
posix/
bug-regex13.c
       1  /* Regular expression tests.
       2     Copyright (C) 2002-2023 Free Software Foundation, Inc.
       3     This file is part of the GNU C Library.
       4  
       5     The GNU C Library is free software; you can redistribute it and/or
       6     modify it under the terms of the GNU Lesser General Public
       7     License as published by the Free Software Foundation; either
       8     version 2.1 of the License, or (at your option) any later version.
       9  
      10     The GNU C Library is distributed in the hope that it will be useful,
      11     but WITHOUT ANY WARRANTY; without even the implied warranty of
      12     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
      13     Lesser General Public License for more details.
      14  
      15     You should have received a copy of the GNU Lesser General Public
      16     License along with the GNU C Library; if not, see
      17     <https://www.gnu.org/licenses/>.  */
      18  
      19  #include <sys/types.h>
      20  #include <mcheck.h>
      21  #include <regex.h>
      22  #include <stdio.h>
      23  #include <stdlib.h>
      24  #include <string.h>
      25  
      26  static struct
      27  {
      28    int syntax;
      29    const char *pattern;
      30    const char *string;
      31    int start;
      32  } tests[] = {
      33    {RE_BACKSLASH_ESCAPE_IN_LISTS, "[0\\-9]", "1", -1}, /* It should not match.  */
      34    {RE_BACKSLASH_ESCAPE_IN_LISTS, "[0\\-9]", "-", 0}, /* It should match.  */
      35    {RE_SYNTAX_POSIX_BASIC, "s1\n.*\ns3", "s1\ns2\ns3", 0},
      36    {RE_SYNTAX_POSIX_EXTENDED, "ab{0}c", "ac", 0},
      37    {RE_SYNTAX_POSIX_EXTENDED, "ab{0}c", "abc", -1},
      38    {RE_SYNTAX_POSIX_EXTENDED, "ab{0}c", "abbc", -1},
      39    /* Nested duplication.  */
      40    {RE_SYNTAX_POSIX_EXTENDED, "ab{1}{1}c", "ac", -1},
      41    {RE_SYNTAX_POSIX_EXTENDED, "ab{1}{1}c", "abc", 0},
      42    {RE_SYNTAX_POSIX_EXTENDED, "ab{1}{1}c", "abbc", -1},
      43    {RE_SYNTAX_POSIX_EXTENDED, "ab{2}{2}c", "ac", -1},
      44    {RE_SYNTAX_POSIX_EXTENDED, "ab{2}{2}c", "abbc", -1},
      45    {RE_SYNTAX_POSIX_EXTENDED, "ab{2}{2}c", "abbbbc", 0},
      46    {RE_SYNTAX_POSIX_EXTENDED, "ab{2}{2}c", "abbbbbc", -1},
      47    {RE_SYNTAX_POSIX_EXTENDED, "ab{0}{1}c", "ac", 0},
      48    {RE_SYNTAX_POSIX_EXTENDED, "ab{0}{1}c", "abc", -1},
      49    {RE_SYNTAX_POSIX_EXTENDED, "ab{0}{1}c", "abbc", -1},
      50    {RE_SYNTAX_POSIX_EXTENDED, "ab{1}{0}c", "ac", 0},
      51    {RE_SYNTAX_POSIX_EXTENDED, "ab{1}{0}c", "abc", -1},
      52    {RE_SYNTAX_POSIX_EXTENDED, "ab{1}{0}c", "abbc", -1},
      53    {RE_SYNTAX_POSIX_EXTENDED, "ab{0}*c", "ac", 0},
      54    {RE_SYNTAX_POSIX_EXTENDED, "ab{0}*c", "abc", -1},
      55    {RE_SYNTAX_POSIX_EXTENDED, "ab{0}*c", "abbc", -1},
      56    {RE_SYNTAX_POSIX_EXTENDED, "ab{0}?c", "ac", 0},
      57    {RE_SYNTAX_POSIX_EXTENDED, "ab{0}?c", "abc", -1},
      58    {RE_SYNTAX_POSIX_EXTENDED, "ab{0}?c", "abbc", -1},
      59    {RE_SYNTAX_POSIX_EXTENDED, "ab{0}+c", "ac", 0},
      60    {RE_SYNTAX_POSIX_EXTENDED, "ab{0}+c", "abc", -1},
      61    {RE_SYNTAX_POSIX_EXTENDED, "ab{0}+c", "abbc", -1},
      62  };
      63  
      64  int
      65  main (void)
      66  {
      67    struct re_pattern_buffer regbuf;
      68    const char *err;
      69    size_t i;
      70    int ret = 0;
      71  
      72    mtrace ();
      73  
      74    for (i = 0; i < sizeof (tests) / sizeof (tests[0]); ++i)
      75      {
      76        int start;
      77        re_set_syntax (tests[i].syntax);
      78        memset (&regbuf, '\0', sizeof (regbuf));
      79        err = re_compile_pattern (tests[i].pattern, strlen (tests[i].pattern),
      80                                  &regbuf);
      81        if (err != NULL)
      82  	{
      83  	  printf ("re_compile_pattern failed: %s\n", err);
      84  	  ret = 1;
      85  	  continue;
      86  	}
      87  
      88        start = re_search (&regbuf, tests[i].string, strlen (tests[i].string),
      89                           0, strlen (tests[i].string), NULL);
      90        if (start != tests[i].start)
      91  	{
      92  	  printf ("re_search failed %d\n", start);
      93  	  ret = 1;
      94  	  regfree (&regbuf);
      95  	  continue;
      96  	}
      97        regfree (&regbuf);
      98      }
      99  
     100    return ret;
     101  }