Blame gnulib-tests/test-getopt.h

Packit 709fb3
/* Test of command line argument processing.
Packit 709fb3
   Copyright (C) 2009-2017 Free Software Foundation, Inc.
Packit 709fb3
Packit 709fb3
   This program is free software: you can redistribute it and/or modify
Packit 709fb3
   it under the terms of the GNU General Public License as published by
Packit 709fb3
   the Free Software Foundation; either version 3 of the License, or
Packit 709fb3
   (at your option) any later version.
Packit 709fb3
Packit 709fb3
   This program is distributed in the hope that it will be useful,
Packit 709fb3
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 709fb3
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit 709fb3
   GNU General Public License for more details.
Packit 709fb3
Packit 709fb3
   You should have received a copy of the GNU General Public License
Packit 709fb3
   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
Packit 709fb3
Packit 709fb3
/* Written by Bruno Haible <bruno@clisp.org>, 2009.  */
Packit 709fb3
Packit 709fb3
#include <stdbool.h>
Packit 709fb3
Packit 709fb3
/* The glibc/gnulib implementation of getopt supports setting optind =
Packit 709fb3
   0, but not all other implementations do.  This matters for getopt.
Packit 709fb3
   But for getopt_long, we require GNU compatibility.  */
Packit 709fb3
#if defined __GETOPT_PREFIX || (__GLIBC__ >= 2 && !defined __UCLIBC__)
Packit 709fb3
# define OPTIND_MIN 0
Packit 709fb3
#elif HAVE_DECL_OPTRESET
Packit 709fb3
# define OPTIND_MIN (optreset = 1)
Packit 709fb3
#else
Packit 709fb3
# define OPTIND_MIN 1
Packit 709fb3
#endif
Packit 709fb3
Packit 709fb3
static void
Packit 709fb3
getopt_loop (int argc, const char **argv,
Packit 709fb3
             const char *options,
Packit 709fb3
             int *a_seen, int *b_seen,
Packit 709fb3
             const char **p_value, const char **q_value,
Packit 709fb3
             int *non_options_count, const char **non_options,
Packit 709fb3
             int *unrecognized, bool *message_issued)
Packit 709fb3
{
Packit 709fb3
  int c;
Packit 709fb3
  int pos = ftell (stderr);
Packit 709fb3
Packit 709fb3
  while ((c = getopt (argc, (char **) argv, options)) != -1)
Packit 709fb3
    {
Packit 709fb3
      switch (c)
Packit 709fb3
        {
Packit 709fb3
        case 'a':
Packit 709fb3
          (*a_seen)++;
Packit 709fb3
          break;
Packit 709fb3
        case 'b':
Packit 709fb3
          (*b_seen)++;
Packit 709fb3
          break;
Packit 709fb3
        case 'p':
Packit 709fb3
          *p_value = optarg;
Packit 709fb3
          break;
Packit 709fb3
        case 'q':
Packit 709fb3
          *q_value = optarg;
Packit 709fb3
          break;
Packit 709fb3
        case '\1':
Packit 709fb3
          /* Must only happen with option '-' at the beginning.  */
Packit 709fb3
          ASSERT (options[0] == '-');
Packit 709fb3
          non_options[(*non_options_count)++] = optarg;
Packit 709fb3
          break;
Packit 709fb3
        case ':':
Packit 709fb3
          /* Must only happen with option ':' at the beginning.  */
Packit 709fb3
          ASSERT (options[0] == ':'
Packit 709fb3
                  || ((options[0] == '-' || options[0] == '+')
Packit 709fb3
                      && options[1] == ':'));
Packit 709fb3
          FALLTHROUGH;
Packit 709fb3
        case '?':
Packit 709fb3
          *unrecognized = optopt;
Packit 709fb3
          break;
Packit 709fb3
        default:
Packit 709fb3
          *unrecognized = c;
Packit 709fb3
          break;
Packit 709fb3
        }
Packit 709fb3
    }
Packit 709fb3
Packit 709fb3
  *message_issued = pos < ftell (stderr);
Packit 709fb3
}
Packit 709fb3
Packit 709fb3
static void
Packit 709fb3
test_getopt (void)
Packit 709fb3
{
Packit 709fb3
  int start;
Packit 709fb3
  bool posixly = !!getenv ("POSIXLY_CORRECT");
Packit 709fb3
  /* See comment in getopt.c:
Packit 709fb3
     glibc gets a LSB-compliant getopt.
Packit 709fb3
     Standalone applications get a POSIX-compliant getopt.  */
Packit 709fb3
#if defined __GETOPT_PREFIX || !(__GLIBC__ >= 2 || defined __MINGW32__)
Packit 709fb3
  /* Using getopt from gnulib or from a non-glibc system.  */
Packit 709fb3
  posixly = true;
Packit 709fb3
#endif
Packit 709fb3
Packit 709fb3
  /* Test processing of boolean options.  */
Packit 709fb3
  for (start = OPTIND_MIN; start <= 1; start++)
Packit 709fb3
    {
Packit 709fb3
      int a_seen = 0;
Packit 709fb3
      int b_seen = 0;
Packit 709fb3
      const char *p_value = NULL;
Packit 709fb3
      const char *q_value = NULL;
Packit 709fb3
      int non_options_count = 0;
Packit 709fb3
      const char *non_options[10];
Packit 709fb3
      int unrecognized = 0;
Packit 709fb3
      bool output;
Packit 709fb3
      int argc = 0;
Packit 709fb3
      const char *argv[10];
Packit 709fb3
Packit 709fb3
      argv[argc++] = "program";
Packit 709fb3
      argv[argc++] = "-a";
Packit 709fb3
      argv[argc++] = "foo";
Packit 709fb3
      argv[argc++] = "bar";
Packit 709fb3
      argv[argc] = NULL;
Packit 709fb3
      optind = start;
Packit 709fb3
      opterr = 1;
Packit 709fb3
      getopt_loop (argc, argv, "ab",
Packit 709fb3
                   &a_seen, &b_seen, &p_value, &q_value,
Packit 709fb3
                   &non_options_count, non_options, &unrecognized, &output);
Packit 709fb3
      ASSERT (a_seen == 1);
Packit 709fb3
      ASSERT (b_seen == 0);
Packit 709fb3
      ASSERT (p_value == NULL);
Packit 709fb3
      ASSERT (q_value == NULL);
Packit 709fb3
      ASSERT (non_options_count == 0);
Packit 709fb3
      ASSERT (unrecognized == 0);
Packit 709fb3
      ASSERT (optind == 2);
Packit 709fb3
      ASSERT (!output);
Packit 709fb3
    }
Packit 709fb3
  for (start = OPTIND_MIN; start <= 1; start++)
Packit 709fb3
    {
Packit 709fb3
      int a_seen = 0;
Packit 709fb3
      int b_seen = 0;
Packit 709fb3
      const char *p_value = NULL;
Packit 709fb3
      const char *q_value = NULL;
Packit 709fb3
      int non_options_count = 0;
Packit 709fb3
      const char *non_options[10];
Packit 709fb3
      int unrecognized = 0;
Packit 709fb3
      bool output;
Packit 709fb3
      int argc = 0;
Packit 709fb3
      const char *argv[10];
Packit 709fb3
Packit 709fb3
      argv[argc++] = "program";
Packit 709fb3
      argv[argc++] = "-b";
Packit 709fb3
      argv[argc++] = "-a";
Packit 709fb3
      argv[argc++] = "foo";
Packit 709fb3
      argv[argc++] = "bar";
Packit 709fb3
      argv[argc] = NULL;
Packit 709fb3
      optind = start;
Packit 709fb3
      opterr = 1;
Packit 709fb3
      getopt_loop (argc, argv, "ab",
Packit 709fb3
                   &a_seen, &b_seen, &p_value, &q_value,
Packit 709fb3
                   &non_options_count, non_options, &unrecognized, &output);
Packit 709fb3
      ASSERT (a_seen == 1);
Packit 709fb3
      ASSERT (b_seen == 1);
Packit 709fb3
      ASSERT (p_value == NULL);
Packit 709fb3
      ASSERT (q_value == NULL);
Packit 709fb3
      ASSERT (non_options_count == 0);
Packit 709fb3
      ASSERT (unrecognized == 0);
Packit 709fb3
      ASSERT (optind == 3);
Packit 709fb3
      ASSERT (!output);
Packit 709fb3
    }
Packit 709fb3
  for (start = OPTIND_MIN; start <= 1; start++)
Packit 709fb3
    {
Packit 709fb3
      int a_seen = 0;
Packit 709fb3
      int b_seen = 0;
Packit 709fb3
      const char *p_value = NULL;
Packit 709fb3
      const char *q_value = NULL;
Packit 709fb3
      int non_options_count = 0;
Packit 709fb3
      const char *non_options[10];
Packit 709fb3
      int unrecognized = 0;
Packit 709fb3
      bool output;
Packit 709fb3
      int argc = 0;
Packit 709fb3
      const char *argv[10];
Packit 709fb3
Packit 709fb3
      argv[argc++] = "program";
Packit 709fb3
      argv[argc++] = "-ba";
Packit 709fb3
      argv[argc++] = "foo";
Packit 709fb3
      argv[argc++] = "bar";
Packit 709fb3
      argv[argc] = NULL;
Packit 709fb3
      optind = start;
Packit 709fb3
      opterr = 1;
Packit 709fb3
      getopt_loop (argc, argv, "ab",
Packit 709fb3
                   &a_seen, &b_seen, &p_value, &q_value,
Packit 709fb3
                   &non_options_count, non_options, &unrecognized, &output);
Packit 709fb3
      ASSERT (a_seen == 1);
Packit 709fb3
      ASSERT (b_seen == 1);
Packit 709fb3
      ASSERT (p_value == NULL);
Packit 709fb3
      ASSERT (q_value == NULL);
Packit 709fb3
      ASSERT (non_options_count == 0);
Packit 709fb3
      ASSERT (unrecognized == 0);
Packit 709fb3
      ASSERT (optind == 2);
Packit 709fb3
      ASSERT (!output);
Packit 709fb3
    }
Packit 709fb3
  for (start = OPTIND_MIN; start <= 1; start++)
Packit 709fb3
    {
Packit 709fb3
      int a_seen = 0;
Packit 709fb3
      int b_seen = 0;
Packit 709fb3
      const char *p_value = NULL;
Packit 709fb3
      const char *q_value = NULL;
Packit 709fb3
      int non_options_count = 0;
Packit 709fb3
      const char *non_options[10];
Packit 709fb3
      int unrecognized = 0;
Packit 709fb3
      bool output;
Packit 709fb3
      int argc = 0;
Packit 709fb3
      const char *argv[10];
Packit 709fb3
Packit 709fb3
      argv[argc++] = "program";
Packit 709fb3
      argv[argc++] = "-ab";
Packit 709fb3
      argv[argc++] = "-a";
Packit 709fb3
      argv[argc++] = "foo";
Packit 709fb3
      argv[argc++] = "bar";
Packit 709fb3
      argv[argc] = NULL;
Packit 709fb3
      optind = start;
Packit 709fb3
      opterr = 1;
Packit 709fb3
      getopt_loop (argc, argv, "ab",
Packit 709fb3
                   &a_seen, &b_seen, &p_value, &q_value,
Packit 709fb3
                   &non_options_count, non_options, &unrecognized, &output);
Packit 709fb3
      ASSERT (a_seen == 2);
Packit 709fb3
      ASSERT (b_seen == 1);
Packit 709fb3
      ASSERT (p_value == NULL);
Packit 709fb3
      ASSERT (q_value == NULL);
Packit 709fb3
      ASSERT (non_options_count == 0);
Packit 709fb3
      ASSERT (unrecognized == 0);
Packit 709fb3
      ASSERT (optind == 3);
Packit 709fb3
      ASSERT (!output);
Packit 709fb3
    }
Packit 709fb3
Packit 709fb3
  /* Test processing of options with arguments.  */
Packit 709fb3
  for (start = OPTIND_MIN; start <= 1; start++)
Packit 709fb3
    {
Packit 709fb3
      int a_seen = 0;
Packit 709fb3
      int b_seen = 0;
Packit 709fb3
      const char *p_value = NULL;
Packit 709fb3
      const char *q_value = NULL;
Packit 709fb3
      int non_options_count = 0;
Packit 709fb3
      const char *non_options[10];
Packit 709fb3
      int unrecognized = 0;
Packit 709fb3
      bool output;
Packit 709fb3
      int argc = 0;
Packit 709fb3
      const char *argv[10];
Packit 709fb3
Packit 709fb3
      argv[argc++] = "program";
Packit 709fb3
      argv[argc++] = "-pfoo";
Packit 709fb3
      argv[argc++] = "bar";
Packit 709fb3
      argv[argc] = NULL;
Packit 709fb3
      optind = start;
Packit 709fb3
      opterr = 1;
Packit 709fb3
      getopt_loop (argc, argv, "p:q:",
Packit 709fb3
                   &a_seen, &b_seen, &p_value, &q_value,
Packit 709fb3
                   &non_options_count, non_options, &unrecognized, &output);
Packit 709fb3
      ASSERT (a_seen == 0);
Packit 709fb3
      ASSERT (b_seen == 0);
Packit 709fb3
      ASSERT (p_value != NULL && strcmp (p_value, "foo") == 0);
Packit 709fb3
      ASSERT (q_value == NULL);
Packit 709fb3
      ASSERT (non_options_count == 0);
Packit 709fb3
      ASSERT (unrecognized == 0);
Packit 709fb3
      ASSERT (optind == 2);
Packit 709fb3
      ASSERT (!output);
Packit 709fb3
    }
Packit 709fb3
  for (start = OPTIND_MIN; start <= 1; start++)
Packit 709fb3
    {
Packit 709fb3
      int a_seen = 0;
Packit 709fb3
      int b_seen = 0;
Packit 709fb3
      const char *p_value = NULL;
Packit 709fb3
      const char *q_value = NULL;
Packit 709fb3
      int non_options_count = 0;
Packit 709fb3
      const char *non_options[10];
Packit 709fb3
      int unrecognized = 0;
Packit 709fb3
      bool output;
Packit 709fb3
      int argc = 0;
Packit 709fb3
      const char *argv[10];
Packit 709fb3
Packit 709fb3
      argv[argc++] = "program";
Packit 709fb3
      argv[argc++] = "-p";
Packit 709fb3
      argv[argc++] = "foo";
Packit 709fb3
      argv[argc++] = "bar";
Packit 709fb3
      argv[argc] = NULL;
Packit 709fb3
      optind = start;
Packit 709fb3
      opterr = 1;
Packit 709fb3
      getopt_loop (argc, argv, "p:q:",
Packit 709fb3
                   &a_seen, &b_seen, &p_value, &q_value,
Packit 709fb3
                   &non_options_count, non_options, &unrecognized, &output);
Packit 709fb3
      ASSERT (a_seen == 0);
Packit 709fb3
      ASSERT (b_seen == 0);
Packit 709fb3
      ASSERT (p_value != NULL && strcmp (p_value, "foo") == 0);
Packit 709fb3
      ASSERT (q_value == NULL);
Packit 709fb3
      ASSERT (non_options_count == 0);
Packit 709fb3
      ASSERT (unrecognized == 0);
Packit 709fb3
      ASSERT (optind == 3);
Packit 709fb3
      ASSERT (!output);
Packit 709fb3
    }
Packit 709fb3
  for (start = OPTIND_MIN; start <= 1; start++)
Packit 709fb3
    {
Packit 709fb3
      int a_seen = 0;
Packit 709fb3
      int b_seen = 0;
Packit 709fb3
      const char *p_value = NULL;
Packit 709fb3
      const char *q_value = NULL;
Packit 709fb3
      int non_options_count = 0;
Packit 709fb3
      const char *non_options[10];
Packit 709fb3
      int unrecognized = 0;
Packit 709fb3
      bool output;
Packit 709fb3
      int argc = 0;
Packit 709fb3
      const char *argv[10];
Packit 709fb3
Packit 709fb3
      argv[argc++] = "program";
Packit 709fb3
      argv[argc++] = "-ab";
Packit 709fb3
      argv[argc++] = "-q";
Packit 709fb3
      argv[argc++] = "baz";
Packit 709fb3
      argv[argc++] = "-pfoo";
Packit 709fb3
      argv[argc++] = "bar";
Packit 709fb3
      argv[argc] = NULL;
Packit 709fb3
      optind = start;
Packit 709fb3
      opterr = 1;
Packit 709fb3
      getopt_loop (argc, argv, "abp:q:",
Packit 709fb3
                   &a_seen, &b_seen, &p_value, &q_value,
Packit 709fb3
                   &non_options_count, non_options, &unrecognized, &output);
Packit 709fb3
      ASSERT (a_seen == 1);
Packit 709fb3
      ASSERT (b_seen == 1);
Packit 709fb3
      ASSERT (p_value != NULL && strcmp (p_value, "foo") == 0);
Packit 709fb3
      ASSERT (q_value != NULL && strcmp (q_value, "baz") == 0);
Packit 709fb3
      ASSERT (non_options_count == 0);
Packit 709fb3
      ASSERT (unrecognized == 0);
Packit 709fb3
      ASSERT (optind == 5);
Packit 709fb3
      ASSERT (!output);
Packit 709fb3
    }
Packit 709fb3
Packit 709fb3
#if GNULIB_TEST_GETOPT_GNU
Packit 709fb3
  /* Test processing of options with optional arguments.  */
Packit 709fb3
  for (start = OPTIND_MIN; start <= 1; start++)
Packit 709fb3
    {
Packit 709fb3
      int a_seen = 0;
Packit 709fb3
      int b_seen = 0;
Packit 709fb3
      const char *p_value = NULL;
Packit 709fb3
      const char *q_value = NULL;
Packit 709fb3
      int non_options_count = 0;
Packit 709fb3
      const char *non_options[10];
Packit 709fb3
      int unrecognized = 0;
Packit 709fb3
      bool output;
Packit 709fb3
      int argc = 0;
Packit 709fb3
      const char *argv[10];
Packit 709fb3
Packit 709fb3
      argv[argc++] = "program";
Packit 709fb3
      argv[argc++] = "-pfoo";
Packit 709fb3
      argv[argc++] = "bar";
Packit 709fb3
      argv[argc] = NULL;
Packit 709fb3
      optind = start;
Packit 709fb3
      opterr = 1;
Packit 709fb3
      getopt_loop (argc, argv, "p::q::",
Packit 709fb3
                   &a_seen, &b_seen, &p_value, &q_value,
Packit 709fb3
                   &non_options_count, non_options, &unrecognized, &output);
Packit 709fb3
      ASSERT (a_seen == 0);
Packit 709fb3
      ASSERT (b_seen == 0);
Packit 709fb3
      ASSERT (p_value != NULL && strcmp (p_value, "foo") == 0);
Packit 709fb3
      ASSERT (q_value == NULL);
Packit 709fb3
      ASSERT (non_options_count == 0);
Packit 709fb3
      ASSERT (unrecognized == 0);
Packit 709fb3
      ASSERT (optind == 2);
Packit 709fb3
      ASSERT (!output);
Packit 709fb3
    }
Packit 709fb3
  for (start = OPTIND_MIN; start <= 1; start++)
Packit 709fb3
    {
Packit 709fb3
      int a_seen = 0;
Packit 709fb3
      int b_seen = 0;
Packit 709fb3
      const char *p_value = NULL;
Packit 709fb3
      const char *q_value = NULL;
Packit 709fb3
      int non_options_count = 0;
Packit 709fb3
      const char *non_options[10];
Packit 709fb3
      int unrecognized = 0;
Packit 709fb3
      bool output;
Packit 709fb3
      int argc = 0;
Packit 709fb3
      const char *argv[10];
Packit 709fb3
Packit 709fb3
      argv[argc++] = "program";
Packit 709fb3
      argv[argc++] = "-p";
Packit 709fb3
      argv[argc++] = "foo";
Packit 709fb3
      argv[argc++] = "bar";
Packit 709fb3
      argv[argc] = NULL;
Packit 709fb3
      optind = start;
Packit 709fb3
      opterr = 1;
Packit 709fb3
      getopt_loop (argc, argv, "p::q::",
Packit 709fb3
                   &a_seen, &b_seen, &p_value, &q_value,
Packit 709fb3
                   &non_options_count, non_options, &unrecognized, &output);
Packit 709fb3
      ASSERT (a_seen == 0);
Packit 709fb3
      ASSERT (b_seen == 0);
Packit 709fb3
      ASSERT (p_value == NULL);
Packit 709fb3
      ASSERT (q_value == NULL);
Packit 709fb3
      ASSERT (non_options_count == 0);
Packit 709fb3
      ASSERT (unrecognized == 0);
Packit 709fb3
      ASSERT (optind == 2);
Packit 709fb3
      ASSERT (!output);
Packit 709fb3
    }
Packit 709fb3
  for (start = OPTIND_MIN; start <= 1; start++)
Packit 709fb3
    {
Packit 709fb3
      int a_seen = 0;
Packit 709fb3
      int b_seen = 0;
Packit 709fb3
      const char *p_value = NULL;
Packit 709fb3
      const char *q_value = NULL;
Packit 709fb3
      int non_options_count = 0;
Packit 709fb3
      const char *non_options[10];
Packit 709fb3
      int unrecognized = 0;
Packit 709fb3
      bool output;
Packit 709fb3
      int argc = 0;
Packit 709fb3
      const char *argv[10];
Packit 709fb3
Packit 709fb3
      argv[argc++] = "program";
Packit 709fb3
      argv[argc++] = "-p";
Packit 709fb3
      argv[argc++] = "-a";
Packit 709fb3
      argv[argc++] = "bar";
Packit 709fb3
      argv[argc] = NULL;
Packit 709fb3
      optind = start;
Packit 709fb3
      opterr = 1;
Packit 709fb3
      getopt_loop (argc, argv, "abp::q::",
Packit 709fb3
                   &a_seen, &b_seen, &p_value, &q_value,
Packit 709fb3
                   &non_options_count, non_options, &unrecognized, &output);
Packit 709fb3
      ASSERT (a_seen == 1);
Packit 709fb3
      ASSERT (b_seen == 0);
Packit 709fb3
      ASSERT (p_value == NULL);
Packit 709fb3
      ASSERT (q_value == NULL);
Packit 709fb3
      ASSERT (non_options_count == 0);
Packit 709fb3
      ASSERT (unrecognized == 0);
Packit 709fb3
      ASSERT (optind == 3);
Packit 709fb3
      ASSERT (!output);
Packit 709fb3
    }
Packit 709fb3
#endif /* GNULIB_TEST_GETOPT_GNU */
Packit 709fb3
Packit 709fb3
  /* Check that invalid options are recognized; and that both opterr
Packit 709fb3
     and leading ':' can silence output.  */
Packit 709fb3
  for (start = OPTIND_MIN; start <= 1; start++)
Packit 709fb3
    {
Packit 709fb3
      int a_seen = 0;
Packit 709fb3
      int b_seen = 0;
Packit 709fb3
      const char *p_value = NULL;
Packit 709fb3
      const char *q_value = NULL;
Packit 709fb3
      int non_options_count = 0;
Packit 709fb3
      const char *non_options[10];
Packit 709fb3
      int unrecognized = 0;
Packit 709fb3
      bool output;
Packit 709fb3
      int argc = 0;
Packit 709fb3
      const char *argv[10];
Packit 709fb3
Packit 709fb3
      argv[argc++] = "program";
Packit 709fb3
      argv[argc++] = "-p";
Packit 709fb3
      argv[argc++] = "foo";
Packit 709fb3
      argv[argc++] = "-x";
Packit 709fb3
      argv[argc++] = "-a";
Packit 709fb3
      argv[argc++] = "bar";
Packit 709fb3
      argv[argc] = NULL;
Packit 709fb3
      optind = start;
Packit 709fb3
      opterr = 42;
Packit 709fb3
      getopt_loop (argc, argv, "abp:q:",
Packit 709fb3
                   &a_seen, &b_seen, &p_value, &q_value,
Packit 709fb3
                   &non_options_count, non_options, &unrecognized, &output);
Packit 709fb3
      ASSERT (a_seen == 1);
Packit 709fb3
      ASSERT (b_seen == 0);
Packit 709fb3
      ASSERT (p_value != NULL && strcmp (p_value, "foo") == 0);
Packit 709fb3
      ASSERT (q_value == NULL);
Packit 709fb3
      ASSERT (non_options_count == 0);
Packit 709fb3
      ASSERT (unrecognized == 'x');
Packit 709fb3
      ASSERT (optind == 5);
Packit 709fb3
      ASSERT (output);
Packit 709fb3
    }
Packit 709fb3
  for (start = OPTIND_MIN; start <= 1; start++)
Packit 709fb3
    {
Packit 709fb3
      int a_seen = 0;
Packit 709fb3
      int b_seen = 0;
Packit 709fb3
      const char *p_value = NULL;
Packit 709fb3
      const char *q_value = NULL;
Packit 709fb3
      int non_options_count = 0;
Packit 709fb3
      const char *non_options[10];
Packit 709fb3
      int unrecognized = 0;
Packit 709fb3
      bool output;
Packit 709fb3
      int argc = 0;
Packit 709fb3
      const char *argv[10];
Packit 709fb3
Packit 709fb3
      argv[argc++] = "program";
Packit 709fb3
      argv[argc++] = "-p";
Packit 709fb3
      argv[argc++] = "foo";
Packit 709fb3
      argv[argc++] = "-x";
Packit 709fb3
      argv[argc++] = "-a";
Packit 709fb3
      argv[argc++] = "bar";
Packit 709fb3
      argv[argc] = NULL;
Packit 709fb3
      optind = start;
Packit 709fb3
      opterr = 0;
Packit 709fb3
      getopt_loop (argc, argv, "abp:q:",
Packit 709fb3
                   &a_seen, &b_seen, &p_value, &q_value,
Packit 709fb3
                   &non_options_count, non_options, &unrecognized, &output);
Packit 709fb3
      ASSERT (a_seen == 1);
Packit 709fb3
      ASSERT (b_seen == 0);
Packit 709fb3
      ASSERT (p_value != NULL && strcmp (p_value, "foo") == 0);
Packit 709fb3
      ASSERT (q_value == NULL);
Packit 709fb3
      ASSERT (non_options_count == 0);
Packit 709fb3
      ASSERT (unrecognized == 'x');
Packit 709fb3
      ASSERT (optind == 5);
Packit 709fb3
      ASSERT (!output);
Packit 709fb3
    }
Packit 709fb3
  for (start = OPTIND_MIN; start <= 1; start++)
Packit 709fb3
    {
Packit 709fb3
      int a_seen = 0;
Packit 709fb3
      int b_seen = 0;
Packit 709fb3
      const char *p_value = NULL;
Packit 709fb3
      const char *q_value = NULL;
Packit 709fb3
      int non_options_count = 0;
Packit 709fb3
      const char *non_options[10];
Packit 709fb3
      int unrecognized = 0;
Packit 709fb3
      bool output;
Packit 709fb3
      int argc = 0;
Packit 709fb3
      const char *argv[10];
Packit 709fb3
Packit 709fb3
      argv[argc++] = "program";
Packit 709fb3
      argv[argc++] = "-p";
Packit 709fb3
      argv[argc++] = "foo";
Packit 709fb3
      argv[argc++] = "-x";
Packit 709fb3
      argv[argc++] = "-a";
Packit 709fb3
      argv[argc++] = "bar";
Packit 709fb3
      argv[argc] = NULL;
Packit 709fb3
      optind = start;
Packit 709fb3
      opterr = 1;
Packit 709fb3
      getopt_loop (argc, argv, ":abp:q:",
Packit 709fb3
                   &a_seen, &b_seen, &p_value, &q_value,
Packit 709fb3
                   &non_options_count, non_options, &unrecognized, &output);
Packit 709fb3
      ASSERT (a_seen == 1);
Packit 709fb3
      ASSERT (b_seen == 0);
Packit 709fb3
      ASSERT (p_value != NULL && strcmp (p_value, "foo") == 0);
Packit 709fb3
      ASSERT (q_value == NULL);
Packit 709fb3
      ASSERT (non_options_count == 0);
Packit 709fb3
      ASSERT (unrecognized == 'x');
Packit 709fb3
      ASSERT (optind == 5);
Packit 709fb3
      ASSERT (!output);
Packit 709fb3
    }
Packit 709fb3
  for (start = OPTIND_MIN; start <= 1; start++)
Packit 709fb3
    {
Packit 709fb3
      int a_seen = 0;
Packit 709fb3
      int b_seen = 0;
Packit 709fb3
      const char *p_value = NULL;
Packit 709fb3
      const char *q_value = NULL;
Packit 709fb3
      int non_options_count = 0;
Packit 709fb3
      const char *non_options[10];
Packit 709fb3
      int unrecognized = 0;
Packit 709fb3
      bool output;
Packit 709fb3
      int argc = 0;
Packit 709fb3
      const char *argv[10];
Packit 709fb3
Packit 709fb3
      argv[argc++] = "program";
Packit 709fb3
      argv[argc++] = "-p";
Packit 709fb3
      argv[argc++] = "foo";
Packit 709fb3
      argv[argc++] = "-:";
Packit 709fb3
      argv[argc++] = "-a";
Packit 709fb3
      argv[argc++] = "bar";
Packit 709fb3
      argv[argc] = NULL;
Packit 709fb3
      optind = start;
Packit 709fb3
      opterr = 42;
Packit 709fb3
      getopt_loop (argc, argv, "abp:q:",
Packit 709fb3
                   &a_seen, &b_seen, &p_value, &q_value,
Packit 709fb3
                   &non_options_count, non_options, &unrecognized, &output);
Packit 709fb3
      ASSERT (a_seen == 1);
Packit 709fb3
      ASSERT (b_seen == 0);
Packit 709fb3
      ASSERT (p_value != NULL && strcmp (p_value, "foo") == 0);
Packit 709fb3
      ASSERT (q_value == NULL);
Packit 709fb3
      ASSERT (non_options_count == 0);
Packit 709fb3
      ASSERT (unrecognized == ':');
Packit 709fb3
      ASSERT (optind == 5);
Packit 709fb3
      ASSERT (output);
Packit 709fb3
    }
Packit 709fb3
  for (start = OPTIND_MIN; start <= 1; start++)
Packit 709fb3
    {
Packit 709fb3
      int a_seen = 0;
Packit 709fb3
      int b_seen = 0;
Packit 709fb3
      const char *p_value = NULL;
Packit 709fb3
      const char *q_value = NULL;
Packit 709fb3
      int non_options_count = 0;
Packit 709fb3
      const char *non_options[10];
Packit 709fb3
      int unrecognized = 0;
Packit 709fb3
      bool output;
Packit 709fb3
      int argc = 0;
Packit 709fb3
      const char *argv[10];
Packit 709fb3
Packit 709fb3
      argv[argc++] = "program";
Packit 709fb3
      argv[argc++] = "-p";
Packit 709fb3
      argv[argc++] = "foo";
Packit 709fb3
      argv[argc++] = "-:";
Packit 709fb3
      argv[argc++] = "-a";
Packit 709fb3
      argv[argc++] = "bar";
Packit 709fb3
      argv[argc] = NULL;
Packit 709fb3
      optind = start;
Packit 709fb3
      opterr = 0;
Packit 709fb3
      getopt_loop (argc, argv, "abp:q:",
Packit 709fb3
                   &a_seen, &b_seen, &p_value, &q_value,
Packit 709fb3
                   &non_options_count, non_options, &unrecognized, &output);
Packit 709fb3
      ASSERT (a_seen == 1);
Packit 709fb3
      ASSERT (b_seen == 0);
Packit 709fb3
      ASSERT (p_value != NULL && strcmp (p_value, "foo") == 0);
Packit 709fb3
      ASSERT (q_value == NULL);
Packit 709fb3
      ASSERT (non_options_count == 0);
Packit 709fb3
      ASSERT (unrecognized == ':');
Packit 709fb3
      ASSERT (optind == 5);
Packit 709fb3
      ASSERT (!output);
Packit 709fb3
    }
Packit 709fb3
  for (start = OPTIND_MIN; start <= 1; start++)
Packit 709fb3
    {
Packit 709fb3
      int a_seen = 0;
Packit 709fb3
      int b_seen = 0;
Packit 709fb3
      const char *p_value = NULL;
Packit 709fb3
      const char *q_value = NULL;
Packit 709fb3
      int non_options_count = 0;
Packit 709fb3
      const char *non_options[10];
Packit 709fb3
      int unrecognized = 0;
Packit 709fb3
      bool output;
Packit 709fb3
      int argc = 0;
Packit 709fb3
      const char *argv[10];
Packit 709fb3
Packit 709fb3
      argv[argc++] = "program";
Packit 709fb3
      argv[argc++] = "-p";
Packit 709fb3
      argv[argc++] = "foo";
Packit 709fb3
      argv[argc++] = "-:";
Packit 709fb3
      argv[argc++] = "-a";
Packit 709fb3
      argv[argc++] = "bar";
Packit 709fb3
      argv[argc] = NULL;
Packit 709fb3
      optind = start;
Packit 709fb3
      opterr = 1;
Packit 709fb3
      getopt_loop (argc, argv, ":abp:q:",
Packit 709fb3
                   &a_seen, &b_seen, &p_value, &q_value,
Packit 709fb3
                   &non_options_count, non_options, &unrecognized, &output);
Packit 709fb3
      ASSERT (a_seen == 1);
Packit 709fb3
      ASSERT (b_seen == 0);
Packit 709fb3
      ASSERT (p_value != NULL && strcmp (p_value, "foo") == 0);
Packit 709fb3
      ASSERT (q_value == NULL);
Packit 709fb3
      ASSERT (non_options_count == 0);
Packit 709fb3
      ASSERT (unrecognized == ':');
Packit 709fb3
      ASSERT (optind == 5);
Packit 709fb3
      ASSERT (!output);
Packit 709fb3
    }
Packit 709fb3
Packit 709fb3
  /* Check for missing argument behavior.  */
Packit 709fb3
  for (start = OPTIND_MIN; start <= 1; start++)
Packit 709fb3
    {
Packit 709fb3
      int a_seen = 0;
Packit 709fb3
      int b_seen = 0;
Packit 709fb3
      const char *p_value = NULL;
Packit 709fb3
      const char *q_value = NULL;
Packit 709fb3
      int non_options_count = 0;
Packit 709fb3
      const char *non_options[10];
Packit 709fb3
      int unrecognized = 0;
Packit 709fb3
      bool output;
Packit 709fb3
      int argc = 0;
Packit 709fb3
      const char *argv[10];
Packit 709fb3
Packit 709fb3
      argv[argc++] = "program";
Packit 709fb3
      argv[argc++] = "-ap";
Packit 709fb3
      argv[argc] = NULL;
Packit 709fb3
      optind = start;
Packit 709fb3
      opterr = 1;
Packit 709fb3
      getopt_loop (argc, argv, "abp:q:",
Packit 709fb3
                   &a_seen, &b_seen, &p_value, &q_value,
Packit 709fb3
                   &non_options_count, non_options, &unrecognized, &output);
Packit 709fb3
      ASSERT (a_seen == 1);
Packit 709fb3
      ASSERT (b_seen == 0);
Packit 709fb3
      ASSERT (p_value == NULL);
Packit 709fb3
      ASSERT (q_value == NULL);
Packit 709fb3
      ASSERT (non_options_count == 0);
Packit 709fb3
      ASSERT (unrecognized == 'p');
Packit 709fb3
      ASSERT (optind == 2);
Packit 709fb3
      ASSERT (output);
Packit 709fb3
    }
Packit 709fb3
  for (start = OPTIND_MIN; start <= 1; start++)
Packit 709fb3
    {
Packit 709fb3
      int a_seen = 0;
Packit 709fb3
      int b_seen = 0;
Packit 709fb3
      const char *p_value = NULL;
Packit 709fb3
      const char *q_value = NULL;
Packit 709fb3
      int non_options_count = 0;
Packit 709fb3
      const char *non_options[10];
Packit 709fb3
      int unrecognized = 0;
Packit 709fb3
      bool output;
Packit 709fb3
      int argc = 0;
Packit 709fb3
      const char *argv[10];
Packit 709fb3
Packit 709fb3
      argv[argc++] = "program";
Packit 709fb3
      argv[argc++] = "-ap";
Packit 709fb3
      argv[argc] = NULL;
Packit 709fb3
      optind = start;
Packit 709fb3
      opterr = 0;
Packit 709fb3
      getopt_loop (argc, argv, "abp:q:",
Packit 709fb3
                   &a_seen, &b_seen, &p_value, &q_value,
Packit 709fb3
                   &non_options_count, non_options, &unrecognized, &output);
Packit 709fb3
      ASSERT (a_seen == 1);
Packit 709fb3
      ASSERT (b_seen == 0);
Packit 709fb3
      ASSERT (p_value == NULL);
Packit 709fb3
      ASSERT (q_value == NULL);
Packit 709fb3
      ASSERT (non_options_count == 0);
Packit 709fb3
      ASSERT (unrecognized == 'p');
Packit 709fb3
      ASSERT (optind == 2);
Packit 709fb3
      ASSERT (!output);
Packit 709fb3
    }
Packit 709fb3
  for (start = OPTIND_MIN; start <= 1; start++)
Packit 709fb3
    {
Packit 709fb3
      int a_seen = 0;
Packit 709fb3
      int b_seen = 0;
Packit 709fb3
      const char *p_value = NULL;
Packit 709fb3
      const char *q_value = NULL;
Packit 709fb3
      int non_options_count = 0;
Packit 709fb3
      const char *non_options[10];
Packit 709fb3
      int unrecognized = 0;
Packit 709fb3
      bool output;
Packit 709fb3
      int argc = 0;
Packit 709fb3
      const char *argv[10];
Packit 709fb3
Packit 709fb3
      argv[argc++] = "program";
Packit 709fb3
      argv[argc++] = "-ap";
Packit 709fb3
      argv[argc] = NULL;
Packit 709fb3
      optind = start;
Packit 709fb3
      opterr = 1;
Packit 709fb3
      getopt_loop (argc, argv, ":abp:q:",
Packit 709fb3
                   &a_seen, &b_seen, &p_value, &q_value,
Packit 709fb3
                   &non_options_count, non_options, &unrecognized, &output);
Packit 709fb3
      ASSERT (a_seen == 1);
Packit 709fb3
      ASSERT (b_seen == 0);
Packit 709fb3
      ASSERT (p_value == NULL);
Packit 709fb3
      ASSERT (q_value == NULL);
Packit 709fb3
      ASSERT (non_options_count == 0);
Packit 709fb3
      ASSERT (unrecognized == 'p');
Packit 709fb3
      ASSERT (optind == 2);
Packit 709fb3
      ASSERT (!output);
Packit 709fb3
    }
Packit 709fb3
Packit 709fb3
  /* Check that by default, non-options arguments are moved to the end.  */
Packit 709fb3
  for (start = OPTIND_MIN; start <= 1; start++)
Packit 709fb3
    {
Packit 709fb3
      int a_seen = 0;
Packit 709fb3
      int b_seen = 0;
Packit 709fb3
      const char *p_value = NULL;
Packit 709fb3
      const char *q_value = NULL;
Packit 709fb3
      int non_options_count = 0;
Packit 709fb3
      const char *non_options[10];
Packit 709fb3
      int unrecognized = 0;
Packit 709fb3
      bool output;
Packit 709fb3
      int argc = 0;
Packit 709fb3
      const char *argv[10];
Packit 709fb3
Packit 709fb3
      argv[argc++] = "program";
Packit 709fb3
      argv[argc++] = "donald";
Packit 709fb3
      argv[argc++] = "-p";
Packit 709fb3
      argv[argc++] = "billy";
Packit 709fb3
      argv[argc++] = "duck";
Packit 709fb3
      argv[argc++] = "-a";
Packit 709fb3
      argv[argc++] = "bar";
Packit 709fb3
      argv[argc] = NULL;
Packit 709fb3
      optind = start;
Packit 709fb3
      opterr = 1;
Packit 709fb3
      getopt_loop (argc, argv, "abp:q:",
Packit 709fb3
                   &a_seen, &b_seen, &p_value, &q_value,
Packit 709fb3
                   &non_options_count, non_options, &unrecognized, &output);
Packit 709fb3
      if (posixly)
Packit 709fb3
        {
Packit 709fb3
          ASSERT (strcmp (argv[0], "program") == 0);
Packit 709fb3
          ASSERT (strcmp (argv[1], "donald") == 0);
Packit 709fb3
          ASSERT (strcmp (argv[2], "-p") == 0);
Packit 709fb3
          ASSERT (strcmp (argv[3], "billy") == 0);
Packit 709fb3
          ASSERT (strcmp (argv[4], "duck") == 0);
Packit 709fb3
          ASSERT (strcmp (argv[5], "-a") == 0);
Packit 709fb3
          ASSERT (strcmp (argv[6], "bar") == 0);
Packit 709fb3
          ASSERT (argv[7] == NULL);
Packit 709fb3
          ASSERT (a_seen == 0);
Packit 709fb3
          ASSERT (b_seen == 0);
Packit 709fb3
          ASSERT (p_value == NULL);
Packit 709fb3
          ASSERT (q_value == NULL);
Packit 709fb3
          ASSERT (non_options_count == 0);
Packit 709fb3
          ASSERT (unrecognized == 0);
Packit 709fb3
          ASSERT (optind == 1);
Packit 709fb3
          ASSERT (!output);
Packit 709fb3
        }
Packit 709fb3
      else
Packit 709fb3
        {
Packit 709fb3
          ASSERT (strcmp (argv[0], "program") == 0);
Packit 709fb3
          ASSERT (strcmp (argv[1], "-p") == 0);
Packit 709fb3
          ASSERT (strcmp (argv[2], "billy") == 0);
Packit 709fb3
          ASSERT (strcmp (argv[3], "-a") == 0);
Packit 709fb3
          ASSERT (strcmp (argv[4], "donald") == 0);
Packit 709fb3
          ASSERT (strcmp (argv[5], "duck") == 0);
Packit 709fb3
          ASSERT (strcmp (argv[6], "bar") == 0);
Packit 709fb3
          ASSERT (argv[7] == NULL);
Packit 709fb3
          ASSERT (a_seen == 1);
Packit 709fb3
          ASSERT (b_seen == 0);
Packit 709fb3
          ASSERT (p_value != NULL && strcmp (p_value, "billy") == 0);
Packit 709fb3
          ASSERT (q_value == NULL);
Packit 709fb3
          ASSERT (non_options_count == 0);
Packit 709fb3
          ASSERT (unrecognized == 0);
Packit 709fb3
          ASSERT (optind == 4);
Packit 709fb3
          ASSERT (!output);
Packit 709fb3
        }
Packit 709fb3
    }
Packit 709fb3
Packit 709fb3
  /* Check that '--' ends the argument processing.  */
Packit 709fb3
  for (start = OPTIND_MIN; start <= 1; start++)
Packit 709fb3
    {
Packit 709fb3
      int a_seen = 0;
Packit 709fb3
      int b_seen = 0;
Packit 709fb3
      const char *p_value = NULL;
Packit 709fb3
      const char *q_value = NULL;
Packit 709fb3
      int non_options_count = 0;
Packit 709fb3
      const char *non_options[10];
Packit 709fb3
      int unrecognized = 0;
Packit 709fb3
      bool output;
Packit 709fb3
      int argc = 0;
Packit 709fb3
      const char *argv[20];
Packit 709fb3
Packit 709fb3
      argv[argc++] = "program";
Packit 709fb3
      argv[argc++] = "donald";
Packit 709fb3
      argv[argc++] = "-p";
Packit 709fb3
      argv[argc++] = "billy";
Packit 709fb3
      argv[argc++] = "duck";
Packit 709fb3
      argv[argc++] = "-a";
Packit 709fb3
      argv[argc++] = "--";
Packit 709fb3
      argv[argc++] = "-b";
Packit 709fb3
      argv[argc++] = "foo";
Packit 709fb3
      argv[argc++] = "-q";
Packit 709fb3
      argv[argc++] = "johnny";
Packit 709fb3
      argv[argc++] = "bar";
Packit 709fb3
      argv[argc] = NULL;
Packit 709fb3
      optind = start;
Packit 709fb3
      opterr = 1;
Packit 709fb3
      getopt_loop (argc, argv, "abp:q:",
Packit 709fb3
                   &a_seen, &b_seen, &p_value, &q_value,
Packit 709fb3
                   &non_options_count, non_options, &unrecognized, &output);
Packit 709fb3
      if (posixly)
Packit 709fb3
        {
Packit 709fb3
          ASSERT (strcmp (argv[0], "program") == 0);
Packit 709fb3
          ASSERT (strcmp (argv[1], "donald") == 0);
Packit 709fb3
          ASSERT (strcmp (argv[2], "-p") == 0);
Packit 709fb3
          ASSERT (strcmp (argv[3], "billy") == 0);
Packit 709fb3
          ASSERT (strcmp (argv[4], "duck") == 0);
Packit 709fb3
          ASSERT (strcmp (argv[5], "-a") == 0);
Packit 709fb3
          ASSERT (strcmp (argv[6], "--") == 0);
Packit 709fb3
          ASSERT (strcmp (argv[7], "-b") == 0);
Packit 709fb3
          ASSERT (strcmp (argv[8], "foo") == 0);
Packit 709fb3
          ASSERT (strcmp (argv[9], "-q") == 0);
Packit 709fb3
          ASSERT (strcmp (argv[10], "johnny") == 0);
Packit 709fb3
          ASSERT (strcmp (argv[11], "bar") == 0);
Packit 709fb3
          ASSERT (argv[12] == NULL);
Packit 709fb3
          ASSERT (a_seen == 0);
Packit 709fb3
          ASSERT (b_seen == 0);
Packit 709fb3
          ASSERT (p_value == NULL);
Packit 709fb3
          ASSERT (q_value == NULL);
Packit 709fb3
          ASSERT (non_options_count == 0);
Packit 709fb3
          ASSERT (unrecognized == 0);
Packit 709fb3
          ASSERT (optind == 1);
Packit 709fb3
          ASSERT (!output);
Packit 709fb3
        }
Packit 709fb3
      else
Packit 709fb3
        {
Packit 709fb3
          ASSERT (strcmp (argv[0], "program") == 0);
Packit 709fb3
          ASSERT (strcmp (argv[1], "-p") == 0);
Packit 709fb3
          ASSERT (strcmp (argv[2], "billy") == 0);
Packit 709fb3
          ASSERT (strcmp (argv[3], "-a") == 0);
Packit 709fb3
          ASSERT (strcmp (argv[4], "--") == 0);
Packit 709fb3
          ASSERT (strcmp (argv[5], "donald") == 0);
Packit 709fb3
          ASSERT (strcmp (argv[6], "duck") == 0);
Packit 709fb3
          ASSERT (strcmp (argv[7], "-b") == 0);
Packit 709fb3
          ASSERT (strcmp (argv[8], "foo") == 0);
Packit 709fb3
          ASSERT (strcmp (argv[9], "-q") == 0);
Packit 709fb3
          ASSERT (strcmp (argv[10], "johnny") == 0);
Packit 709fb3
          ASSERT (strcmp (argv[11], "bar") == 0);
Packit 709fb3
          ASSERT (argv[12] == NULL);
Packit 709fb3
          ASSERT (a_seen == 1);
Packit 709fb3
          ASSERT (b_seen == 0);
Packit 709fb3
          ASSERT (p_value != NULL && strcmp (p_value, "billy") == 0);
Packit 709fb3
          ASSERT (q_value == NULL);
Packit 709fb3
          ASSERT (non_options_count == 0);
Packit 709fb3
          ASSERT (unrecognized == 0);
Packit 709fb3
          ASSERT (optind == 5);
Packit 709fb3
          ASSERT (!output);
Packit 709fb3
        }
Packit 709fb3
    }
Packit 709fb3
Packit 709fb3
#if GNULIB_TEST_GETOPT_GNU
Packit 709fb3
  /* Check that the '-' flag causes non-options to be returned in order.  */
Packit 709fb3
  for (start = OPTIND_MIN; start <= 1; start++)
Packit 709fb3
    {
Packit 709fb3
      int a_seen = 0;
Packit 709fb3
      int b_seen = 0;
Packit 709fb3
      const char *p_value = NULL;
Packit 709fb3
      const char *q_value = NULL;
Packit 709fb3
      int non_options_count = 0;
Packit 709fb3
      const char *non_options[10];
Packit 709fb3
      int unrecognized = 0;
Packit 709fb3
      bool output;
Packit 709fb3
      int argc = 0;
Packit 709fb3
      const char *argv[10];
Packit 709fb3
Packit 709fb3
      argv[argc++] = "program";
Packit 709fb3
      argv[argc++] = "donald";
Packit 709fb3
      argv[argc++] = "-p";
Packit 709fb3
      argv[argc++] = "billy";
Packit 709fb3
      argv[argc++] = "duck";
Packit 709fb3
      argv[argc++] = "-a";
Packit 709fb3
      argv[argc++] = "bar";
Packit 709fb3
      argv[argc] = NULL;
Packit 709fb3
      optind = start;
Packit 709fb3
      opterr = 1;
Packit 709fb3
      getopt_loop (argc, argv, "-abp:q:",
Packit 709fb3
                   &a_seen, &b_seen, &p_value, &q_value,
Packit 709fb3
                   &non_options_count, non_options, &unrecognized, &output);
Packit 709fb3
      ASSERT (strcmp (argv[0], "program") == 0);
Packit 709fb3
      ASSERT (strcmp (argv[1], "donald") == 0);
Packit 709fb3
      ASSERT (strcmp (argv[2], "-p") == 0);
Packit 709fb3
      ASSERT (strcmp (argv[3], "billy") == 0);
Packit 709fb3
      ASSERT (strcmp (argv[4], "duck") == 0);
Packit 709fb3
      ASSERT (strcmp (argv[5], "-a") == 0);
Packit 709fb3
      ASSERT (strcmp (argv[6], "bar") == 0);
Packit 709fb3
      ASSERT (argv[7] == NULL);
Packit 709fb3
      ASSERT (a_seen == 1);
Packit 709fb3
      ASSERT (b_seen == 0);
Packit 709fb3
      ASSERT (p_value != NULL && strcmp (p_value, "billy") == 0);
Packit 709fb3
      ASSERT (q_value == NULL);
Packit 709fb3
      ASSERT (non_options_count == 3);
Packit 709fb3
      ASSERT (strcmp (non_options[0], "donald") == 0);
Packit 709fb3
      ASSERT (strcmp (non_options[1], "duck") == 0);
Packit 709fb3
      ASSERT (strcmp (non_options[2], "bar") == 0);
Packit 709fb3
      ASSERT (unrecognized == 0);
Packit 709fb3
      ASSERT (optind == 7);
Packit 709fb3
      ASSERT (!output);
Packit 709fb3
    }
Packit 709fb3
Packit 709fb3
  /* Check that '--' ends the argument processing.  */
Packit 709fb3
  for (start = OPTIND_MIN; start <= 1; start++)
Packit 709fb3
    {
Packit 709fb3
      int a_seen = 0;
Packit 709fb3
      int b_seen = 0;
Packit 709fb3
      const char *p_value = NULL;
Packit 709fb3
      const char *q_value = NULL;
Packit 709fb3
      int non_options_count = 0;
Packit 709fb3
      const char *non_options[10];
Packit 709fb3
      int unrecognized = 0;
Packit 709fb3
      bool output;
Packit 709fb3
      int argc = 0;
Packit 709fb3
      const char *argv[20];
Packit 709fb3
Packit 709fb3
      argv[argc++] = "program";
Packit 709fb3
      argv[argc++] = "donald";
Packit 709fb3
      argv[argc++] = "-p";
Packit 709fb3
      argv[argc++] = "billy";
Packit 709fb3
      argv[argc++] = "duck";
Packit 709fb3
      argv[argc++] = "-a";
Packit 709fb3
      argv[argc++] = "--";
Packit 709fb3
      argv[argc++] = "-b";
Packit 709fb3
      argv[argc++] = "foo";
Packit 709fb3
      argv[argc++] = "-q";
Packit 709fb3
      argv[argc++] = "johnny";
Packit 709fb3
      argv[argc++] = "bar";
Packit 709fb3
      argv[argc] = NULL;
Packit 709fb3
      optind = start;
Packit 709fb3
      opterr = 1;
Packit 709fb3
      getopt_loop (argc, argv, "-abp:q:",
Packit 709fb3
                   &a_seen, &b_seen, &p_value, &q_value,
Packit 709fb3
                   &non_options_count, non_options, &unrecognized, &output);
Packit 709fb3
      ASSERT (strcmp (argv[0], "program") == 0);
Packit 709fb3
      ASSERT (strcmp (argv[1], "donald") == 0);
Packit 709fb3
      ASSERT (strcmp (argv[2], "-p") == 0);
Packit 709fb3
      ASSERT (strcmp (argv[3], "billy") == 0);
Packit 709fb3
      ASSERT (strcmp (argv[4], "duck") == 0);
Packit 709fb3
      ASSERT (strcmp (argv[5], "-a") == 0);
Packit 709fb3
      ASSERT (strcmp (argv[6], "--") == 0);
Packit 709fb3
      ASSERT (strcmp (argv[7], "-b") == 0);
Packit 709fb3
      ASSERT (strcmp (argv[8], "foo") == 0);
Packit 709fb3
      ASSERT (strcmp (argv[9], "-q") == 0);
Packit 709fb3
      ASSERT (strcmp (argv[10], "johnny") == 0);
Packit 709fb3
      ASSERT (strcmp (argv[11], "bar") == 0);
Packit 709fb3
      ASSERT (argv[12] == NULL);
Packit 709fb3
      ASSERT (a_seen == 1);
Packit 709fb3
      ASSERT (b_seen == 0);
Packit 709fb3
      ASSERT (p_value != NULL && strcmp (p_value, "billy") == 0);
Packit 709fb3
      ASSERT (q_value == NULL);
Packit 709fb3
      ASSERT (!output);
Packit 709fb3
      if (non_options_count == 2)
Packit 709fb3
        {
Packit 709fb3
          /* glibc behaviour.  */
Packit 709fb3
          ASSERT (non_options_count == 2);
Packit 709fb3
          ASSERT (strcmp (non_options[0], "donald") == 0);
Packit 709fb3
          ASSERT (strcmp (non_options[1], "duck") == 0);
Packit 709fb3
          ASSERT (unrecognized == 0);
Packit 709fb3
          ASSERT (optind == 7);
Packit 709fb3
        }
Packit 709fb3
      else
Packit 709fb3
        {
Packit 709fb3
          /* Another valid behaviour.  */
Packit 709fb3
          ASSERT (non_options_count == 7);
Packit 709fb3
          ASSERT (strcmp (non_options[0], "donald") == 0);
Packit 709fb3
          ASSERT (strcmp (non_options[1], "duck") == 0);
Packit 709fb3
          ASSERT (strcmp (non_options[2], "-b") == 0);
Packit 709fb3
          ASSERT (strcmp (non_options[3], "foo") == 0);
Packit 709fb3
          ASSERT (strcmp (non_options[4], "-q") == 0);
Packit 709fb3
          ASSERT (strcmp (non_options[5], "johnny") == 0);
Packit 709fb3
          ASSERT (strcmp (non_options[6], "bar") == 0);
Packit 709fb3
          ASSERT (unrecognized == 0);
Packit 709fb3
          ASSERT (optind == 12);
Packit 709fb3
        }
Packit 709fb3
    }
Packit 709fb3
Packit 709fb3
  /* Check that the '-' flag has to come first.  */
Packit 709fb3
  for (start = OPTIND_MIN; start <= 1; start++)
Packit 709fb3
    {
Packit 709fb3
      int a_seen = 0;
Packit 709fb3
      int b_seen = 0;
Packit 709fb3
      const char *p_value = NULL;
Packit 709fb3
      const char *q_value = NULL;
Packit 709fb3
      int non_options_count = 0;
Packit 709fb3
      const char *non_options[10];
Packit 709fb3
      int unrecognized = 0;
Packit 709fb3
      bool output;
Packit 709fb3
      int argc = 0;
Packit 709fb3
      const char *argv[10];
Packit 709fb3
Packit 709fb3
      argv[argc++] = "program";
Packit 709fb3
      argv[argc++] = "donald";
Packit 709fb3
      argv[argc++] = "-p";
Packit 709fb3
      argv[argc++] = "billy";
Packit 709fb3
      argv[argc++] = "duck";
Packit 709fb3
      argv[argc++] = "-a";
Packit 709fb3
      argv[argc++] = "bar";
Packit 709fb3
      argv[argc] = NULL;
Packit 709fb3
      optind = start;
Packit 709fb3
      opterr = 1;
Packit 709fb3
      getopt_loop (argc, argv, "abp:q:-",
Packit 709fb3
                   &a_seen, &b_seen, &p_value, &q_value,
Packit 709fb3
                   &non_options_count, non_options, &unrecognized, &output);
Packit 709fb3
      if (posixly)
Packit 709fb3
        {
Packit 709fb3
          ASSERT (strcmp (argv[0], "program") == 0);
Packit 709fb3
          ASSERT (strcmp (argv[1], "donald") == 0);
Packit 709fb3
          ASSERT (strcmp (argv[2], "-p") == 0);
Packit 709fb3
          ASSERT (strcmp (argv[3], "billy") == 0);
Packit 709fb3
          ASSERT (strcmp (argv[4], "duck") == 0);
Packit 709fb3
          ASSERT (strcmp (argv[5], "-a") == 0);
Packit 709fb3
          ASSERT (strcmp (argv[6], "bar") == 0);
Packit 709fb3
          ASSERT (argv[7] == NULL);
Packit 709fb3
          ASSERT (a_seen == 0);
Packit 709fb3
          ASSERT (b_seen == 0);
Packit 709fb3
          ASSERT (p_value == NULL);
Packit 709fb3
          ASSERT (q_value == NULL);
Packit 709fb3
          ASSERT (non_options_count == 0);
Packit 709fb3
          ASSERT (unrecognized == 0);
Packit 709fb3
          ASSERT (optind == 1);
Packit 709fb3
          ASSERT (!output);
Packit 709fb3
        }
Packit 709fb3
      else
Packit 709fb3
        {
Packit 709fb3
          ASSERT (strcmp (argv[0], "program") == 0);
Packit 709fb3
          ASSERT (strcmp (argv[1], "-p") == 0);
Packit 709fb3
          ASSERT (strcmp (argv[2], "billy") == 0);
Packit 709fb3
          ASSERT (strcmp (argv[3], "-a") == 0);
Packit 709fb3
          ASSERT (strcmp (argv[4], "donald") == 0);
Packit 709fb3
          ASSERT (strcmp (argv[5], "duck") == 0);
Packit 709fb3
          ASSERT (strcmp (argv[6], "bar") == 0);
Packit 709fb3
          ASSERT (argv[7] == NULL);
Packit 709fb3
          ASSERT (a_seen == 1);
Packit 709fb3
          ASSERT (b_seen == 0);
Packit 709fb3
          ASSERT (p_value != NULL && strcmp (p_value, "billy") == 0);
Packit 709fb3
          ASSERT (q_value == NULL);
Packit 709fb3
          ASSERT (non_options_count == 0);
Packit 709fb3
          ASSERT (unrecognized == 0);
Packit 709fb3
          ASSERT (optind == 4);
Packit 709fb3
          ASSERT (!output);
Packit 709fb3
        }
Packit 709fb3
    }
Packit 709fb3
Packit 709fb3
  /* Check that the '+' flag causes the first non-option to terminate the
Packit 709fb3
     loop.  */
Packit 709fb3
  for (start = OPTIND_MIN; start <= 1; start++)
Packit 709fb3
    {
Packit 709fb3
      int a_seen = 0;
Packit 709fb3
      int b_seen = 0;
Packit 709fb3
      const char *p_value = NULL;
Packit 709fb3
      const char *q_value = NULL;
Packit 709fb3
      int non_options_count = 0;
Packit 709fb3
      const char *non_options[10];
Packit 709fb3
      int unrecognized = 0;
Packit 709fb3
      bool output;
Packit 709fb3
      int argc = 0;
Packit 709fb3
      const char *argv[10];
Packit 709fb3
Packit 709fb3
      argv[argc++] = "program";
Packit 709fb3
      argv[argc++] = "donald";
Packit 709fb3
      argv[argc++] = "-p";
Packit 709fb3
      argv[argc++] = "billy";
Packit 709fb3
      argv[argc++] = "duck";
Packit 709fb3
      argv[argc++] = "-a";
Packit 709fb3
      argv[argc++] = "bar";
Packit 709fb3
      argv[argc] = NULL;
Packit 709fb3
      optind = start;
Packit 709fb3
      opterr = 1;
Packit 709fb3
      getopt_loop (argc, argv, "+abp:q:",
Packit 709fb3
                   &a_seen, &b_seen, &p_value, &q_value,
Packit 709fb3
                   &non_options_count, non_options, &unrecognized, &output);
Packit 709fb3
      ASSERT (strcmp (argv[0], "program") == 0);
Packit 709fb3
      ASSERT (strcmp (argv[1], "donald") == 0);
Packit 709fb3
      ASSERT (strcmp (argv[2], "-p") == 0);
Packit 709fb3
      ASSERT (strcmp (argv[3], "billy") == 0);
Packit 709fb3
      ASSERT (strcmp (argv[4], "duck") == 0);
Packit 709fb3
      ASSERT (strcmp (argv[5], "-a") == 0);
Packit 709fb3
      ASSERT (strcmp (argv[6], "bar") == 0);
Packit 709fb3
      ASSERT (argv[7] == NULL);
Packit 709fb3
      ASSERT (a_seen == 0);
Packit 709fb3
      ASSERT (b_seen == 0);
Packit 709fb3
      ASSERT (p_value == NULL);
Packit 709fb3
      ASSERT (q_value == NULL);
Packit 709fb3
      ASSERT (non_options_count == 0);
Packit 709fb3
      ASSERT (unrecognized == 0);
Packit 709fb3
      ASSERT (optind == 1);
Packit 709fb3
      ASSERT (!output);
Packit 709fb3
    }
Packit 709fb3
  for (start = OPTIND_MIN; start <= 1; start++)
Packit 709fb3
    {
Packit 709fb3
      int a_seen = 0;
Packit 709fb3
      int b_seen = 0;
Packit 709fb3
      const char *p_value = NULL;
Packit 709fb3
      const char *q_value = NULL;
Packit 709fb3
      int non_options_count = 0;
Packit 709fb3
      const char *non_options[10];
Packit 709fb3
      int unrecognized = 0;
Packit 709fb3
      bool output;
Packit 709fb3
      int argc = 0;
Packit 709fb3
      const char *argv[10];
Packit 709fb3
Packit 709fb3
      argv[argc++] = "program";
Packit 709fb3
      argv[argc++] = "-+";
Packit 709fb3
      argv[argc] = NULL;
Packit 709fb3
      optind = start;
Packit 709fb3
      getopt_loop (argc, argv, "+abp:q:",
Packit 709fb3
                   &a_seen, &b_seen, &p_value, &q_value,
Packit 709fb3
                   &non_options_count, non_options, &unrecognized, &output);
Packit 709fb3
      ASSERT (a_seen == 0);
Packit 709fb3
      ASSERT (b_seen == 0);
Packit 709fb3
      ASSERT (p_value == NULL);
Packit 709fb3
      ASSERT (q_value == NULL);
Packit 709fb3
      ASSERT (non_options_count == 0);
Packit 709fb3
      ASSERT (unrecognized == '+');
Packit 709fb3
      ASSERT (optind == 2);
Packit 709fb3
      ASSERT (output);
Packit 709fb3
    }
Packit 709fb3
Packit 709fb3
  /* Check that '--' ends the argument processing.  */
Packit 709fb3
  for (start = OPTIND_MIN; start <= 1; start++)
Packit 709fb3
    {
Packit 709fb3
      int a_seen = 0;
Packit 709fb3
      int b_seen = 0;
Packit 709fb3
      const char *p_value = NULL;
Packit 709fb3
      const char *q_value = NULL;
Packit 709fb3
      int non_options_count = 0;
Packit 709fb3
      const char *non_options[10];
Packit 709fb3
      int unrecognized = 0;
Packit 709fb3
      bool output;
Packit 709fb3
      int argc = 0;
Packit 709fb3
      const char *argv[20];
Packit 709fb3
Packit 709fb3
      argv[argc++] = "program";
Packit 709fb3
      argv[argc++] = "donald";
Packit 709fb3
      argv[argc++] = "-p";
Packit 709fb3
      argv[argc++] = "billy";
Packit 709fb3
      argv[argc++] = "duck";
Packit 709fb3
      argv[argc++] = "-a";
Packit 709fb3
      argv[argc++] = "--";
Packit 709fb3
      argv[argc++] = "-b";
Packit 709fb3
      argv[argc++] = "foo";
Packit 709fb3
      argv[argc++] = "-q";
Packit 709fb3
      argv[argc++] = "johnny";
Packit 709fb3
      argv[argc++] = "bar";
Packit 709fb3
      argv[argc] = NULL;
Packit 709fb3
      optind = start;
Packit 709fb3
      opterr = 1;
Packit 709fb3
      getopt_loop (argc, argv, "+abp:q:",
Packit 709fb3
                   &a_seen, &b_seen, &p_value, &q_value,
Packit 709fb3
                   &non_options_count, non_options, &unrecognized, &output);
Packit 709fb3
      ASSERT (strcmp (argv[0], "program") == 0);
Packit 709fb3
      ASSERT (strcmp (argv[1], "donald") == 0);
Packit 709fb3
      ASSERT (strcmp (argv[2], "-p") == 0);
Packit 709fb3
      ASSERT (strcmp (argv[3], "billy") == 0);
Packit 709fb3
      ASSERT (strcmp (argv[4], "duck") == 0);
Packit 709fb3
      ASSERT (strcmp (argv[5], "-a") == 0);
Packit 709fb3
      ASSERT (strcmp (argv[6], "--") == 0);
Packit 709fb3
      ASSERT (strcmp (argv[7], "-b") == 0);
Packit 709fb3
      ASSERT (strcmp (argv[8], "foo") == 0);
Packit 709fb3
      ASSERT (strcmp (argv[9], "-q") == 0);
Packit 709fb3
      ASSERT (strcmp (argv[10], "johnny") == 0);
Packit 709fb3
      ASSERT (strcmp (argv[11], "bar") == 0);
Packit 709fb3
      ASSERT (argv[12] == NULL);
Packit 709fb3
      ASSERT (a_seen == 0);
Packit 709fb3
      ASSERT (b_seen == 0);
Packit 709fb3
      ASSERT (p_value == NULL);
Packit 709fb3
      ASSERT (q_value == NULL);
Packit 709fb3
      ASSERT (non_options_count == 0);
Packit 709fb3
      ASSERT (unrecognized == 0);
Packit 709fb3
      ASSERT (optind == 1);
Packit 709fb3
      ASSERT (!output);
Packit 709fb3
    }
Packit 709fb3
#endif /* GNULIB_TEST_GETOPT_GNU */
Packit 709fb3
Packit 709fb3
  /* Check that the '+' flag has to come first.  */
Packit 709fb3
  for (start = OPTIND_MIN; start <= 1; start++)
Packit 709fb3
    {
Packit 709fb3
      int a_seen = 0;
Packit 709fb3
      int b_seen = 0;
Packit 709fb3
      const char *p_value = NULL;
Packit 709fb3
      const char *q_value = NULL;
Packit 709fb3
      int non_options_count = 0;
Packit 709fb3
      const char *non_options[10];
Packit 709fb3
      int unrecognized = 0;
Packit 709fb3
      bool output;
Packit 709fb3
      int argc = 0;
Packit 709fb3
      const char *argv[10];
Packit 709fb3
Packit 709fb3
      argv[argc++] = "program";
Packit 709fb3
      argv[argc++] = "donald";
Packit 709fb3
      argv[argc++] = "-p";
Packit 709fb3
      argv[argc++] = "billy";
Packit 709fb3
      argv[argc++] = "duck";
Packit 709fb3
      argv[argc++] = "-a";
Packit 709fb3
      argv[argc++] = "bar";
Packit 709fb3
      argv[argc] = NULL;
Packit 709fb3
      optind = start;
Packit 709fb3
      opterr = 1;
Packit 709fb3
      getopt_loop (argc, argv, "abp:q:+",
Packit 709fb3
                   &a_seen, &b_seen, &p_value, &q_value,
Packit 709fb3
                   &non_options_count, non_options, &unrecognized, &output);
Packit 709fb3
      if (posixly)
Packit 709fb3
        {
Packit 709fb3
          ASSERT (strcmp (argv[0], "program") == 0);
Packit 709fb3
          ASSERT (strcmp (argv[1], "donald") == 0);
Packit 709fb3
          ASSERT (strcmp (argv[2], "-p") == 0);
Packit 709fb3
          ASSERT (strcmp (argv[3], "billy") == 0);
Packit 709fb3
          ASSERT (strcmp (argv[4], "duck") == 0);
Packit 709fb3
          ASSERT (strcmp (argv[5], "-a") == 0);
Packit 709fb3
          ASSERT (strcmp (argv[6], "bar") == 0);
Packit 709fb3
          ASSERT (argv[7] == NULL);
Packit 709fb3
          ASSERT (a_seen == 0);
Packit 709fb3
          ASSERT (b_seen == 0);
Packit 709fb3
          ASSERT (p_value == NULL);
Packit 709fb3
          ASSERT (q_value == NULL);
Packit 709fb3
          ASSERT (non_options_count == 0);
Packit 709fb3
          ASSERT (unrecognized == 0);
Packit 709fb3
          ASSERT (optind == 1);
Packit 709fb3
          ASSERT (!output);
Packit 709fb3
        }
Packit 709fb3
      else
Packit 709fb3
        {
Packit 709fb3
          ASSERT (strcmp (argv[0], "program") == 0);
Packit 709fb3
          ASSERT (strcmp (argv[1], "-p") == 0);
Packit 709fb3
          ASSERT (strcmp (argv[2], "billy") == 0);
Packit 709fb3
          ASSERT (strcmp (argv[3], "-a") == 0);
Packit 709fb3
          ASSERT (strcmp (argv[4], "donald") == 0);
Packit 709fb3
          ASSERT (strcmp (argv[5], "duck") == 0);
Packit 709fb3
          ASSERT (strcmp (argv[6], "bar") == 0);
Packit 709fb3
          ASSERT (argv[7] == NULL);
Packit 709fb3
          ASSERT (a_seen == 1);
Packit 709fb3
          ASSERT (b_seen == 0);
Packit 709fb3
          ASSERT (p_value != NULL && strcmp (p_value, "billy") == 0);
Packit 709fb3
          ASSERT (q_value == NULL);
Packit 709fb3
          ASSERT (non_options_count == 0);
Packit 709fb3
          ASSERT (unrecognized == 0);
Packit 709fb3
          ASSERT (optind == 4);
Packit 709fb3
          ASSERT (!output);
Packit 709fb3
        }
Packit 709fb3
    }
Packit 709fb3
Packit 709fb3
#if GNULIB_TEST_GETOPT_GNU
Packit 709fb3
  /* If GNU extensions are supported, require compliance with POSIX
Packit 709fb3
     interpretation on leading '+' behavior.
Packit 709fb3
     http://austingroupbugs.net/view.php?id=191  */
Packit 709fb3
  for (start = OPTIND_MIN; start <= 1; start++)
Packit 709fb3
    {
Packit 709fb3
      int a_seen = 0;
Packit 709fb3
      int b_seen = 0;
Packit 709fb3
      const char *p_value = NULL;
Packit 709fb3
      const char *q_value = NULL;
Packit 709fb3
      int non_options_count = 0;
Packit 709fb3
      const char *non_options[10];
Packit 709fb3
      int unrecognized = 0;
Packit 709fb3
      bool output;
Packit 709fb3
      int argc = 0;
Packit 709fb3
      const char *argv[10];
Packit 709fb3
Packit 709fb3
      argv[argc++] = "program";
Packit 709fb3
      argv[argc++] = "donald";
Packit 709fb3
      argv[argc++] = "-p";
Packit 709fb3
      argv[argc++] = "billy";
Packit 709fb3
      argv[argc++] = "duck";
Packit 709fb3
      argv[argc++] = "-a";
Packit 709fb3
      argv[argc++] = "bar";
Packit 709fb3
      argv[argc] = NULL;
Packit 709fb3
      optind = start;
Packit 709fb3
      opterr = 1;
Packit 709fb3
      getopt_loop (argc, argv, "+:abp:q:",
Packit 709fb3
                   &a_seen, &b_seen, &p_value, &q_value,
Packit 709fb3
                   &non_options_count, non_options, &unrecognized, &output);
Packit 709fb3
      ASSERT (strcmp (argv[0], "program") == 0);
Packit 709fb3
      ASSERT (strcmp (argv[1], "donald") == 0);
Packit 709fb3
      ASSERT (strcmp (argv[2], "-p") == 0);
Packit 709fb3
      ASSERT (strcmp (argv[3], "billy") == 0);
Packit 709fb3
      ASSERT (strcmp (argv[4], "duck") == 0);
Packit 709fb3
      ASSERT (strcmp (argv[5], "-a") == 0);
Packit 709fb3
      ASSERT (strcmp (argv[6], "bar") == 0);
Packit 709fb3
      ASSERT (argv[7] == NULL);
Packit 709fb3
      ASSERT (a_seen == 0);
Packit 709fb3
      ASSERT (b_seen == 0);
Packit 709fb3
      ASSERT (p_value == NULL);
Packit 709fb3
      ASSERT (q_value == NULL);
Packit 709fb3
      ASSERT (non_options_count == 0);
Packit 709fb3
      ASSERT (unrecognized == 0);
Packit 709fb3
      ASSERT (optind == 1);
Packit 709fb3
      ASSERT (!output);
Packit 709fb3
    }
Packit 709fb3
  for (start = OPTIND_MIN; start <= 1; start++)
Packit 709fb3
    {
Packit 709fb3
      int a_seen = 0;
Packit 709fb3
      int b_seen = 0;
Packit 709fb3
      const char *p_value = NULL;
Packit 709fb3
      const char *q_value = NULL;
Packit 709fb3
      int non_options_count = 0;
Packit 709fb3
      const char *non_options[10];
Packit 709fb3
      int unrecognized = 0;
Packit 709fb3
      bool output;
Packit 709fb3
      int argc = 0;
Packit 709fb3
      const char *argv[10];
Packit 709fb3
Packit 709fb3
      argv[argc++] = "program";
Packit 709fb3
      argv[argc++] = "-p";
Packit 709fb3
      argv[argc] = NULL;
Packit 709fb3
      optind = start;
Packit 709fb3
      getopt_loop (argc, argv, "+:abp:q:",
Packit 709fb3
                   &a_seen, &b_seen, &p_value, &q_value,
Packit 709fb3
                   &non_options_count, non_options, &unrecognized, &output);
Packit 709fb3
      ASSERT (a_seen == 0);
Packit 709fb3
      ASSERT (b_seen == 0);
Packit 709fb3
      ASSERT (p_value == NULL);
Packit 709fb3
      ASSERT (q_value == NULL);
Packit 709fb3
      ASSERT (non_options_count == 0);
Packit 709fb3
      ASSERT (unrecognized == 'p');
Packit 709fb3
      ASSERT (optind == 2);
Packit 709fb3
      ASSERT (!output);
Packit 709fb3
    }
Packit 709fb3
  for (start = OPTIND_MIN; start <= 1; start++)
Packit 709fb3
    {
Packit 709fb3
      int a_seen = 0;
Packit 709fb3
      int b_seen = 0;
Packit 709fb3
      const char *p_value = NULL;
Packit 709fb3
      const char *q_value = NULL;
Packit 709fb3
      int non_options_count = 0;
Packit 709fb3
      const char *non_options[10];
Packit 709fb3
      int unrecognized = 0;
Packit 709fb3
      bool output;
Packit 709fb3
      int argc = 0;
Packit 709fb3
      const char *argv[10];
Packit 709fb3
Packit 709fb3
      argv[argc++] = "program";
Packit 709fb3
      argv[argc++] = "-b";
Packit 709fb3
      argv[argc++] = "-p";
Packit 709fb3
      argv[argc] = NULL;
Packit 709fb3
      optind = start;
Packit 709fb3
      getopt_loop (argc, argv, "+:abp:q:",
Packit 709fb3
                   &a_seen, &b_seen, &p_value, &q_value,
Packit 709fb3
                   &non_options_count, non_options, &unrecognized, &output);
Packit 709fb3
      ASSERT (a_seen == 0);
Packit 709fb3
      ASSERT (b_seen == 1);
Packit 709fb3
      ASSERT (p_value == NULL);
Packit 709fb3
      ASSERT (q_value == NULL);
Packit 709fb3
      ASSERT (non_options_count == 0);
Packit 709fb3
      ASSERT (unrecognized == 'p');
Packit 709fb3
      ASSERT (optind == 3);
Packit 709fb3
      ASSERT (!output);
Packit 709fb3
    }
Packit 709fb3
Packit 709fb3
  /* Check that 'W' does not dump core:
Packit 709fb3
     http://sourceware.org/bugzilla/show_bug.cgi?id=12922
Packit 709fb3
     Technically, POSIX says the presence of ';' in the opt-string
Packit 709fb3
     gives unspecified behavior, so we only test this when GNU compliance
Packit 709fb3
     is desired.  */
Packit 709fb3
  for (start = OPTIND_MIN; start <= 1; start++)
Packit 709fb3
    {
Packit 709fb3
      int argc = 0;
Packit 709fb3
      const char *argv[10];
Packit 709fb3
      int pos = ftell (stderr);
Packit 709fb3
Packit 709fb3
      argv[argc++] = "program";
Packit 709fb3
      argv[argc++] = "-W";
Packit 709fb3
      argv[argc++] = "dummy";
Packit 709fb3
      argv[argc] = NULL;
Packit 709fb3
      optind = start;
Packit 709fb3
      opterr = 1;
Packit 709fb3
      ASSERT (getopt (argc, (char **) argv, "W;") == 'W');
Packit 709fb3
      ASSERT (ftell (stderr) == pos);
Packit 709fb3
      ASSERT (optind == 2);
Packit 709fb3
    }
Packit 709fb3
#endif /* GNULIB_TEST_GETOPT_GNU */
Packit 709fb3
}