/* Regular expression tests.
   Copyright (C) 2002 Free Software Foundation, Inc.
   This file is part of the GNU C Library.
   Contributed by Isamu Hasegawa <isamu@yamato.ibm.com>, 2002.

   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., 51 Franklin Street, Fifth Floor, Boston, MA
   02110-1301 USA.  */

#ifdef HAVE_CONFIG_H
#include "config.h"
#endif

#include <sys/types.h>
#ifdef HAVE_MCHECK_H
#include <mcheck.h>
#endif
#include <regex.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

static struct
{
  int syntax;
  const char *pattern;
  const char *string;
  int start;
} tests[] = {
  {RE_BACKSLASH_ESCAPE_IN_LISTS, "[0\\-9]", "1", -1}, /* It should not match.  */
  {RE_BACKSLASH_ESCAPE_IN_LISTS, "[0\\-9]", "-", 0}, /* It should match.  */
  {RE_SYNTAX_POSIX_BASIC, "s1\n.*\ns3", "s1\ns2\ns3", 0},
  {RE_SYNTAX_POSIX_EXTENDED, "ab{0}c", "ac", 0},
  {RE_SYNTAX_POSIX_EXTENDED, "ab{0}c", "abc", -1},
  {RE_SYNTAX_POSIX_EXTENDED, "ab{0}c", "abbc", -1},
  /* Nested duplication.  */
  {RE_SYNTAX_POSIX_EXTENDED, "ab{1}{1}c", "ac", -1},
  {RE_SYNTAX_POSIX_EXTENDED, "ab{1}{1}c", "abc", 0},
  {RE_SYNTAX_POSIX_EXTENDED, "ab{1}{1}c", "abbc", -1},
  {RE_SYNTAX_POSIX_EXTENDED, "ab{2}{2}c", "ac", -1},
  {RE_SYNTAX_POSIX_EXTENDED, "ab{2}{2}c", "abbc", -1},
  {RE_SYNTAX_POSIX_EXTENDED, "ab{2}{2}c", "abbbbc", 0},
  {RE_SYNTAX_POSIX_EXTENDED, "ab{2}{2}c", "abbbbbc", -1},
  {RE_SYNTAX_POSIX_EXTENDED, "ab{0}{1}c", "ac", 0},
  {RE_SYNTAX_POSIX_EXTENDED, "ab{0}{1}c", "abc", -1},
  {RE_SYNTAX_POSIX_EXTENDED, "ab{0}{1}c", "abbc", -1},
  {RE_SYNTAX_POSIX_EXTENDED, "ab{1}{0}c", "ac", 0},
  {RE_SYNTAX_POSIX_EXTENDED, "ab{1}{0}c", "abc", -1},
  {RE_SYNTAX_POSIX_EXTENDED, "ab{1}{0}c", "abbc", -1},
  {RE_SYNTAX_POSIX_EXTENDED, "ab{0}*c", "ac", 0},
  {RE_SYNTAX_POSIX_EXTENDED, "ab{0}*c", "abc", -1},
  {RE_SYNTAX_POSIX_EXTENDED, "ab{0}*c", "abbc", -1},
  {RE_SYNTAX_POSIX_EXTENDED, "ab{0}?c", "ac", 0},
  {RE_SYNTAX_POSIX_EXTENDED, "ab{0}?c", "abc", -1},
  {RE_SYNTAX_POSIX_EXTENDED, "ab{0}?c", "abbc", -1},
  {RE_SYNTAX_POSIX_EXTENDED, "ab{0}+c", "ac", 0},
  {RE_SYNTAX_POSIX_EXTENDED, "ab{0}+c", "abc", -1},
  {RE_SYNTAX_POSIX_EXTENDED, "ab{0}+c", "abbc", -1},
};

int
main (void)
{
  struct re_pattern_buffer regbuf;
  const char *err;
  size_t i;
  int ret = 0;

#ifdef HAVE_MCHECK_H
  mtrace ();
#endif

  for (i = 0; i < sizeof (tests) / sizeof (tests[0]); ++i)
    {
      int start;
      re_set_syntax (tests[i].syntax);
      memset (&regbuf, '\0', sizeof (regbuf));
      err = re_compile_pattern (tests[i].pattern, strlen (tests[i].pattern),
                                &regbuf);
      if (err != NULL)
	{
	  printf ("re_compile_pattern failed: %s\n", err);
	  ret = 1;
	  continue;
	}

      start = re_search (&regbuf, tests[i].string, strlen (tests[i].string),
                         0, strlen (tests[i].string), NULL);
      if (start != tests[i].start)
	{
	  printf ("re_search failed %d\n", start);
	  ret = 1;
	  regfree (&regbuf);
	  continue;
	}
      regfree (&regbuf);
    }

  return ret;
}
