Blame gnulib-tests/test-getopt_long.h

Packit 33f14e
/* Test of command line argument processing.
Packit 33f14e
   Copyright (C) 2009-2017 Free Software Foundation, Inc.
Packit 33f14e
Packit 33f14e
   This program is free software: you can redistribute it and/or modify
Packit 33f14e
   it under the terms of the GNU General Public License as published by
Packit 33f14e
   the Free Software Foundation; either version 3 of the License, or
Packit 33f14e
   (at your option) any later version.
Packit 33f14e
Packit 33f14e
   This program is distributed in the hope that it will be useful,
Packit 33f14e
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 33f14e
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit 33f14e
   GNU General Public License for more details.
Packit 33f14e
Packit 33f14e
   You should have received a copy of the GNU General Public License
Packit 33f14e
   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
Packit 33f14e
Packit 33f14e
/* Written by Bruno Haible <bruno@clisp.org>, 2009.  */
Packit 33f14e
Packit 33f14e
static int a_seen;
Packit 33f14e
static int b_seen;
Packit 33f14e
static int q_seen;
Packit 33f14e
Packit 33f14e
static const struct option long_options_required[] =
Packit 33f14e
  {
Packit 33f14e
    { "alpha",    no_argument,       NULL, 'a' },
Packit 33f14e
    { "beta",     no_argument,       &b_seen, 1 },
Packit 33f14e
    { "prune",    required_argument, NULL, 'p' },
Packit 33f14e
    { "quetsche", required_argument, &q_seen, 1 },
Packit 33f14e
    { "xtremely-",no_argument,       NULL, 1003 },
Packit 33f14e
    { "xtra",     no_argument,       NULL, 1001 },
Packit 33f14e
    { "xtreme",   no_argument,       NULL, 1002 },
Packit 33f14e
    { "xtremely", no_argument,       NULL, 1003 },
Packit 33f14e
    { NULL,       0,                 NULL, 0 }
Packit 33f14e
  };
Packit 33f14e
Packit 33f14e
static const struct option long_options_optional[] =
Packit 33f14e
  {
Packit 33f14e
    { "alpha",    no_argument,       NULL, 'a' },
Packit 33f14e
    { "beta",     no_argument,       &b_seen, 1 },
Packit 33f14e
    { "prune",    optional_argument, NULL, 'p' },
Packit 33f14e
    { "quetsche", optional_argument, &q_seen, 1 },
Packit 33f14e
    { NULL,       0,                 NULL, 0 }
Packit 33f14e
  };
Packit 33f14e
Packit 33f14e
static void
Packit 33f14e
getopt_long_loop (int argc, const char **argv,
Packit 33f14e
                  const char *options, const struct option *long_options,
Packit 33f14e
                  const char **p_value, const char **q_value,
Packit 33f14e
                  int *non_options_count, const char **non_options,
Packit 33f14e
                  int *unrecognized)
Packit 33f14e
{
Packit 33f14e
  int option_index = -1;
Packit 33f14e
  int c;
Packit 33f14e
Packit 33f14e
  opterr = 0;
Packit 33f14e
  q_seen = 0;
Packit 33f14e
  while ((c = getopt_long (argc, (char **) argv, options, long_options,
Packit 33f14e
                           &option_index))
Packit 33f14e
         != -1)
Packit 33f14e
    {
Packit 33f14e
      switch (c)
Packit 33f14e
        {
Packit 33f14e
        case 0:
Packit 33f14e
          /* An option with a non-NULL flag pointer was processed.  */
Packit 33f14e
          if (q_seen)
Packit 33f14e
            *q_value = optarg;
Packit 33f14e
          break;
Packit 33f14e
        case 'a':
Packit 33f14e
          a_seen++;
Packit 33f14e
          break;
Packit 33f14e
        case 'b':
Packit 33f14e
          b_seen = 1;
Packit 33f14e
          break;
Packit 33f14e
        case 'p':
Packit 33f14e
          *p_value = optarg;
Packit 33f14e
          break;
Packit 33f14e
        case 'q':
Packit 33f14e
          *q_value = optarg;
Packit 33f14e
          break;
Packit 33f14e
        case '\1':
Packit 33f14e
          /* Must only happen with option '-' at the beginning.  */
Packit 33f14e
          ASSERT (options[0] == '-');
Packit 33f14e
          non_options[(*non_options_count)++] = optarg;
Packit 33f14e
          break;
Packit 33f14e
        case ':':
Packit 33f14e
          /* Must only happen with option ':' at the beginning.  */
Packit 33f14e
          ASSERT (options[0] == ':'
Packit 33f14e
                  || ((options[0] == '-' || options[0] == '+')
Packit 33f14e
                      && options[1] == ':'));
Packit 33f14e
          FALLTHROUGH;
Packit 33f14e
        case '?':
Packit 33f14e
          *unrecognized = optopt;
Packit 33f14e
          break;
Packit 33f14e
        default:
Packit 33f14e
          *unrecognized = c;
Packit 33f14e
          break;
Packit 33f14e
        }
Packit 33f14e
    }
Packit 33f14e
}
Packit 33f14e
Packit 33f14e
/* Reduce casting, so we can use string literals elsewhere.
Packit 33f14e
   getopt_long takes an array of char*, but luckily does not modify
Packit 33f14e
   those elements, so we can pass const char*.  */
Packit 33f14e
static int
Packit 33f14e
do_getopt_long (int argc, const char **argv, const char *shortopts,
Packit 33f14e
                const struct option *longopts, int *longind)
Packit 33f14e
{
Packit 33f14e
  return getopt_long (argc, (char **) argv, shortopts, longopts, longind);
Packit 33f14e
}
Packit 33f14e
Packit 33f14e
static void
Packit 33f14e
test_getopt_long (void)
Packit 33f14e
{
Packit 33f14e
  int start;
Packit 33f14e
Packit 33f14e
  /* Test disambiguation of options.  */
Packit 33f14e
  {
Packit 33f14e
    int argc = 0;
Packit 33f14e
    const char *argv[10];
Packit 33f14e
    int option_index;
Packit 33f14e
    int c;
Packit 33f14e
Packit 33f14e
    argv[argc++] = "program";
Packit 33f14e
    argv[argc++] = "--x";
Packit 33f14e
    argv[argc] = NULL;
Packit 33f14e
    optind = 1;
Packit 33f14e
    opterr = 0;
Packit 33f14e
    c = do_getopt_long (argc, argv, "ab", long_options_required, &option_index);
Packit 33f14e
    ASSERT (c == '?');
Packit 33f14e
    ASSERT (optopt == 0);
Packit 33f14e
  }
Packit 33f14e
  {
Packit 33f14e
    int argc = 0;
Packit 33f14e
    const char *argv[10];
Packit 33f14e
    int option_index;
Packit 33f14e
    int c;
Packit 33f14e
Packit 33f14e
    argv[argc++] = "program";
Packit 33f14e
    argv[argc++] = "--xt";
Packit 33f14e
    argv[argc] = NULL;
Packit 33f14e
    optind = 1;
Packit 33f14e
    opterr = 0;
Packit 33f14e
    c = do_getopt_long (argc, argv, "ab", long_options_required, &option_index);
Packit 33f14e
    ASSERT (c == '?');
Packit 33f14e
    ASSERT (optopt == 0);
Packit 33f14e
  }
Packit 33f14e
  {
Packit 33f14e
    int argc = 0;
Packit 33f14e
    const char *argv[10];
Packit 33f14e
    int option_index;
Packit 33f14e
    int c;
Packit 33f14e
Packit 33f14e
    argv[argc++] = "program";
Packit 33f14e
    argv[argc++] = "--xtr";
Packit 33f14e
    argv[argc] = NULL;
Packit 33f14e
    optind = 1;
Packit 33f14e
    opterr = 0;
Packit 33f14e
    c = do_getopt_long (argc, argv, "ab", long_options_required, &option_index);
Packit 33f14e
    ASSERT (c == '?');
Packit 33f14e
    ASSERT (optopt == 0);
Packit 33f14e
  }
Packit 33f14e
  {
Packit 33f14e
    int argc = 0;
Packit 33f14e
    const char *argv[10];
Packit 33f14e
    int option_index;
Packit 33f14e
    int c;
Packit 33f14e
Packit 33f14e
    argv[argc++] = "program";
Packit 33f14e
    argv[argc++] = "--xtra";
Packit 33f14e
    argv[argc] = NULL;
Packit 33f14e
    optind = 1;
Packit 33f14e
    opterr = 0;
Packit 33f14e
    c = do_getopt_long (argc, argv, "ab", long_options_required, &option_index);
Packit 33f14e
    ASSERT (c == 1001);
Packit 33f14e
  }
Packit 33f14e
  {
Packit 33f14e
    int argc = 0;
Packit 33f14e
    const char *argv[10];
Packit 33f14e
    int option_index;
Packit 33f14e
    int c;
Packit 33f14e
Packit 33f14e
    argv[argc++] = "program";
Packit 33f14e
    argv[argc++] = "--xtre";
Packit 33f14e
    argv[argc] = NULL;
Packit 33f14e
    optind = 1;
Packit 33f14e
    opterr = 0;
Packit 33f14e
    c = do_getopt_long (argc, argv, "ab", long_options_required, &option_index);
Packit 33f14e
    ASSERT (c == '?');
Packit 33f14e
    ASSERT (optopt == 0);
Packit 33f14e
  }
Packit 33f14e
  {
Packit 33f14e
    int argc = 0;
Packit 33f14e
    const char *argv[10];
Packit 33f14e
    int option_index;
Packit 33f14e
    int c;
Packit 33f14e
Packit 33f14e
    argv[argc++] = "program";
Packit 33f14e
    argv[argc++] = "--xtrem";
Packit 33f14e
    argv[argc] = NULL;
Packit 33f14e
    optind = 1;
Packit 33f14e
    opterr = 0;
Packit 33f14e
    c = do_getopt_long (argc, argv, "ab", long_options_required, &option_index);
Packit 33f14e
    ASSERT (c == '?');
Packit 33f14e
    ASSERT (optopt == 0);
Packit 33f14e
  }
Packit 33f14e
  {
Packit 33f14e
    int argc = 0;
Packit 33f14e
    const char *argv[10];
Packit 33f14e
    int option_index;
Packit 33f14e
    int c;
Packit 33f14e
Packit 33f14e
    argv[argc++] = "program";
Packit 33f14e
    argv[argc++] = "--xtreme";
Packit 33f14e
    argv[argc] = NULL;
Packit 33f14e
    optind = 1;
Packit 33f14e
    opterr = 0;
Packit 33f14e
    c = do_getopt_long (argc, argv, "ab", long_options_required, &option_index);
Packit 33f14e
    ASSERT (c == 1002);
Packit 33f14e
  }
Packit 33f14e
  {
Packit 33f14e
    int argc = 0;
Packit 33f14e
    const char *argv[10];
Packit 33f14e
    int option_index;
Packit 33f14e
    int c;
Packit 33f14e
Packit 33f14e
    argv[argc++] = "program";
Packit 33f14e
    argv[argc++] = "--xtremel";
Packit 33f14e
    argv[argc] = NULL;
Packit 33f14e
    optind = 1;
Packit 33f14e
    opterr = 0;
Packit 33f14e
    c = do_getopt_long (argc, argv, "ab", long_options_required, &option_index);
Packit 33f14e
    ASSERT (c == 1003);
Packit 33f14e
  }
Packit 33f14e
  {
Packit 33f14e
    int argc = 0;
Packit 33f14e
    const char *argv[10];
Packit 33f14e
    int option_index;
Packit 33f14e
    int c;
Packit 33f14e
Packit 33f14e
    argv[argc++] = "program";
Packit 33f14e
    argv[argc++] = "--xtremely";
Packit 33f14e
    argv[argc] = NULL;
Packit 33f14e
    optind = 1;
Packit 33f14e
    opterr = 0;
Packit 33f14e
    c = do_getopt_long (argc, argv, "ab", long_options_required, &option_index);
Packit 33f14e
    ASSERT (c == 1003);
Packit 33f14e
  }
Packit 33f14e
Packit 33f14e
  /* Check that -W handles unknown options.  */
Packit 33f14e
  {
Packit 33f14e
    int argc = 0;
Packit 33f14e
    const char *argv[10];
Packit 33f14e
    int option_index;
Packit 33f14e
    int c;
Packit 33f14e
Packit 33f14e
    argv[argc++] = "program";
Packit 33f14e
    argv[argc++] = "-W";
Packit 33f14e
    argv[argc] = NULL;
Packit 33f14e
    optind = 1;
Packit 33f14e
    opterr = 0;
Packit 33f14e
    c = do_getopt_long (argc, argv, "W;", long_options_required, &option_index);
Packit 33f14e
    ASSERT (c == '?');
Packit 33f14e
    ASSERT (optopt == 'W');
Packit 33f14e
  }
Packit 33f14e
  {
Packit 33f14e
    int argc = 0;
Packit 33f14e
    const char *argv[10];
Packit 33f14e
    int option_index;
Packit 33f14e
    int c;
Packit 33f14e
Packit 33f14e
    argv[argc++] = "program";
Packit 33f14e
    argv[argc++] = "-Wunknown";
Packit 33f14e
    argv[argc] = NULL;
Packit 33f14e
    optind = 1;
Packit 33f14e
    opterr = 0;
Packit 33f14e
    c = do_getopt_long (argc, argv, "W;", long_options_required, &option_index);
Packit 33f14e
    /* glibc and BSD behave differently here, but for now, we allow
Packit 33f14e
       both behaviors since W support is not frequently used.  */
Packit 33f14e
    if (c == '?')
Packit 33f14e
      {
Packit 33f14e
        ASSERT (optopt == 0);
Packit 33f14e
        ASSERT (optarg == NULL);
Packit 33f14e
      }
Packit 33f14e
    else
Packit 33f14e
      {
Packit 33f14e
        ASSERT (c == 'W');
Packit 33f14e
        ASSERT (strcmp (optarg, "unknown") == 0);
Packit 33f14e
      }
Packit 33f14e
  }
Packit 33f14e
  {
Packit 33f14e
    int argc = 0;
Packit 33f14e
    const char *argv[10];
Packit 33f14e
    int option_index;
Packit 33f14e
    int c;
Packit 33f14e
Packit 33f14e
    argv[argc++] = "program";
Packit 33f14e
    argv[argc++] = "-W";
Packit 33f14e
    argv[argc++] = "unknown";
Packit 33f14e
    argv[argc] = NULL;
Packit 33f14e
    optind = 1;
Packit 33f14e
    opterr = 0;
Packit 33f14e
    c = do_getopt_long (argc, argv, "W;", long_options_required, &option_index);
Packit 33f14e
    /* glibc and BSD behave differently here, but for now, we allow
Packit 33f14e
       both behaviors since W support is not frequently used.  */
Packit 33f14e
    if (c == '?')
Packit 33f14e
      {
Packit 33f14e
        ASSERT (optopt == 0);
Packit 33f14e
        ASSERT (optarg == NULL);
Packit 33f14e
      }
Packit 33f14e
    else
Packit 33f14e
      {
Packit 33f14e
        ASSERT (c == 'W');
Packit 33f14e
        ASSERT (strcmp (optarg, "unknown") == 0);
Packit 33f14e
      }
Packit 33f14e
  }
Packit 33f14e
Packit 33f14e
  /* Test that 'W' does not dump core:
Packit 33f14e
     http://sourceware.org/bugzilla/show_bug.cgi?id=12922  */
Packit 33f14e
  {
Packit 33f14e
    int argc = 0;
Packit 33f14e
    const char *argv[10];
Packit 33f14e
    int option_index;
Packit 33f14e
    int c;
Packit 33f14e
Packit 33f14e
    argv[argc++] = "program";
Packit 33f14e
    argv[argc++] = "-W";
Packit 33f14e
    argv[argc++] = "dummy";
Packit 33f14e
    argv[argc] = NULL;
Packit 33f14e
    optind = 1;
Packit 33f14e
    opterr = 0;
Packit 33f14e
    c = do_getopt_long (argc, argv, "W;", NULL, &option_index);
Packit 33f14e
    ASSERT (c == 'W');
Packit 33f14e
    ASSERT (optind == 2);
Packit 33f14e
  }
Packit 33f14e
Packit 33f14e
  /* Test processing of boolean short options.  */
Packit 33f14e
  for (start = 0; start <= 1; start++)
Packit 33f14e
    {
Packit 33f14e
      const char *p_value = NULL;
Packit 33f14e
      const char *q_value = NULL;
Packit 33f14e
      int non_options_count = 0;
Packit 33f14e
      const char *non_options[10];
Packit 33f14e
      int unrecognized = 0;
Packit 33f14e
      int argc = 0;
Packit 33f14e
      const char *argv[10];
Packit 33f14e
      a_seen = 0;
Packit 33f14e
      b_seen = 0;
Packit 33f14e
Packit 33f14e
      argv[argc++] = "program";
Packit 33f14e
      argv[argc++] = "-a";
Packit 33f14e
      argv[argc++] = "foo";
Packit 33f14e
      argv[argc++] = "bar";
Packit 33f14e
      argv[argc] = NULL;
Packit 33f14e
      optind = start;
Packit 33f14e
      getopt_long_loop (argc, argv, "ab", long_options_required,
Packit 33f14e
                        &p_value, &q_value,
Packit 33f14e
                        &non_options_count, non_options, &unrecognized);
Packit 33f14e
      ASSERT (a_seen == 1);
Packit 33f14e
      ASSERT (b_seen == 0);
Packit 33f14e
      ASSERT (p_value == NULL);
Packit 33f14e
      ASSERT (q_value == NULL);
Packit 33f14e
      ASSERT (non_options_count == 0);
Packit 33f14e
      ASSERT (unrecognized == 0);
Packit 33f14e
      ASSERT (optind == 2);
Packit 33f14e
    }
Packit 33f14e
  for (start = 0; start <= 1; start++)
Packit 33f14e
    {
Packit 33f14e
      const char *p_value = NULL;
Packit 33f14e
      const char *q_value = NULL;
Packit 33f14e
      int non_options_count = 0;
Packit 33f14e
      const char *non_options[10];
Packit 33f14e
      int unrecognized = 0;
Packit 33f14e
      int argc = 0;
Packit 33f14e
      const char *argv[10];
Packit 33f14e
      a_seen = 0;
Packit 33f14e
      b_seen = 0;
Packit 33f14e
Packit 33f14e
      argv[argc++] = "program";
Packit 33f14e
      argv[argc++] = "-b";
Packit 33f14e
      argv[argc++] = "-a";
Packit 33f14e
      argv[argc++] = "foo";
Packit 33f14e
      argv[argc++] = "bar";
Packit 33f14e
      argv[argc] = NULL;
Packit 33f14e
      optind = start;
Packit 33f14e
      getopt_long_loop (argc, argv, "ab", long_options_required,
Packit 33f14e
                        &p_value, &q_value,
Packit 33f14e
                        &non_options_count, non_options, &unrecognized);
Packit 33f14e
      ASSERT (a_seen == 1);
Packit 33f14e
      ASSERT (b_seen == 1);
Packit 33f14e
      ASSERT (p_value == NULL);
Packit 33f14e
      ASSERT (q_value == NULL);
Packit 33f14e
      ASSERT (non_options_count == 0);
Packit 33f14e
      ASSERT (unrecognized == 0);
Packit 33f14e
      ASSERT (optind == 3);
Packit 33f14e
    }
Packit 33f14e
  for (start = 0; start <= 1; start++)
Packit 33f14e
    {
Packit 33f14e
      const char *p_value = NULL;
Packit 33f14e
      const char *q_value = NULL;
Packit 33f14e
      int non_options_count = 0;
Packit 33f14e
      const char *non_options[10];
Packit 33f14e
      int unrecognized = 0;
Packit 33f14e
      int argc = 0;
Packit 33f14e
      const char *argv[10];
Packit 33f14e
      a_seen = 0;
Packit 33f14e
      b_seen = 0;
Packit 33f14e
Packit 33f14e
      argv[argc++] = "program";
Packit 33f14e
      argv[argc++] = "-ba";
Packit 33f14e
      argv[argc++] = "foo";
Packit 33f14e
      argv[argc++] = "bar";
Packit 33f14e
      argv[argc] = NULL;
Packit 33f14e
      optind = start;
Packit 33f14e
      getopt_long_loop (argc, argv, "ab", long_options_required,
Packit 33f14e
                        &p_value, &q_value,
Packit 33f14e
                        &non_options_count, non_options, &unrecognized);
Packit 33f14e
      ASSERT (a_seen == 1);
Packit 33f14e
      ASSERT (b_seen == 1);
Packit 33f14e
      ASSERT (p_value == NULL);
Packit 33f14e
      ASSERT (q_value == NULL);
Packit 33f14e
      ASSERT (non_options_count == 0);
Packit 33f14e
      ASSERT (unrecognized == 0);
Packit 33f14e
      ASSERT (optind == 2);
Packit 33f14e
    }
Packit 33f14e
  for (start = 0; start <= 1; start++)
Packit 33f14e
    {
Packit 33f14e
      const char *p_value = NULL;
Packit 33f14e
      const char *q_value = NULL;
Packit 33f14e
      int non_options_count = 0;
Packit 33f14e
      const char *non_options[10];
Packit 33f14e
      int unrecognized = 0;
Packit 33f14e
      int argc = 0;
Packit 33f14e
      const char *argv[10];
Packit 33f14e
      a_seen = 0;
Packit 33f14e
      b_seen = 0;
Packit 33f14e
Packit 33f14e
      argv[argc++] = "program";
Packit 33f14e
      argv[argc++] = "-ab";
Packit 33f14e
      argv[argc++] = "-a";
Packit 33f14e
      argv[argc++] = "foo";
Packit 33f14e
      argv[argc++] = "bar";
Packit 33f14e
      argv[argc] = NULL;
Packit 33f14e
      optind = start;
Packit 33f14e
      getopt_long_loop (argc, argv, "ab", long_options_required,
Packit 33f14e
                        &p_value, &q_value,
Packit 33f14e
                        &non_options_count, non_options, &unrecognized);
Packit 33f14e
      ASSERT (a_seen == 2);
Packit 33f14e
      ASSERT (b_seen == 1);
Packit 33f14e
      ASSERT (p_value == NULL);
Packit 33f14e
      ASSERT (q_value == NULL);
Packit 33f14e
      ASSERT (non_options_count == 0);
Packit 33f14e
      ASSERT (unrecognized == 0);
Packit 33f14e
      ASSERT (optind == 3);
Packit 33f14e
    }
Packit 33f14e
Packit 33f14e
  /* Test processing of boolean long options.  */
Packit 33f14e
  for (start = 0; start <= 1; start++)
Packit 33f14e
    {
Packit 33f14e
      const char *p_value = NULL;
Packit 33f14e
      const char *q_value = NULL;
Packit 33f14e
      int non_options_count = 0;
Packit 33f14e
      const char *non_options[10];
Packit 33f14e
      int unrecognized = 0;
Packit 33f14e
      int argc = 0;
Packit 33f14e
      const char *argv[10];
Packit 33f14e
      a_seen = 0;
Packit 33f14e
      b_seen = 0;
Packit 33f14e
Packit 33f14e
      argv[argc++] = "program";
Packit 33f14e
      argv[argc++] = "--alpha";
Packit 33f14e
      argv[argc++] = "foo";
Packit 33f14e
      argv[argc++] = "bar";
Packit 33f14e
      argv[argc] = NULL;
Packit 33f14e
      optind = start;
Packit 33f14e
      getopt_long_loop (argc, argv, "ab", long_options_required,
Packit 33f14e
                        &p_value, &q_value,
Packit 33f14e
                        &non_options_count, non_options, &unrecognized);
Packit 33f14e
      ASSERT (a_seen == 1);
Packit 33f14e
      ASSERT (b_seen == 0);
Packit 33f14e
      ASSERT (p_value == NULL);
Packit 33f14e
      ASSERT (q_value == NULL);
Packit 33f14e
      ASSERT (non_options_count == 0);
Packit 33f14e
      ASSERT (unrecognized == 0);
Packit 33f14e
      ASSERT (optind == 2);
Packit 33f14e
    }
Packit 33f14e
  for (start = 0; start <= 1; start++)
Packit 33f14e
    {
Packit 33f14e
      const char *p_value = NULL;
Packit 33f14e
      const char *q_value = NULL;
Packit 33f14e
      int non_options_count = 0;
Packit 33f14e
      const char *non_options[10];
Packit 33f14e
      int unrecognized = 0;
Packit 33f14e
      int argc = 0;
Packit 33f14e
      const char *argv[10];
Packit 33f14e
      a_seen = 0;
Packit 33f14e
      b_seen = 0;
Packit 33f14e
Packit 33f14e
      argv[argc++] = "program";
Packit 33f14e
      argv[argc++] = "--beta";
Packit 33f14e
      argv[argc++] = "--alpha";
Packit 33f14e
      argv[argc++] = "foo";
Packit 33f14e
      argv[argc++] = "bar";
Packit 33f14e
      argv[argc] = NULL;
Packit 33f14e
      optind = start;
Packit 33f14e
      getopt_long_loop (argc, argv, "ab", long_options_required,
Packit 33f14e
                        &p_value, &q_value,
Packit 33f14e
                        &non_options_count, non_options, &unrecognized);
Packit 33f14e
      ASSERT (a_seen == 1);
Packit 33f14e
      ASSERT (b_seen == 1);
Packit 33f14e
      ASSERT (p_value == NULL);
Packit 33f14e
      ASSERT (q_value == NULL);
Packit 33f14e
      ASSERT (non_options_count == 0);
Packit 33f14e
      ASSERT (unrecognized == 0);
Packit 33f14e
      ASSERT (optind == 3);
Packit 33f14e
    }
Packit 33f14e
  for (start = 0; start <= 1; start++)
Packit 33f14e
    {
Packit 33f14e
      const char *p_value = NULL;
Packit 33f14e
      const char *q_value = NULL;
Packit 33f14e
      int non_options_count = 0;
Packit 33f14e
      const char *non_options[10];
Packit 33f14e
      int unrecognized = 0;
Packit 33f14e
      int argc = 0;
Packit 33f14e
      const char *argv[10];
Packit 33f14e
      a_seen = 0;
Packit 33f14e
      b_seen = 0;
Packit 33f14e
Packit 33f14e
      argv[argc++] = "program";
Packit 33f14e
      argv[argc++] = "--alpha";
Packit 33f14e
      argv[argc++] = "--beta";
Packit 33f14e
      argv[argc++] = "--alpha";
Packit 33f14e
      argv[argc++] = "--beta";
Packit 33f14e
      argv[argc++] = "foo";
Packit 33f14e
      argv[argc++] = "bar";
Packit 33f14e
      argv[argc] = NULL;
Packit 33f14e
      optind = start;
Packit 33f14e
      getopt_long_loop (argc, argv, "ab", long_options_required,
Packit 33f14e
                        &p_value, &q_value,
Packit 33f14e
                        &non_options_count, non_options, &unrecognized);
Packit 33f14e
      ASSERT (a_seen == 2);
Packit 33f14e
      ASSERT (b_seen == 1);
Packit 33f14e
      ASSERT (p_value == NULL);
Packit 33f14e
      ASSERT (q_value == NULL);
Packit 33f14e
      ASSERT (non_options_count == 0);
Packit 33f14e
      ASSERT (unrecognized == 0);
Packit 33f14e
      ASSERT (optind == 5);
Packit 33f14e
    }
Packit 33f14e
Packit 33f14e
  /* Test processing of boolean long options via -W.  */
Packit 33f14e
  for (start = 0; start <= 1; start++)
Packit 33f14e
    {
Packit 33f14e
      const char *p_value = NULL;
Packit 33f14e
      const char *q_value = NULL;
Packit 33f14e
      int non_options_count = 0;
Packit 33f14e
      const char *non_options[10];
Packit 33f14e
      int unrecognized = 0;
Packit 33f14e
      int argc = 0;
Packit 33f14e
      const char *argv[10];
Packit 33f14e
      a_seen = 0;
Packit 33f14e
      b_seen = 0;
Packit 33f14e
Packit 33f14e
      argv[argc++] = "program";
Packit 33f14e
      argv[argc++] = "-Walpha";
Packit 33f14e
      argv[argc++] = "foo";
Packit 33f14e
      argv[argc++] = "bar";
Packit 33f14e
      argv[argc] = NULL;
Packit 33f14e
      optind = start;
Packit 33f14e
      getopt_long_loop (argc, argv, "abW;", long_options_required,
Packit 33f14e
                        &p_value, &q_value,
Packit 33f14e
                        &non_options_count, non_options, &unrecognized);
Packit 33f14e
      ASSERT (a_seen == 1);
Packit 33f14e
      ASSERT (b_seen == 0);
Packit 33f14e
      ASSERT (p_value == NULL);
Packit 33f14e
      ASSERT (q_value == NULL);
Packit 33f14e
      ASSERT (non_options_count == 0);
Packit 33f14e
      ASSERT (unrecognized == 0);
Packit 33f14e
      ASSERT (optind == 2);
Packit 33f14e
    }
Packit 33f14e
  for (start = 0; start <= 1; start++)
Packit 33f14e
    {
Packit 33f14e
      const char *p_value = NULL;
Packit 33f14e
      const char *q_value = NULL;
Packit 33f14e
      int non_options_count = 0;
Packit 33f14e
      const char *non_options[10];
Packit 33f14e
      int unrecognized = 0;
Packit 33f14e
      int argc = 0;
Packit 33f14e
      const char *argv[10];
Packit 33f14e
      a_seen = 0;
Packit 33f14e
      b_seen = 0;
Packit 33f14e
Packit 33f14e
      argv[argc++] = "program";
Packit 33f14e
      argv[argc++] = "-W";
Packit 33f14e
      argv[argc++] = "beta";
Packit 33f14e
      argv[argc++] = "-W";
Packit 33f14e
      argv[argc++] = "alpha";
Packit 33f14e
      argv[argc++] = "foo";
Packit 33f14e
      argv[argc++] = "bar";
Packit 33f14e
      argv[argc] = NULL;
Packit 33f14e
      optind = start;
Packit 33f14e
      getopt_long_loop (argc, argv, "aW;b", long_options_required,
Packit 33f14e
                        &p_value, &q_value,
Packit 33f14e
                        &non_options_count, non_options, &unrecognized);
Packit 33f14e
      ASSERT (a_seen == 1);
Packit 33f14e
      ASSERT (b_seen == 1);
Packit 33f14e
      ASSERT (p_value == NULL);
Packit 33f14e
      ASSERT (q_value == NULL);
Packit 33f14e
      ASSERT (non_options_count == 0);
Packit 33f14e
      ASSERT (unrecognized == 0);
Packit 33f14e
      ASSERT (optind == 5);
Packit 33f14e
    }
Packit 33f14e
  for (start = 0; start <= 1; start++)
Packit 33f14e
    {
Packit 33f14e
      const char *p_value = NULL;
Packit 33f14e
      const char *q_value = NULL;
Packit 33f14e
      int non_options_count = 0;
Packit 33f14e
      const char *non_options[10];
Packit 33f14e
      int unrecognized = 0;
Packit 33f14e
      int argc = 0;
Packit 33f14e
      const char *argv[10];
Packit 33f14e
      a_seen = 0;
Packit 33f14e
      b_seen = 0;
Packit 33f14e
Packit 33f14e
      argv[argc++] = "program";
Packit 33f14e
      argv[argc++] = "-Walpha";
Packit 33f14e
      argv[argc++] = "-Wbeta";
Packit 33f14e
      argv[argc++] = "-Walpha";
Packit 33f14e
      argv[argc++] = "-Wbeta";
Packit 33f14e
      argv[argc++] = "foo";
Packit 33f14e
      argv[argc++] = "bar";
Packit 33f14e
      argv[argc] = NULL;
Packit 33f14e
      optind = start;
Packit 33f14e
      getopt_long_loop (argc, argv, "W;ab", long_options_required,
Packit 33f14e
                        &p_value, &q_value,
Packit 33f14e
                        &non_options_count, non_options, &unrecognized);
Packit 33f14e
      ASSERT (a_seen == 2);
Packit 33f14e
      ASSERT (b_seen == 1);
Packit 33f14e
      ASSERT (p_value == NULL);
Packit 33f14e
      ASSERT (q_value == NULL);
Packit 33f14e
      ASSERT (non_options_count == 0);
Packit 33f14e
      ASSERT (unrecognized == 0);
Packit 33f14e
      ASSERT (optind == 5);
Packit 33f14e
    }
Packit 33f14e
Packit 33f14e
  /* Test processing of short options with arguments.  */
Packit 33f14e
  for (start = 0; start <= 1; start++)
Packit 33f14e
    {
Packit 33f14e
      const char *p_value = NULL;
Packit 33f14e
      const char *q_value = NULL;
Packit 33f14e
      int non_options_count = 0;
Packit 33f14e
      const char *non_options[10];
Packit 33f14e
      int unrecognized = 0;
Packit 33f14e
      int argc = 0;
Packit 33f14e
      const char *argv[10];
Packit 33f14e
      a_seen = 0;
Packit 33f14e
      b_seen = 0;
Packit 33f14e
Packit 33f14e
      argv[argc++] = "program";
Packit 33f14e
      argv[argc++] = "-pfoo";
Packit 33f14e
      argv[argc++] = "bar";
Packit 33f14e
      argv[argc] = NULL;
Packit 33f14e
      optind = start;
Packit 33f14e
      getopt_long_loop (argc, argv, "p:q:", long_options_required,
Packit 33f14e
                        &p_value, &q_value,
Packit 33f14e
                        &non_options_count, non_options, &unrecognized);
Packit 33f14e
      ASSERT (a_seen == 0);
Packit 33f14e
      ASSERT (b_seen == 0);
Packit 33f14e
      ASSERT (p_value != NULL && strcmp (p_value, "foo") == 0);
Packit 33f14e
      ASSERT (q_value == NULL);
Packit 33f14e
      ASSERT (non_options_count == 0);
Packit 33f14e
      ASSERT (unrecognized == 0);
Packit 33f14e
      ASSERT (optind == 2);
Packit 33f14e
    }
Packit 33f14e
  for (start = 0; start <= 1; start++)
Packit 33f14e
    {
Packit 33f14e
      const char *p_value = NULL;
Packit 33f14e
      const char *q_value = NULL;
Packit 33f14e
      int non_options_count = 0;
Packit 33f14e
      const char *non_options[10];
Packit 33f14e
      int unrecognized = 0;
Packit 33f14e
      int argc = 0;
Packit 33f14e
      const char *argv[10];
Packit 33f14e
      a_seen = 0;
Packit 33f14e
      b_seen = 0;
Packit 33f14e
Packit 33f14e
      argv[argc++] = "program";
Packit 33f14e
      argv[argc++] = "-p";
Packit 33f14e
      argv[argc++] = "foo";
Packit 33f14e
      argv[argc++] = "bar";
Packit 33f14e
      argv[argc] = NULL;
Packit 33f14e
      optind = start;
Packit 33f14e
      getopt_long_loop (argc, argv, "p:q:", long_options_required,
Packit 33f14e
                        &p_value, &q_value,
Packit 33f14e
                        &non_options_count, non_options, &unrecognized);
Packit 33f14e
      ASSERT (a_seen == 0);
Packit 33f14e
      ASSERT (b_seen == 0);
Packit 33f14e
      ASSERT (p_value != NULL && strcmp (p_value, "foo") == 0);
Packit 33f14e
      ASSERT (q_value == NULL);
Packit 33f14e
      ASSERT (non_options_count == 0);
Packit 33f14e
      ASSERT (unrecognized == 0);
Packit 33f14e
      ASSERT (optind == 3);
Packit 33f14e
    }
Packit 33f14e
  for (start = 0; start <= 1; start++)
Packit 33f14e
    {
Packit 33f14e
      const char *p_value = NULL;
Packit 33f14e
      const char *q_value = NULL;
Packit 33f14e
      int non_options_count = 0;
Packit 33f14e
      const char *non_options[10];
Packit 33f14e
      int unrecognized = 0;
Packit 33f14e
      int argc = 0;
Packit 33f14e
      const char *argv[10];
Packit 33f14e
      a_seen = 0;
Packit 33f14e
      b_seen = 0;
Packit 33f14e
Packit 33f14e
      argv[argc++] = "program";
Packit 33f14e
      argv[argc++] = "-ab";
Packit 33f14e
      argv[argc++] = "-q";
Packit 33f14e
      argv[argc++] = "baz";
Packit 33f14e
      argv[argc++] = "-pfoo";
Packit 33f14e
      argv[argc++] = "bar";
Packit 33f14e
      argv[argc] = NULL;
Packit 33f14e
      optind = start;
Packit 33f14e
      getopt_long_loop (argc, argv, "abp:q:", long_options_required,
Packit 33f14e
                        &p_value, &q_value,
Packit 33f14e
                        &non_options_count, non_options, &unrecognized);
Packit 33f14e
      ASSERT (a_seen == 1);
Packit 33f14e
      ASSERT (b_seen == 1);
Packit 33f14e
      ASSERT (p_value != NULL && strcmp (p_value, "foo") == 0);
Packit 33f14e
      ASSERT (q_value != NULL && strcmp (q_value, "baz") == 0);
Packit 33f14e
      ASSERT (non_options_count == 0);
Packit 33f14e
      ASSERT (unrecognized == 0);
Packit 33f14e
      ASSERT (optind == 5);
Packit 33f14e
    }
Packit 33f14e
Packit 33f14e
  /* Test processing of long options with arguments.  */
Packit 33f14e
  for (start = 0; start <= 1; start++)
Packit 33f14e
    {
Packit 33f14e
      const char *p_value = NULL;
Packit 33f14e
      const char *q_value = NULL;
Packit 33f14e
      int non_options_count = 0;
Packit 33f14e
      const char *non_options[10];
Packit 33f14e
      int unrecognized = 0;
Packit 33f14e
      int argc = 0;
Packit 33f14e
      const char *argv[10];
Packit 33f14e
      a_seen = 0;
Packit 33f14e
      b_seen = 0;
Packit 33f14e
Packit 33f14e
      argv[argc++] = "program";
Packit 33f14e
      argv[argc++] = "--p=foo";
Packit 33f14e
      argv[argc++] = "bar";
Packit 33f14e
      argv[argc] = NULL;
Packit 33f14e
      optind = start;
Packit 33f14e
      getopt_long_loop (argc, argv, "p:q:", long_options_required,
Packit 33f14e
                        &p_value, &q_value,
Packit 33f14e
                        &non_options_count, non_options, &unrecognized);
Packit 33f14e
      ASSERT (a_seen == 0);
Packit 33f14e
      ASSERT (b_seen == 0);
Packit 33f14e
      ASSERT (p_value != NULL && strcmp (p_value, "foo") == 0);
Packit 33f14e
      ASSERT (q_value == NULL);
Packit 33f14e
      ASSERT (non_options_count == 0);
Packit 33f14e
      ASSERT (unrecognized == 0);
Packit 33f14e
      ASSERT (optind == 2);
Packit 33f14e
    }
Packit 33f14e
  for (start = 0; start <= 1; start++)
Packit 33f14e
    {
Packit 33f14e
      const char *p_value = NULL;
Packit 33f14e
      const char *q_value = NULL;
Packit 33f14e
      int non_options_count = 0;
Packit 33f14e
      const char *non_options[10];
Packit 33f14e
      int unrecognized = 0;
Packit 33f14e
      int argc = 0;
Packit 33f14e
      const char *argv[10];
Packit 33f14e
      a_seen = 0;
Packit 33f14e
      b_seen = 0;
Packit 33f14e
Packit 33f14e
      argv[argc++] = "program";
Packit 33f14e
      argv[argc++] = "--p";
Packit 33f14e
      argv[argc++] = "foo";
Packit 33f14e
      argv[argc++] = "bar";
Packit 33f14e
      argv[argc] = NULL;
Packit 33f14e
      optind = start;
Packit 33f14e
      getopt_long_loop (argc, argv, "p:q:", long_options_required,
Packit 33f14e
                        &p_value, &q_value,
Packit 33f14e
                        &non_options_count, non_options, &unrecognized);
Packit 33f14e
      ASSERT (a_seen == 0);
Packit 33f14e
      ASSERT (b_seen == 0);
Packit 33f14e
      ASSERT (p_value != NULL && strcmp (p_value, "foo") == 0);
Packit 33f14e
      ASSERT (q_value == NULL);
Packit 33f14e
      ASSERT (non_options_count == 0);
Packit 33f14e
      ASSERT (unrecognized == 0);
Packit 33f14e
      ASSERT (optind == 3);
Packit 33f14e
    }
Packit 33f14e
  for (start = 0; start <= 1; start++)
Packit 33f14e
    {
Packit 33f14e
      const char *p_value = NULL;
Packit 33f14e
      const char *q_value = NULL;
Packit 33f14e
      int non_options_count = 0;
Packit 33f14e
      const char *non_options[10];
Packit 33f14e
      int unrecognized = 0;
Packit 33f14e
      int argc = 0;
Packit 33f14e
      const char *argv[10];
Packit 33f14e
      a_seen = 0;
Packit 33f14e
      b_seen = 0;
Packit 33f14e
Packit 33f14e
      argv[argc++] = "program";
Packit 33f14e
      argv[argc++] = "-ab";
Packit 33f14e
      argv[argc++] = "--q";
Packit 33f14e
      argv[argc++] = "baz";
Packit 33f14e
      argv[argc++] = "--p=foo";
Packit 33f14e
      argv[argc++] = "bar";
Packit 33f14e
      argv[argc] = NULL;
Packit 33f14e
      optind = start;
Packit 33f14e
      getopt_long_loop (argc, argv, "abp:q:", long_options_required,
Packit 33f14e
                        &p_value, &q_value,
Packit 33f14e
                        &non_options_count, non_options, &unrecognized);
Packit 33f14e
      ASSERT (a_seen == 1);
Packit 33f14e
      ASSERT (b_seen == 1);
Packit 33f14e
      ASSERT (p_value != NULL && strcmp (p_value, "foo") == 0);
Packit 33f14e
      ASSERT (q_value != NULL && strcmp (q_value, "baz") == 0);
Packit 33f14e
      ASSERT (non_options_count == 0);
Packit 33f14e
      ASSERT (unrecognized == 0);
Packit 33f14e
      ASSERT (optind == 5);
Packit 33f14e
    }
Packit 33f14e
Packit 33f14e
  /* Test processing of long options with arguments via -W.  */
Packit 33f14e
  for (start = 0; start <= 1; start++)
Packit 33f14e
    {
Packit 33f14e
      const char *p_value = NULL;
Packit 33f14e
      const char *q_value = NULL;
Packit 33f14e
      int non_options_count = 0;
Packit 33f14e
      const char *non_options[10];
Packit 33f14e
      int unrecognized = 0;
Packit 33f14e
      int argc = 0;
Packit 33f14e
      const char *argv[10];
Packit 33f14e
      a_seen = 0;
Packit 33f14e
      b_seen = 0;
Packit 33f14e
Packit 33f14e
      argv[argc++] = "program";
Packit 33f14e
      argv[argc++] = "-Wp=foo";
Packit 33f14e
      argv[argc++] = "bar";
Packit 33f14e
      argv[argc] = NULL;
Packit 33f14e
      optind = start;
Packit 33f14e
      getopt_long_loop (argc, argv, "p:q:W;", long_options_required,
Packit 33f14e
                        &p_value, &q_value,
Packit 33f14e
                        &non_options_count, non_options, &unrecognized);
Packit 33f14e
      ASSERT (a_seen == 0);
Packit 33f14e
      ASSERT (b_seen == 0);
Packit 33f14e
      ASSERT (p_value != NULL && strcmp (p_value, "foo") == 0);
Packit 33f14e
      ASSERT (q_value == NULL);
Packit 33f14e
      ASSERT (non_options_count == 0);
Packit 33f14e
      ASSERT (unrecognized == 0);
Packit 33f14e
      ASSERT (optind == 2);
Packit 33f14e
    }
Packit 33f14e
  for (start = 0; start <= 1; start++)
Packit 33f14e
    {
Packit 33f14e
      const char *p_value = NULL;
Packit 33f14e
      const char *q_value = NULL;
Packit 33f14e
      int non_options_count = 0;
Packit 33f14e
      const char *non_options[10];
Packit 33f14e
      int unrecognized = 0;
Packit 33f14e
      int argc = 0;
Packit 33f14e
      const char *argv[10];
Packit 33f14e
      a_seen = 0;
Packit 33f14e
      b_seen = 0;
Packit 33f14e
Packit 33f14e
      argv[argc++] = "program";
Packit 33f14e
      argv[argc++] = "-W";
Packit 33f14e
      argv[argc++] = "p";
Packit 33f14e
      argv[argc++] = "foo";
Packit 33f14e
      argv[argc++] = "bar";
Packit 33f14e
      argv[argc] = NULL;
Packit 33f14e
      optind = start;
Packit 33f14e
      getopt_long_loop (argc, argv, "p:W;q:", long_options_required,
Packit 33f14e
                        &p_value, &q_value,
Packit 33f14e
                        &non_options_count, non_options, &unrecognized);
Packit 33f14e
      ASSERT (a_seen == 0);
Packit 33f14e
      ASSERT (b_seen == 0);
Packit 33f14e
      ASSERT (p_value != NULL && strcmp (p_value, "foo") == 0);
Packit 33f14e
      ASSERT (q_value == NULL);
Packit 33f14e
      ASSERT (non_options_count == 0);
Packit 33f14e
      ASSERT (unrecognized == 0);
Packit 33f14e
      ASSERT (optind == 4);
Packit 33f14e
    }
Packit 33f14e
  for (start = 0; start <= 1; start++)
Packit 33f14e
    {
Packit 33f14e
      const char *p_value = NULL;
Packit 33f14e
      const char *q_value = NULL;
Packit 33f14e
      int non_options_count = 0;
Packit 33f14e
      const char *non_options[10];
Packit 33f14e
      int unrecognized = 0;
Packit 33f14e
      int argc = 0;
Packit 33f14e
      const char *argv[10];
Packit 33f14e
      a_seen = 0;
Packit 33f14e
      b_seen = 0;
Packit 33f14e
Packit 33f14e
      argv[argc++] = "program";
Packit 33f14e
      argv[argc++] = "-ab";
Packit 33f14e
      argv[argc++] = "-Wq";
Packit 33f14e
      argv[argc++] = "baz";
Packit 33f14e
      argv[argc++] = "-W";
Packit 33f14e
      argv[argc++] = "p=foo";
Packit 33f14e
      argv[argc++] = "bar";
Packit 33f14e
      argv[argc] = NULL;
Packit 33f14e
      optind = start;
Packit 33f14e
      getopt_long_loop (argc, argv, "W;abp:q:", long_options_required,
Packit 33f14e
                        &p_value, &q_value,
Packit 33f14e
                        &non_options_count, non_options, &unrecognized);
Packit 33f14e
      ASSERT (a_seen == 1);
Packit 33f14e
      ASSERT (b_seen == 1);
Packit 33f14e
      ASSERT (p_value != NULL && strcmp (p_value, "foo") == 0);
Packit 33f14e
      ASSERT (q_value != NULL && strcmp (q_value, "baz") == 0);
Packit 33f14e
      ASSERT (non_options_count == 0);
Packit 33f14e
      ASSERT (unrecognized == 0);
Packit 33f14e
      ASSERT (optind == 6);
Packit 33f14e
    }
Packit 33f14e
Packit 33f14e
  /* Test processing of short options with optional arguments.  */
Packit 33f14e
  for (start = 0; start <= 1; start++)
Packit 33f14e
    {
Packit 33f14e
      const char *p_value = NULL;
Packit 33f14e
      const char *q_value = NULL;
Packit 33f14e
      int non_options_count = 0;
Packit 33f14e
      const char *non_options[10];
Packit 33f14e
      int unrecognized = 0;
Packit 33f14e
      int argc = 0;
Packit 33f14e
      const char *argv[10];
Packit 33f14e
      a_seen = 0;
Packit 33f14e
      b_seen = 0;
Packit 33f14e
Packit 33f14e
      argv[argc++] = "program";
Packit 33f14e
      argv[argc++] = "-pfoo";
Packit 33f14e
      argv[argc++] = "bar";
Packit 33f14e
      argv[argc] = NULL;
Packit 33f14e
      optind = start;
Packit 33f14e
      getopt_long_loop (argc, argv, "p::q::", long_options_optional,
Packit 33f14e
                        &p_value, &q_value,
Packit 33f14e
                        &non_options_count, non_options, &unrecognized);
Packit 33f14e
      ASSERT (a_seen == 0);
Packit 33f14e
      ASSERT (b_seen == 0);
Packit 33f14e
      ASSERT (p_value != NULL && strcmp (p_value, "foo") == 0);
Packit 33f14e
      ASSERT (q_value == NULL);
Packit 33f14e
      ASSERT (non_options_count == 0);
Packit 33f14e
      ASSERT (unrecognized == 0);
Packit 33f14e
      ASSERT (optind == 2);
Packit 33f14e
    }
Packit 33f14e
  for (start = 0; start <= 1; start++)
Packit 33f14e
    {
Packit 33f14e
      const char *p_value = NULL;
Packit 33f14e
      const char *q_value = NULL;
Packit 33f14e
      int non_options_count = 0;
Packit 33f14e
      const char *non_options[10];
Packit 33f14e
      int unrecognized = 0;
Packit 33f14e
      int argc = 0;
Packit 33f14e
      const char *argv[10];
Packit 33f14e
      a_seen = 0;
Packit 33f14e
      b_seen = 0;
Packit 33f14e
Packit 33f14e
      argv[argc++] = "program";
Packit 33f14e
      argv[argc++] = "-p";
Packit 33f14e
      argv[argc++] = "foo";
Packit 33f14e
      argv[argc++] = "bar";
Packit 33f14e
      argv[argc] = NULL;
Packit 33f14e
      optind = start;
Packit 33f14e
      getopt_long_loop (argc, argv, "p::q::", long_options_optional,
Packit 33f14e
                        &p_value, &q_value,
Packit 33f14e
                        &non_options_count, non_options, &unrecognized);
Packit 33f14e
      ASSERT (a_seen == 0);
Packit 33f14e
      ASSERT (b_seen == 0);
Packit 33f14e
      ASSERT (p_value == NULL);
Packit 33f14e
      ASSERT (q_value == NULL);
Packit 33f14e
      ASSERT (non_options_count == 0);
Packit 33f14e
      ASSERT (unrecognized == 0);
Packit 33f14e
      ASSERT (optind == 2);
Packit 33f14e
    }
Packit 33f14e
  for (start = 0; start <= 1; start++)
Packit 33f14e
    {
Packit 33f14e
      const char *p_value = NULL;
Packit 33f14e
      const char *q_value = NULL;
Packit 33f14e
      int non_options_count = 0;
Packit 33f14e
      const char *non_options[10];
Packit 33f14e
      int unrecognized = 0;
Packit 33f14e
      int argc = 0;
Packit 33f14e
      const char *argv[10];
Packit 33f14e
      a_seen = 0;
Packit 33f14e
      b_seen = 0;
Packit 33f14e
Packit 33f14e
      argv[argc++] = "program";
Packit 33f14e
      argv[argc++] = "-p";
Packit 33f14e
      argv[argc++] = "-a";
Packit 33f14e
      argv[argc++] = "bar";
Packit 33f14e
      argv[argc] = NULL;
Packit 33f14e
      optind = start;
Packit 33f14e
      getopt_long_loop (argc, argv, "abp::q::", long_options_optional,
Packit 33f14e
                        &p_value, &q_value,
Packit 33f14e
                        &non_options_count, non_options, &unrecognized);
Packit 33f14e
      ASSERT (a_seen == 1);
Packit 33f14e
      ASSERT (b_seen == 0);
Packit 33f14e
      ASSERT (p_value == NULL);
Packit 33f14e
      ASSERT (q_value == NULL);
Packit 33f14e
      ASSERT (non_options_count == 0);
Packit 33f14e
      ASSERT (unrecognized == 0);
Packit 33f14e
      ASSERT (optind == 3);
Packit 33f14e
    }
Packit 33f14e
Packit 33f14e
  /* Test processing of long options with optional arguments.  */
Packit 33f14e
  for (start = 0; start <= 1; start++)
Packit 33f14e
    {
Packit 33f14e
      const char *p_value = NULL;
Packit 33f14e
      const char *q_value = NULL;
Packit 33f14e
      int non_options_count = 0;
Packit 33f14e
      const char *non_options[10];
Packit 33f14e
      int unrecognized = 0;
Packit 33f14e
      int argc = 0;
Packit 33f14e
      const char *argv[10];
Packit 33f14e
      a_seen = 0;
Packit 33f14e
      b_seen = 0;
Packit 33f14e
Packit 33f14e
      argv[argc++] = "program";
Packit 33f14e
      argv[argc++] = "--p=foo";
Packit 33f14e
      argv[argc++] = "bar";
Packit 33f14e
      argv[argc] = NULL;
Packit 33f14e
      optind = start;
Packit 33f14e
      getopt_long_loop (argc, argv, "p::q::", long_options_optional,
Packit 33f14e
                        &p_value, &q_value,
Packit 33f14e
                        &non_options_count, non_options, &unrecognized);
Packit 33f14e
      ASSERT (a_seen == 0);
Packit 33f14e
      ASSERT (b_seen == 0);
Packit 33f14e
      ASSERT (p_value != NULL && strcmp (p_value, "foo") == 0);
Packit 33f14e
      ASSERT (q_value == NULL);
Packit 33f14e
      ASSERT (non_options_count == 0);
Packit 33f14e
      ASSERT (unrecognized == 0);
Packit 33f14e
      ASSERT (optind == 2);
Packit 33f14e
    }
Packit 33f14e
  for (start = 0; start <= 1; start++)
Packit 33f14e
    {
Packit 33f14e
      const char *p_value = NULL;
Packit 33f14e
      const char *q_value = NULL;
Packit 33f14e
      int non_options_count = 0;
Packit 33f14e
      const char *non_options[10];
Packit 33f14e
      int unrecognized = 0;
Packit 33f14e
      int argc = 0;
Packit 33f14e
      const char *argv[10];
Packit 33f14e
      a_seen = 0;
Packit 33f14e
      b_seen = 0;
Packit 33f14e
Packit 33f14e
      argv[argc++] = "program";
Packit 33f14e
      argv[argc++] = "--p";
Packit 33f14e
      argv[argc++] = "foo";
Packit 33f14e
      argv[argc++] = "bar";
Packit 33f14e
      argv[argc] = NULL;
Packit 33f14e
      optind = start;
Packit 33f14e
      getopt_long_loop (argc, argv, "p::q::", long_options_optional,
Packit 33f14e
                        &p_value, &q_value,
Packit 33f14e
                        &non_options_count, non_options, &unrecognized);
Packit 33f14e
      ASSERT (a_seen == 0);
Packit 33f14e
      ASSERT (b_seen == 0);
Packit 33f14e
      ASSERT (p_value == NULL);
Packit 33f14e
      ASSERT (q_value == NULL);
Packit 33f14e
      ASSERT (non_options_count == 0);
Packit 33f14e
      ASSERT (unrecognized == 0);
Packit 33f14e
      ASSERT (optind == 2);
Packit 33f14e
    }
Packit 33f14e
  for (start = 0; start <= 1; start++)
Packit 33f14e
    {
Packit 33f14e
      const char *p_value = NULL;
Packit 33f14e
      const char *q_value = NULL;
Packit 33f14e
      int non_options_count = 0;
Packit 33f14e
      const char *non_options[10];
Packit 33f14e
      int unrecognized = 0;
Packit 33f14e
      int argc = 0;
Packit 33f14e
      const char *argv[10];
Packit 33f14e
      a_seen = 0;
Packit 33f14e
      b_seen = 0;
Packit 33f14e
Packit 33f14e
      argv[argc++] = "program";
Packit 33f14e
      argv[argc++] = "--p=";
Packit 33f14e
      argv[argc++] = "foo";
Packit 33f14e
      argv[argc++] = "bar";
Packit 33f14e
      argv[argc] = NULL;
Packit 33f14e
      optind = start;
Packit 33f14e
      getopt_long_loop (argc, argv, "p::q::", long_options_optional,
Packit 33f14e
                        &p_value, &q_value,
Packit 33f14e
                        &non_options_count, non_options, &unrecognized);
Packit 33f14e
      ASSERT (a_seen == 0);
Packit 33f14e
      ASSERT (b_seen == 0);
Packit 33f14e
      ASSERT (p_value != NULL && *p_value == '\0');
Packit 33f14e
      ASSERT (q_value == NULL);
Packit 33f14e
      ASSERT (non_options_count == 0);
Packit 33f14e
      ASSERT (unrecognized == 0);
Packit 33f14e
      ASSERT (optind == 2);
Packit 33f14e
    }
Packit 33f14e
  for (start = 0; start <= 1; start++)
Packit 33f14e
    {
Packit 33f14e
      const char *p_value = NULL;
Packit 33f14e
      const char *q_value = NULL;
Packit 33f14e
      int non_options_count = 0;
Packit 33f14e
      const char *non_options[10];
Packit 33f14e
      int unrecognized = 0;
Packit 33f14e
      int argc = 0;
Packit 33f14e
      const char *argv[10];
Packit 33f14e
      a_seen = 0;
Packit 33f14e
      b_seen = 0;
Packit 33f14e
Packit 33f14e
      argv[argc++] = "program";
Packit 33f14e
      argv[argc++] = "--p";
Packit 33f14e
      argv[argc++] = "-a";
Packit 33f14e
      argv[argc++] = "bar";
Packit 33f14e
      argv[argc] = NULL;
Packit 33f14e
      optind = start;
Packit 33f14e
      getopt_long_loop (argc, argv, "abp::q::", long_options_optional,
Packit 33f14e
                        &p_value, &q_value,
Packit 33f14e
                        &non_options_count, non_options, &unrecognized);
Packit 33f14e
      ASSERT (a_seen == 1);
Packit 33f14e
      ASSERT (b_seen == 0);
Packit 33f14e
      ASSERT (p_value == NULL);
Packit 33f14e
      ASSERT (q_value == NULL);
Packit 33f14e
      ASSERT (non_options_count == 0);
Packit 33f14e
      ASSERT (unrecognized == 0);
Packit 33f14e
      ASSERT (optind == 3);
Packit 33f14e
    }
Packit 33f14e
Packit 33f14e
  /* Test processing of long options with optional arguments via -W.  */
Packit 33f14e
  for (start = 0; start <= 1; start++)
Packit 33f14e
    {
Packit 33f14e
      const char *p_value = NULL;
Packit 33f14e
      const char *q_value = NULL;
Packit 33f14e
      int non_options_count = 0;
Packit 33f14e
      const char *non_options[10];
Packit 33f14e
      int unrecognized = 0;
Packit 33f14e
      int argc = 0;
Packit 33f14e
      const char *argv[10];
Packit 33f14e
      a_seen = 0;
Packit 33f14e
      b_seen = 0;
Packit 33f14e
Packit 33f14e
      argv[argc++] = "program";
Packit 33f14e
      argv[argc++] = "-Wp=foo";
Packit 33f14e
      argv[argc++] = "bar";
Packit 33f14e
      argv[argc] = NULL;
Packit 33f14e
      optind = start;
Packit 33f14e
      getopt_long_loop (argc, argv, "p::q::W;", long_options_optional,
Packit 33f14e
                        &p_value, &q_value,
Packit 33f14e
                        &non_options_count, non_options, &unrecognized);
Packit 33f14e
      ASSERT (a_seen == 0);
Packit 33f14e
      ASSERT (b_seen == 0);
Packit 33f14e
      ASSERT (p_value != NULL && strcmp (p_value, "foo") == 0);
Packit 33f14e
      ASSERT (q_value == NULL);
Packit 33f14e
      ASSERT (non_options_count == 0);
Packit 33f14e
      ASSERT (unrecognized == 0);
Packit 33f14e
      ASSERT (optind == 2);
Packit 33f14e
    }
Packit 33f14e
  for (start = 0; start <= 1; start++)
Packit 33f14e
    {
Packit 33f14e
      const char *p_value = NULL;
Packit 33f14e
      const char *q_value = NULL;
Packit 33f14e
      int non_options_count = 0;
Packit 33f14e
      const char *non_options[10];
Packit 33f14e
      int unrecognized = 0;
Packit 33f14e
      int argc = 0;
Packit 33f14e
      const char *argv[10];
Packit 33f14e
      a_seen = 0;
Packit 33f14e
      b_seen = 0;
Packit 33f14e
Packit 33f14e
      argv[argc++] = "program";
Packit 33f14e
      argv[argc++] = "-Wp";
Packit 33f14e
      argv[argc++] = "foo";
Packit 33f14e
      argv[argc++] = "bar";
Packit 33f14e
      argv[argc] = NULL;
Packit 33f14e
      optind = start;
Packit 33f14e
      getopt_long_loop (argc, argv, "p::q::W;", long_options_optional,
Packit 33f14e
                        &p_value, &q_value,
Packit 33f14e
                        &non_options_count, non_options, &unrecognized);
Packit 33f14e
      ASSERT (a_seen == 0);
Packit 33f14e
      ASSERT (b_seen == 0);
Packit 33f14e
      ASSERT (p_value == NULL);
Packit 33f14e
      ASSERT (q_value == NULL);
Packit 33f14e
      ASSERT (non_options_count == 0);
Packit 33f14e
      ASSERT (unrecognized == 0);
Packit 33f14e
      ASSERT (optind == 2);
Packit 33f14e
    }
Packit 33f14e
  for (start = 0; start <= 1; start++)
Packit 33f14e
    {
Packit 33f14e
      const char *p_value = NULL;
Packit 33f14e
      const char *q_value = NULL;
Packit 33f14e
      int non_options_count = 0;
Packit 33f14e
      const char *non_options[10];
Packit 33f14e
      int unrecognized = 0;
Packit 33f14e
      int argc = 0;
Packit 33f14e
      const char *argv[10];
Packit 33f14e
      a_seen = 0;
Packit 33f14e
      b_seen = 0;
Packit 33f14e
Packit 33f14e
      argv[argc++] = "program";
Packit 33f14e
      argv[argc++] = "-Wp=";
Packit 33f14e
      argv[argc++] = "foo";
Packit 33f14e
      argv[argc++] = "bar";
Packit 33f14e
      argv[argc] = NULL;
Packit 33f14e
      optind = start;
Packit 33f14e
      getopt_long_loop (argc, argv, "W;p::q::", long_options_optional,
Packit 33f14e
                        &p_value, &q_value,
Packit 33f14e
                        &non_options_count, non_options, &unrecognized);
Packit 33f14e
      ASSERT (a_seen == 0);
Packit 33f14e
      ASSERT (b_seen == 0);
Packit 33f14e
      ASSERT (p_value != NULL && *p_value == '\0');
Packit 33f14e
      ASSERT (q_value == NULL);
Packit 33f14e
      ASSERT (non_options_count == 0);
Packit 33f14e
      ASSERT (unrecognized == 0);
Packit 33f14e
      ASSERT (optind == 2);
Packit 33f14e
    }
Packit 33f14e
  for (start = 0; start <= 1; start++)
Packit 33f14e
    {
Packit 33f14e
      const char *p_value = NULL;
Packit 33f14e
      const char *q_value = NULL;
Packit 33f14e
      int non_options_count = 0;
Packit 33f14e
      const char *non_options[10];
Packit 33f14e
      int unrecognized = 0;
Packit 33f14e
      int argc = 0;
Packit 33f14e
      const char *argv[10];
Packit 33f14e
      a_seen = 0;
Packit 33f14e
      b_seen = 0;
Packit 33f14e
Packit 33f14e
      argv[argc++] = "program";
Packit 33f14e
      argv[argc++] = "-W";
Packit 33f14e
      argv[argc++] = "p=";
Packit 33f14e
      argv[argc++] = "foo";
Packit 33f14e
      argv[argc++] = "bar";
Packit 33f14e
      argv[argc] = NULL;
Packit 33f14e
      optind = start;
Packit 33f14e
      getopt_long_loop (argc, argv, "W;p::q::", long_options_optional,
Packit 33f14e
                        &p_value, &q_value,
Packit 33f14e
                        &non_options_count, non_options, &unrecognized);
Packit 33f14e
      ASSERT (a_seen == 0);
Packit 33f14e
      ASSERT (b_seen == 0);
Packit 33f14e
      ASSERT (p_value != NULL && *p_value == '\0');
Packit 33f14e
      ASSERT (q_value == NULL);
Packit 33f14e
      ASSERT (non_options_count == 0);
Packit 33f14e
      ASSERT (unrecognized == 0);
Packit 33f14e
      ASSERT (optind == 3);
Packit 33f14e
    }
Packit 33f14e
  for (start = 0; start <= 1; start++)
Packit 33f14e
    {
Packit 33f14e
      const char *p_value = NULL;
Packit 33f14e
      const char *q_value = NULL;
Packit 33f14e
      int non_options_count = 0;
Packit 33f14e
      const char *non_options[10];
Packit 33f14e
      int unrecognized = 0;
Packit 33f14e
      int argc = 0;
Packit 33f14e
      const char *argv[10];
Packit 33f14e
      a_seen = 0;
Packit 33f14e
      b_seen = 0;
Packit 33f14e
Packit 33f14e
      argv[argc++] = "program";
Packit 33f14e
      argv[argc++] = "-W";
Packit 33f14e
      argv[argc++] = "p";
Packit 33f14e
      argv[argc++] = "-a";
Packit 33f14e
      argv[argc++] = "bar";
Packit 33f14e
      argv[argc] = NULL;
Packit 33f14e
      optind = start;
Packit 33f14e
      getopt_long_loop (argc, argv, "W;abp::q::", long_options_optional,
Packit 33f14e
                        &p_value, &q_value,
Packit 33f14e
                        &non_options_count, non_options, &unrecognized);
Packit 33f14e
      ASSERT (a_seen == 1);
Packit 33f14e
      ASSERT (b_seen == 0);
Packit 33f14e
      /* ASSERT (p_value == NULL); */
Packit 33f14e
      ASSERT (q_value == NULL);
Packit 33f14e
      ASSERT (non_options_count == 0);
Packit 33f14e
      ASSERT (unrecognized == 0);
Packit 33f14e
      ASSERT (optind == 4);
Packit 33f14e
    }
Packit 33f14e
Packit 33f14e
  /* Check that invalid options are recognized.  */
Packit 33f14e
  for (start = 0; start <= 1; start++)
Packit 33f14e
    {
Packit 33f14e
      const char *p_value = NULL;
Packit 33f14e
      const char *q_value = NULL;
Packit 33f14e
      int non_options_count = 0;
Packit 33f14e
      const char *non_options[10];
Packit 33f14e
      int unrecognized = 0;
Packit 33f14e
      int argc = 0;
Packit 33f14e
      const char *argv[10];
Packit 33f14e
      a_seen = 0;
Packit 33f14e
      b_seen = 0;
Packit 33f14e
Packit 33f14e
      argv[argc++] = "program";
Packit 33f14e
      argv[argc++] = "-p";
Packit 33f14e
      argv[argc++] = "foo";
Packit 33f14e
      argv[argc++] = "-x";
Packit 33f14e
      argv[argc++] = "-a";
Packit 33f14e
      argv[argc++] = "bar";
Packit 33f14e
      argv[argc] = NULL;
Packit 33f14e
      optind = start;
Packit 33f14e
      getopt_long_loop (argc, argv, "abp:q:", long_options_required,
Packit 33f14e
                        &p_value, &q_value,
Packit 33f14e
                        &non_options_count, non_options, &unrecognized);
Packit 33f14e
      ASSERT (a_seen == 1);
Packit 33f14e
      ASSERT (b_seen == 0);
Packit 33f14e
      ASSERT (p_value != NULL && strcmp (p_value, "foo") == 0);
Packit 33f14e
      ASSERT (q_value == NULL);
Packit 33f14e
      ASSERT (non_options_count == 0);
Packit 33f14e
      ASSERT (unrecognized == 'x');
Packit 33f14e
      ASSERT (optind == 5);
Packit 33f14e
    }
Packit 33f14e
  for (start = 0; start <= 1; start++)
Packit 33f14e
    {
Packit 33f14e
      const char *p_value = NULL;
Packit 33f14e
      const char *q_value = NULL;
Packit 33f14e
      int non_options_count = 0;
Packit 33f14e
      const char *non_options[10];
Packit 33f14e
      int unrecognized = 0;
Packit 33f14e
      int argc = 0;
Packit 33f14e
      const char *argv[10];
Packit 33f14e
      a_seen = 0;
Packit 33f14e
      b_seen = 0;
Packit 33f14e
Packit 33f14e
      argv[argc++] = "program";
Packit 33f14e
      argv[argc++] = "-p";
Packit 33f14e
      argv[argc++] = "foo";
Packit 33f14e
      argv[argc++] = "-:";
Packit 33f14e
      argv[argc++] = "-a";
Packit 33f14e
      argv[argc++] = "bar";
Packit 33f14e
      argv[argc] = NULL;
Packit 33f14e
      optind = start;
Packit 33f14e
      getopt_long_loop (argc, argv, "abp:q:", long_options_required,
Packit 33f14e
                        &p_value, &q_value,
Packit 33f14e
                        &non_options_count, non_options, &unrecognized);
Packit 33f14e
      ASSERT (a_seen == 1);
Packit 33f14e
      ASSERT (b_seen == 0);
Packit 33f14e
      ASSERT (p_value != NULL && strcmp (p_value, "foo") == 0);
Packit 33f14e
      ASSERT (q_value == NULL);
Packit 33f14e
      ASSERT (non_options_count == 0);
Packit 33f14e
      ASSERT (unrecognized == ':');
Packit 33f14e
      ASSERT (optind == 5);
Packit 33f14e
    }
Packit 33f14e
Packit 33f14e
  /* Check that unexpected arguments are recognized.  */
Packit 33f14e
  for (start = 0; start <= 1; start++)
Packit 33f14e
    {
Packit 33f14e
      const char *p_value = NULL;
Packit 33f14e
      const char *q_value = NULL;
Packit 33f14e
      int non_options_count = 0;
Packit 33f14e
      const char *non_options[10];
Packit 33f14e
      int unrecognized = 0;
Packit 33f14e
      int argc = 0;
Packit 33f14e
      const char *argv[10];
Packit 33f14e
      a_seen = 0;
Packit 33f14e
      b_seen = 0;
Packit 33f14e
Packit 33f14e
      argv[argc++] = "program";
Packit 33f14e
      argv[argc++] = "-p";
Packit 33f14e
      argv[argc++] = "foo";
Packit 33f14e
      argv[argc++] = "--a=";
Packit 33f14e
      argv[argc++] = "bar";
Packit 33f14e
      argv[argc] = NULL;
Packit 33f14e
      optind = start;
Packit 33f14e
      getopt_long_loop (argc, argv, "abp:q:", long_options_required,
Packit 33f14e
                        &p_value, &q_value,
Packit 33f14e
                        &non_options_count, non_options, &unrecognized);
Packit 33f14e
      ASSERT (a_seen == 0);
Packit 33f14e
      ASSERT (b_seen == 0);
Packit 33f14e
      ASSERT (p_value != NULL && strcmp (p_value, "foo") == 0);
Packit 33f14e
      ASSERT (q_value == NULL);
Packit 33f14e
      ASSERT (non_options_count == 0);
Packit 33f14e
      ASSERT (unrecognized == 'a');
Packit 33f14e
      ASSERT (optind == 4);
Packit 33f14e
    }
Packit 33f14e
  for (start = 0; start <= 1; start++)
Packit 33f14e
    {
Packit 33f14e
      const char *p_value = NULL;
Packit 33f14e
      const char *q_value = NULL;
Packit 33f14e
      int non_options_count = 0;
Packit 33f14e
      const char *non_options[10];
Packit 33f14e
      int unrecognized = 0;
Packit 33f14e
      int argc = 0;
Packit 33f14e
      const char *argv[10];
Packit 33f14e
      a_seen = 0;
Packit 33f14e
      b_seen = 0;
Packit 33f14e
Packit 33f14e
      argv[argc++] = "program";
Packit 33f14e
      argv[argc++] = "-p";
Packit 33f14e
      argv[argc++] = "foo";
Packit 33f14e
      argv[argc++] = "--b=";
Packit 33f14e
      argv[argc++] = "bar";
Packit 33f14e
      argv[argc] = NULL;
Packit 33f14e
      optind = start;
Packit 33f14e
      getopt_long_loop (argc, argv, "abp:q:", long_options_required,
Packit 33f14e
                        &p_value, &q_value,
Packit 33f14e
                        &non_options_count, non_options, &unrecognized);
Packit 33f14e
      ASSERT (a_seen == 0);
Packit 33f14e
      ASSERT (b_seen == 0);
Packit 33f14e
      ASSERT (p_value != NULL && strcmp (p_value, "foo") == 0);
Packit 33f14e
      ASSERT (q_value == NULL);
Packit 33f14e
      ASSERT (non_options_count == 0);
Packit 33f14e
      /* When flag is non-zero, glibc sets optopt anyway, but BSD
Packit 33f14e
         leaves optopt unchanged.  */
Packit 33f14e
      ASSERT (unrecognized == 1 || unrecognized == 0);
Packit 33f14e
      ASSERT (optind == 4);
Packit 33f14e
    }
Packit 33f14e
Packit 33f14e
  /* Check that by default, non-options arguments are moved to the end.  */
Packit 33f14e
  for (start = 0; start <= 1; start++)
Packit 33f14e
    {
Packit 33f14e
      const char *p_value = NULL;
Packit 33f14e
      const char *q_value = NULL;
Packit 33f14e
      int non_options_count = 0;
Packit 33f14e
      const char *non_options[10];
Packit 33f14e
      int unrecognized = 0;
Packit 33f14e
      int argc = 0;
Packit 33f14e
      const char *argv[10];
Packit 33f14e
      a_seen = 0;
Packit 33f14e
      b_seen = 0;
Packit 33f14e
Packit 33f14e
      argv[argc++] = "program";
Packit 33f14e
      argv[argc++] = "donald";
Packit 33f14e
      argv[argc++] = "-p";
Packit 33f14e
      argv[argc++] = "billy";
Packit 33f14e
      argv[argc++] = "duck";
Packit 33f14e
      argv[argc++] = "-a";
Packit 33f14e
      argv[argc++] = "bar";
Packit 33f14e
      argv[argc] = NULL;
Packit 33f14e
      optind = start;
Packit 33f14e
      getopt_long_loop (argc, argv, "abp:q:", long_options_required,
Packit 33f14e
                        &p_value, &q_value,
Packit 33f14e
                        &non_options_count, non_options, &unrecognized);
Packit 33f14e
      ASSERT (strcmp (argv[0], "program") == 0);
Packit 33f14e
      ASSERT (strcmp (argv[1], "-p") == 0);
Packit 33f14e
      ASSERT (strcmp (argv[2], "billy") == 0);
Packit 33f14e
      ASSERT (strcmp (argv[3], "-a") == 0);
Packit 33f14e
      ASSERT (strcmp (argv[4], "donald") == 0);
Packit 33f14e
      ASSERT (strcmp (argv[5], "duck") == 0);
Packit 33f14e
      ASSERT (strcmp (argv[6], "bar") == 0);
Packit 33f14e
      ASSERT (argv[7] == NULL);
Packit 33f14e
      ASSERT (a_seen == 1);
Packit 33f14e
      ASSERT (b_seen == 0);
Packit 33f14e
      ASSERT (p_value != NULL && strcmp (p_value, "billy") == 0);
Packit 33f14e
      ASSERT (q_value == NULL);
Packit 33f14e
      ASSERT (non_options_count == 0);
Packit 33f14e
      ASSERT (unrecognized == 0);
Packit 33f14e
      ASSERT (optind == 4);
Packit 33f14e
    }
Packit 33f14e
Packit 33f14e
  /* Check that '--' ends the argument processing.  */
Packit 33f14e
  for (start = 0; start <= 1; start++)
Packit 33f14e
    {
Packit 33f14e
      const char *p_value = NULL;
Packit 33f14e
      const char *q_value = NULL;
Packit 33f14e
      int non_options_count = 0;
Packit 33f14e
      const char *non_options[10];
Packit 33f14e
      int unrecognized = 0;
Packit 33f14e
      int argc = 0;
Packit 33f14e
      const char *argv[20];
Packit 33f14e
      a_seen = 0;
Packit 33f14e
      b_seen = 0;
Packit 33f14e
Packit 33f14e
      argv[argc++] = "program";
Packit 33f14e
      argv[argc++] = "donald";
Packit 33f14e
      argv[argc++] = "-p";
Packit 33f14e
      argv[argc++] = "billy";
Packit 33f14e
      argv[argc++] = "duck";
Packit 33f14e
      argv[argc++] = "-a";
Packit 33f14e
      argv[argc++] = "--";
Packit 33f14e
      argv[argc++] = "-b";
Packit 33f14e
      argv[argc++] = "foo";
Packit 33f14e
      argv[argc++] = "-q";
Packit 33f14e
      argv[argc++] = "johnny";
Packit 33f14e
      argv[argc++] = "bar";
Packit 33f14e
      argv[argc] = NULL;
Packit 33f14e
      optind = start;
Packit 33f14e
      getopt_long_loop (argc, argv, "abp:q:", long_options_required,
Packit 33f14e
                        &p_value, &q_value,
Packit 33f14e
                        &non_options_count, non_options, &unrecognized);
Packit 33f14e
      ASSERT (strcmp (argv[0], "program") == 0);
Packit 33f14e
      ASSERT (strcmp (argv[1], "-p") == 0);
Packit 33f14e
      ASSERT (strcmp (argv[2], "billy") == 0);
Packit 33f14e
      ASSERT (strcmp (argv[3], "-a") == 0);
Packit 33f14e
      ASSERT (strcmp (argv[4], "--") == 0);
Packit 33f14e
      ASSERT (strcmp (argv[5], "donald") == 0);
Packit 33f14e
      ASSERT (strcmp (argv[6], "duck") == 0);
Packit 33f14e
      ASSERT (strcmp (argv[7], "-b") == 0);
Packit 33f14e
      ASSERT (strcmp (argv[8], "foo") == 0);
Packit 33f14e
      ASSERT (strcmp (argv[9], "-q") == 0);
Packit 33f14e
      ASSERT (strcmp (argv[10], "johnny") == 0);
Packit 33f14e
      ASSERT (strcmp (argv[11], "bar") == 0);
Packit 33f14e
      ASSERT (argv[12] == NULL);
Packit 33f14e
      ASSERT (a_seen == 1);
Packit 33f14e
      ASSERT (b_seen == 0);
Packit 33f14e
      ASSERT (p_value != NULL && strcmp (p_value, "billy") == 0);
Packit 33f14e
      ASSERT (q_value == NULL);
Packit 33f14e
      ASSERT (non_options_count == 0);
Packit 33f14e
      ASSERT (unrecognized == 0);
Packit 33f14e
      ASSERT (optind == 5);
Packit 33f14e
    }
Packit 33f14e
Packit 33f14e
  /* Check that the '-' flag causes non-options to be returned in order.  */
Packit 33f14e
  for (start = 0; start <= 1; start++)
Packit 33f14e
    {
Packit 33f14e
      const char *p_value = NULL;
Packit 33f14e
      const char *q_value = NULL;
Packit 33f14e
      int non_options_count = 0;
Packit 33f14e
      const char *non_options[10];
Packit 33f14e
      int unrecognized = 0;
Packit 33f14e
      int argc = 0;
Packit 33f14e
      const char *argv[10];
Packit 33f14e
      a_seen = 0;
Packit 33f14e
      b_seen = 0;
Packit 33f14e
Packit 33f14e
      argv[argc++] = "program";
Packit 33f14e
      argv[argc++] = "donald";
Packit 33f14e
      argv[argc++] = "-p";
Packit 33f14e
      argv[argc++] = "billy";
Packit 33f14e
      argv[argc++] = "duck";
Packit 33f14e
      argv[argc++] = "-a";
Packit 33f14e
      argv[argc++] = "bar";
Packit 33f14e
      argv[argc] = NULL;
Packit 33f14e
      optind = start;
Packit 33f14e
      getopt_long_loop (argc, argv, "-abp:q:", long_options_required,
Packit 33f14e
                        &p_value, &q_value,
Packit 33f14e
                        &non_options_count, non_options, &unrecognized);
Packit 33f14e
      ASSERT (strcmp (argv[0], "program") == 0);
Packit 33f14e
      ASSERT (strcmp (argv[1], "donald") == 0);
Packit 33f14e
      ASSERT (strcmp (argv[2], "-p") == 0);
Packit 33f14e
      ASSERT (strcmp (argv[3], "billy") == 0);
Packit 33f14e
      ASSERT (strcmp (argv[4], "duck") == 0);
Packit 33f14e
      ASSERT (strcmp (argv[5], "-a") == 0);
Packit 33f14e
      ASSERT (strcmp (argv[6], "bar") == 0);
Packit 33f14e
      ASSERT (argv[7] == NULL);
Packit 33f14e
      ASSERT (a_seen == 1);
Packit 33f14e
      ASSERT (b_seen == 0);
Packit 33f14e
      ASSERT (p_value != NULL && strcmp (p_value, "billy") == 0);
Packit 33f14e
      ASSERT (q_value == NULL);
Packit 33f14e
      ASSERT (non_options_count == 3);
Packit 33f14e
      ASSERT (strcmp (non_options[0], "donald") == 0);
Packit 33f14e
      ASSERT (strcmp (non_options[1], "duck") == 0);
Packit 33f14e
      ASSERT (strcmp (non_options[2], "bar") == 0);
Packit 33f14e
      ASSERT (unrecognized == 0);
Packit 33f14e
      ASSERT (optind == 7);
Packit 33f14e
    }
Packit 33f14e
Packit 33f14e
  /* Check that '--' ends the argument processing.  */
Packit 33f14e
  for (start = 0; start <= 1; start++)
Packit 33f14e
    {
Packit 33f14e
      const char *p_value = NULL;
Packit 33f14e
      const char *q_value = NULL;
Packit 33f14e
      int non_options_count = 0;
Packit 33f14e
      const char *non_options[10];
Packit 33f14e
      int unrecognized = 0;
Packit 33f14e
      int argc = 0;
Packit 33f14e
      const char *argv[20];
Packit 33f14e
      a_seen = 0;
Packit 33f14e
      b_seen = 0;
Packit 33f14e
Packit 33f14e
      argv[argc++] = "program";
Packit 33f14e
      argv[argc++] = "donald";
Packit 33f14e
      argv[argc++] = "-p";
Packit 33f14e
      argv[argc++] = "billy";
Packit 33f14e
      argv[argc++] = "duck";
Packit 33f14e
      argv[argc++] = "-a";
Packit 33f14e
      argv[argc++] = "--";
Packit 33f14e
      argv[argc++] = "-b";
Packit 33f14e
      argv[argc++] = "foo";
Packit 33f14e
      argv[argc++] = "-q";
Packit 33f14e
      argv[argc++] = "johnny";
Packit 33f14e
      argv[argc++] = "bar";
Packit 33f14e
      argv[argc] = NULL;
Packit 33f14e
      optind = start;
Packit 33f14e
      getopt_long_loop (argc, argv, "-abp:q:", long_options_required,
Packit 33f14e
                        &p_value, &q_value,
Packit 33f14e
                        &non_options_count, non_options, &unrecognized);
Packit 33f14e
      ASSERT (strcmp (argv[0], "program") == 0);
Packit 33f14e
      ASSERT (strcmp (argv[1], "donald") == 0);
Packit 33f14e
      ASSERT (strcmp (argv[2], "-p") == 0);
Packit 33f14e
      ASSERT (strcmp (argv[3], "billy") == 0);
Packit 33f14e
      ASSERT (strcmp (argv[4], "duck") == 0);
Packit 33f14e
      ASSERT (strcmp (argv[5], "-a") == 0);
Packit 33f14e
      ASSERT (strcmp (argv[6], "--") == 0);
Packit 33f14e
      ASSERT (strcmp (argv[7], "-b") == 0);
Packit 33f14e
      ASSERT (strcmp (argv[8], "foo") == 0);
Packit 33f14e
      ASSERT (strcmp (argv[9], "-q") == 0);
Packit 33f14e
      ASSERT (strcmp (argv[10], "johnny") == 0);
Packit 33f14e
      ASSERT (strcmp (argv[11], "bar") == 0);
Packit 33f14e
      ASSERT (argv[12] == NULL);
Packit 33f14e
      ASSERT (a_seen == 1);
Packit 33f14e
      ASSERT (b_seen == 0);
Packit 33f14e
      ASSERT (p_value != NULL && strcmp (p_value, "billy") == 0);
Packit 33f14e
      ASSERT (q_value == NULL);
Packit 33f14e
      if (non_options_count == 2)
Packit 33f14e
      {
Packit 33f14e
        /* glibc behaviour.  */
Packit 33f14e
        ASSERT (non_options_count == 2);
Packit 33f14e
        ASSERT (strcmp (non_options[0], "donald") == 0);
Packit 33f14e
        ASSERT (strcmp (non_options[1], "duck") == 0);
Packit 33f14e
        ASSERT (unrecognized == 0);
Packit 33f14e
        ASSERT (optind == 7);
Packit 33f14e
      }
Packit 33f14e
      else
Packit 33f14e
      {
Packit 33f14e
        /* Another valid behaviour.  */
Packit 33f14e
        ASSERT (non_options_count == 7);
Packit 33f14e
        ASSERT (strcmp (non_options[0], "donald") == 0);
Packit 33f14e
        ASSERT (strcmp (non_options[1], "duck") == 0);
Packit 33f14e
        ASSERT (strcmp (non_options[2], "-b") == 0);
Packit 33f14e
        ASSERT (strcmp (non_options[3], "foo") == 0);
Packit 33f14e
        ASSERT (strcmp (non_options[4], "-q") == 0);
Packit 33f14e
        ASSERT (strcmp (non_options[5], "johnny") == 0);
Packit 33f14e
        ASSERT (strcmp (non_options[6], "bar") == 0);
Packit 33f14e
        ASSERT (unrecognized == 0);
Packit 33f14e
        ASSERT (optind == 12);
Packit 33f14e
      }
Packit 33f14e
    }
Packit 33f14e
Packit 33f14e
  /* Check that the '-' flag has to come first.  */
Packit 33f14e
  for (start = 0; start <= 1; start++)
Packit 33f14e
    {
Packit 33f14e
      const char *p_value = NULL;
Packit 33f14e
      const char *q_value = NULL;
Packit 33f14e
      int non_options_count = 0;
Packit 33f14e
      const char *non_options[10];
Packit 33f14e
      int unrecognized = 0;
Packit 33f14e
      int argc = 0;
Packit 33f14e
      const char *argv[10];
Packit 33f14e
      a_seen = 0;
Packit 33f14e
      b_seen = 0;
Packit 33f14e
Packit 33f14e
      argv[argc++] = "program";
Packit 33f14e
      argv[argc++] = "donald";
Packit 33f14e
      argv[argc++] = "-p";
Packit 33f14e
      argv[argc++] = "billy";
Packit 33f14e
      argv[argc++] = "duck";
Packit 33f14e
      argv[argc++] = "-a";
Packit 33f14e
      argv[argc++] = "bar";
Packit 33f14e
      argv[argc] = NULL;
Packit 33f14e
      optind = start;
Packit 33f14e
      getopt_long_loop (argc, argv, "abp:q:-", long_options_required,
Packit 33f14e
                        &p_value, &q_value,
Packit 33f14e
                        &non_options_count, non_options, &unrecognized);
Packit 33f14e
      ASSERT (strcmp (argv[0], "program") == 0);
Packit 33f14e
      ASSERT (strcmp (argv[1], "-p") == 0);
Packit 33f14e
      ASSERT (strcmp (argv[2], "billy") == 0);
Packit 33f14e
      ASSERT (strcmp (argv[3], "-a") == 0);
Packit 33f14e
      ASSERT (strcmp (argv[4], "donald") == 0);
Packit 33f14e
      ASSERT (strcmp (argv[5], "duck") == 0);
Packit 33f14e
      ASSERT (strcmp (argv[6], "bar") == 0);
Packit 33f14e
      ASSERT (argv[7] == NULL);
Packit 33f14e
      ASSERT (a_seen == 1);
Packit 33f14e
      ASSERT (b_seen == 0);
Packit 33f14e
      ASSERT (p_value != NULL && strcmp (p_value, "billy") == 0);
Packit 33f14e
      ASSERT (q_value == NULL);
Packit 33f14e
      ASSERT (non_options_count == 0);
Packit 33f14e
      ASSERT (unrecognized == 0);
Packit 33f14e
      ASSERT (optind == 4);
Packit 33f14e
    }
Packit 33f14e
Packit 33f14e
  /* Check that the '+' flag causes the first non-option to terminate the
Packit 33f14e
     loop.  */
Packit 33f14e
  for (start = 0; start <= 1; start++)
Packit 33f14e
    {
Packit 33f14e
      const char *p_value = NULL;
Packit 33f14e
      const char *q_value = NULL;
Packit 33f14e
      int non_options_count = 0;
Packit 33f14e
      const char *non_options[10];
Packit 33f14e
      int unrecognized = 0;
Packit 33f14e
      int argc = 0;
Packit 33f14e
      const char *argv[10];
Packit 33f14e
      a_seen = 0;
Packit 33f14e
      b_seen = 0;
Packit 33f14e
Packit 33f14e
      argv[argc++] = "program";
Packit 33f14e
      argv[argc++] = "donald";
Packit 33f14e
      argv[argc++] = "-p";
Packit 33f14e
      argv[argc++] = "billy";
Packit 33f14e
      argv[argc++] = "duck";
Packit 33f14e
      argv[argc++] = "-a";
Packit 33f14e
      argv[argc++] = "bar";
Packit 33f14e
      argv[argc] = NULL;
Packit 33f14e
      optind = start;
Packit 33f14e
      getopt_long_loop (argc, argv, "+abp:q:", long_options_required,
Packit 33f14e
                        &p_value, &q_value,
Packit 33f14e
                        &non_options_count, non_options, &unrecognized);
Packit 33f14e
      ASSERT (strcmp (argv[0], "program") == 0);
Packit 33f14e
      ASSERT (strcmp (argv[1], "donald") == 0);
Packit 33f14e
      ASSERT (strcmp (argv[2], "-p") == 0);
Packit 33f14e
      ASSERT (strcmp (argv[3], "billy") == 0);
Packit 33f14e
      ASSERT (strcmp (argv[4], "duck") == 0);
Packit 33f14e
      ASSERT (strcmp (argv[5], "-a") == 0);
Packit 33f14e
      ASSERT (strcmp (argv[6], "bar") == 0);
Packit 33f14e
      ASSERT (argv[7] == NULL);
Packit 33f14e
      ASSERT (a_seen == 0);
Packit 33f14e
      ASSERT (b_seen == 0);
Packit 33f14e
      ASSERT (p_value == NULL);
Packit 33f14e
      ASSERT (q_value == NULL);
Packit 33f14e
      ASSERT (non_options_count == 0);
Packit 33f14e
      ASSERT (unrecognized == 0);
Packit 33f14e
      ASSERT (optind == 1);
Packit 33f14e
    }
Packit 33f14e
  for (start = 0; start <= 1; start++)
Packit 33f14e
    {
Packit 33f14e
      const char *p_value = NULL;
Packit 33f14e
      const char *q_value = NULL;
Packit 33f14e
      int non_options_count = 0;
Packit 33f14e
      const char *non_options[10];
Packit 33f14e
      int unrecognized = 0;
Packit 33f14e
      int argc = 0;
Packit 33f14e
      const char *argv[10];
Packit 33f14e
      a_seen = 0;
Packit 33f14e
      b_seen = 0;
Packit 33f14e
Packit 33f14e
      argv[argc++] = "program";
Packit 33f14e
      argv[argc++] = "-+";
Packit 33f14e
      argv[argc] = NULL;
Packit 33f14e
      optind = start;
Packit 33f14e
      getopt_long_loop (argc, argv, "+abp:q:", long_options_required,
Packit 33f14e
                        &p_value, &q_value,
Packit 33f14e
                        &non_options_count, non_options, &unrecognized);
Packit 33f14e
      ASSERT (a_seen == 0);
Packit 33f14e
      ASSERT (b_seen == 0);
Packit 33f14e
      ASSERT (p_value == NULL);
Packit 33f14e
      ASSERT (q_value == NULL);
Packit 33f14e
      ASSERT (non_options_count == 0);
Packit 33f14e
      ASSERT (unrecognized == '+');
Packit 33f14e
      ASSERT (optind == 2);
Packit 33f14e
    }
Packit 33f14e
Packit 33f14e
  /* Check that '--' ends the argument processing.  */
Packit 33f14e
  for (start = 0; start <= 1; start++)
Packit 33f14e
    {
Packit 33f14e
      const char *p_value = NULL;
Packit 33f14e
      const char *q_value = NULL;
Packit 33f14e
      int non_options_count = 0;
Packit 33f14e
      const char *non_options[10];
Packit 33f14e
      int unrecognized = 0;
Packit 33f14e
      int argc = 0;
Packit 33f14e
      const char *argv[20];
Packit 33f14e
      a_seen = 0;
Packit 33f14e
      b_seen = 0;
Packit 33f14e
Packit 33f14e
      argv[argc++] = "program";
Packit 33f14e
      argv[argc++] = "donald";
Packit 33f14e
      argv[argc++] = "-p";
Packit 33f14e
      argv[argc++] = "billy";
Packit 33f14e
      argv[argc++] = "duck";
Packit 33f14e
      argv[argc++] = "-a";
Packit 33f14e
      argv[argc++] = "--";
Packit 33f14e
      argv[argc++] = "-b";
Packit 33f14e
      argv[argc++] = "foo";
Packit 33f14e
      argv[argc++] = "-q";
Packit 33f14e
      argv[argc++] = "johnny";
Packit 33f14e
      argv[argc++] = "bar";
Packit 33f14e
      argv[argc] = NULL;
Packit 33f14e
      optind = start;
Packit 33f14e
      getopt_long_loop (argc, argv, "+abp:q:", long_options_required,
Packit 33f14e
                        &p_value, &q_value,
Packit 33f14e
                        &non_options_count, non_options, &unrecognized);
Packit 33f14e
      ASSERT (strcmp (argv[0], "program") == 0);
Packit 33f14e
      ASSERT (strcmp (argv[1], "donald") == 0);
Packit 33f14e
      ASSERT (strcmp (argv[2], "-p") == 0);
Packit 33f14e
      ASSERT (strcmp (argv[3], "billy") == 0);
Packit 33f14e
      ASSERT (strcmp (argv[4], "duck") == 0);
Packit 33f14e
      ASSERT (strcmp (argv[5], "-a") == 0);
Packit 33f14e
      ASSERT (strcmp (argv[6], "--") == 0);
Packit 33f14e
      ASSERT (strcmp (argv[7], "-b") == 0);
Packit 33f14e
      ASSERT (strcmp (argv[8], "foo") == 0);
Packit 33f14e
      ASSERT (strcmp (argv[9], "-q") == 0);
Packit 33f14e
      ASSERT (strcmp (argv[10], "johnny") == 0);
Packit 33f14e
      ASSERT (strcmp (argv[11], "bar") == 0);
Packit 33f14e
      ASSERT (argv[12] == NULL);
Packit 33f14e
      ASSERT (a_seen == 0);
Packit 33f14e
      ASSERT (b_seen == 0);
Packit 33f14e
      ASSERT (p_value == NULL);
Packit 33f14e
      ASSERT (q_value == NULL);
Packit 33f14e
      ASSERT (non_options_count == 0);
Packit 33f14e
      ASSERT (unrecognized == 0);
Packit 33f14e
      ASSERT (optind == 1);
Packit 33f14e
    }
Packit 33f14e
Packit 33f14e
  /* Check that the '+' flag has to come first.  */
Packit 33f14e
  for (start = 0; start <= 1; start++)
Packit 33f14e
    {
Packit 33f14e
      const char *p_value = NULL;
Packit 33f14e
      const char *q_value = NULL;
Packit 33f14e
      int non_options_count = 0;
Packit 33f14e
      const char *non_options[10];
Packit 33f14e
      int unrecognized = 0;
Packit 33f14e
      int argc = 0;
Packit 33f14e
      const char *argv[10];
Packit 33f14e
      a_seen = 0;
Packit 33f14e
      b_seen = 0;
Packit 33f14e
Packit 33f14e
      argv[argc++] = "program";
Packit 33f14e
      argv[argc++] = "donald";
Packit 33f14e
      argv[argc++] = "-p";
Packit 33f14e
      argv[argc++] = "billy";
Packit 33f14e
      argv[argc++] = "duck";
Packit 33f14e
      argv[argc++] = "-a";
Packit 33f14e
      argv[argc++] = "bar";
Packit 33f14e
      argv[argc] = NULL;
Packit 33f14e
      optind = start;
Packit 33f14e
      getopt_long_loop (argc, argv, "abp:q:+", long_options_required,
Packit 33f14e
                        &p_value, &q_value,
Packit 33f14e
                        &non_options_count, non_options, &unrecognized);
Packit 33f14e
      ASSERT (strcmp (argv[0], "program") == 0);
Packit 33f14e
      ASSERT (strcmp (argv[1], "-p") == 0);
Packit 33f14e
      ASSERT (strcmp (argv[2], "billy") == 0);
Packit 33f14e
      ASSERT (strcmp (argv[3], "-a") == 0);
Packit 33f14e
      ASSERT (strcmp (argv[4], "donald") == 0);
Packit 33f14e
      ASSERT (strcmp (argv[5], "duck") == 0);
Packit 33f14e
      ASSERT (strcmp (argv[6], "bar") == 0);
Packit 33f14e
      ASSERT (argv[7] == NULL);
Packit 33f14e
      ASSERT (a_seen == 1);
Packit 33f14e
      ASSERT (b_seen == 0);
Packit 33f14e
      ASSERT (p_value != NULL && strcmp (p_value, "billy") == 0);
Packit 33f14e
      ASSERT (q_value == NULL);
Packit 33f14e
      ASSERT (non_options_count == 0);
Packit 33f14e
      ASSERT (unrecognized == 0);
Packit 33f14e
      ASSERT (optind == 4);
Packit 33f14e
    }
Packit 33f14e
}
Packit 33f14e
Packit 33f14e
/* Test behavior of getopt_long when POSIXLY_CORRECT is set in the
Packit 33f14e
   environment.  Options with optional arguments should not change
Packit 33f14e
   behavior just because of an environment variable.
Packit 33f14e
   http://lists.gnu.org/archive/html/bug-m4/2006-09/msg00028.html  */
Packit 33f14e
static void
Packit 33f14e
test_getopt_long_posix (void)
Packit 33f14e
{
Packit 33f14e
  int start;
Packit 33f14e
Packit 33f14e
  /* Check that POSIXLY_CORRECT stops parsing the same as leading '+'.  */
Packit 33f14e
  for (start = 0; start <= 1; start++)
Packit 33f14e
    {
Packit 33f14e
      const char *p_value = NULL;
Packit 33f14e
      const char *q_value = NULL;
Packit 33f14e
      int non_options_count = 0;
Packit 33f14e
      const char *non_options[10];
Packit 33f14e
      int unrecognized = 0;
Packit 33f14e
      int argc = 0;
Packit 33f14e
      const char *argv[10];
Packit 33f14e
      a_seen = 0;
Packit 33f14e
      b_seen = 0;
Packit 33f14e
Packit 33f14e
      argv[argc++] = "program";
Packit 33f14e
      argv[argc++] = "donald";
Packit 33f14e
      argv[argc++] = "-p";
Packit 33f14e
      argv[argc++] = "billy";
Packit 33f14e
      argv[argc++] = "duck";
Packit 33f14e
      argv[argc++] = "-a";
Packit 33f14e
      argv[argc++] = "bar";
Packit 33f14e
      argv[argc] = NULL;
Packit 33f14e
      optind = start;
Packit 33f14e
      getopt_long_loop (argc, argv, "abp:q:", long_options_required,
Packit 33f14e
                        &p_value, &q_value,
Packit 33f14e
                        &non_options_count, non_options, &unrecognized);
Packit 33f14e
      ASSERT (strcmp (argv[0], "program") == 0);
Packit 33f14e
      ASSERT (strcmp (argv[1], "donald") == 0);
Packit 33f14e
      ASSERT (strcmp (argv[2], "-p") == 0);
Packit 33f14e
      ASSERT (strcmp (argv[3], "billy") == 0);
Packit 33f14e
      ASSERT (strcmp (argv[4], "duck") == 0);
Packit 33f14e
      ASSERT (strcmp (argv[5], "-a") == 0);
Packit 33f14e
      ASSERT (strcmp (argv[6], "bar") == 0);
Packit 33f14e
      ASSERT (argv[7] == NULL);
Packit 33f14e
      ASSERT (a_seen == 0);
Packit 33f14e
      ASSERT (b_seen == 0);
Packit 33f14e
      ASSERT (p_value == NULL);
Packit 33f14e
      ASSERT (q_value == NULL);
Packit 33f14e
      ASSERT (non_options_count == 0);
Packit 33f14e
      ASSERT (unrecognized == 0);
Packit 33f14e
      ASSERT (optind == 1);
Packit 33f14e
    }
Packit 33f14e
Packit 33f14e
  /* Check that POSIXLY_CORRECT doesn't change optional arguments.  */
Packit 33f14e
  for (start = 0; start <= 1; start++)
Packit 33f14e
    {
Packit 33f14e
      const char *p_value = NULL;
Packit 33f14e
      const char *q_value = NULL;
Packit 33f14e
      int non_options_count = 0;
Packit 33f14e
      const char *non_options[10];
Packit 33f14e
      int unrecognized = 0;
Packit 33f14e
      int argc = 0;
Packit 33f14e
      const char *argv[10];
Packit 33f14e
      a_seen = 0;
Packit 33f14e
      b_seen = 0;
Packit 33f14e
Packit 33f14e
      argv[argc++] = "program";
Packit 33f14e
      argv[argc++] = "-p";
Packit 33f14e
      argv[argc++] = "billy";
Packit 33f14e
      argv[argc] = NULL;
Packit 33f14e
      optind = start;
Packit 33f14e
      getopt_long_loop (argc, argv, "p::", long_options_required,
Packit 33f14e
                        &p_value, &q_value,
Packit 33f14e
                        &non_options_count, non_options, &unrecognized);
Packit 33f14e
      ASSERT (a_seen == 0);
Packit 33f14e
      ASSERT (b_seen == 0);
Packit 33f14e
      ASSERT (p_value == NULL);
Packit 33f14e
      ASSERT (q_value == NULL);
Packit 33f14e
      ASSERT (non_options_count == 0);
Packit 33f14e
      ASSERT (unrecognized == 0);
Packit 33f14e
      ASSERT (optind == 2);
Packit 33f14e
    }
Packit 33f14e
Packit 33f14e
  /* Check that leading - still sees options after non-options.  */
Packit 33f14e
  for (start = 0; start <= 1; start++)
Packit 33f14e
    {
Packit 33f14e
      const char *p_value = NULL;
Packit 33f14e
      const char *q_value = NULL;
Packit 33f14e
      int non_options_count = 0;
Packit 33f14e
      const char *non_options[10];
Packit 33f14e
      int unrecognized = 0;
Packit 33f14e
      int argc = 0;
Packit 33f14e
      const char *argv[10];
Packit 33f14e
      a_seen = 0;
Packit 33f14e
      b_seen = 0;
Packit 33f14e
Packit 33f14e
      argv[argc++] = "program";
Packit 33f14e
      argv[argc++] = "-a";
Packit 33f14e
      argv[argc++] = "billy";
Packit 33f14e
      argv[argc++] = "-b";
Packit 33f14e
      argv[argc] = NULL;
Packit 33f14e
      optind = start;
Packit 33f14e
      getopt_long_loop (argc, argv, "-ab", long_options_required,
Packit 33f14e
                        &p_value, &q_value,
Packit 33f14e
                        &non_options_count, non_options, &unrecognized);
Packit 33f14e
      ASSERT (a_seen == 1);
Packit 33f14e
      ASSERT (b_seen == 1);
Packit 33f14e
      ASSERT (p_value == NULL);
Packit 33f14e
      ASSERT (q_value == NULL);
Packit 33f14e
      ASSERT (non_options_count == 1);
Packit 33f14e
      ASSERT (strcmp (non_options[0], "billy") == 0);
Packit 33f14e
      ASSERT (unrecognized == 0);
Packit 33f14e
      ASSERT (optind == 4);
Packit 33f14e
    }
Packit 33f14e
}
Packit 33f14e
Packit 33f14e
/* Reduce casting, so we can use string literals elsewhere.
Packit 33f14e
   getopt_long_only takes an array of char*, but luckily does not
Packit 33f14e
   modify those elements, so we can pass const char*.  */
Packit 33f14e
static int
Packit 33f14e
do_getopt_long_only (int argc, const char **argv, const char *shortopts,
Packit 33f14e
                     const struct option *longopts, int *longind)
Packit 33f14e
{
Packit 33f14e
  return getopt_long_only (argc, (char **) argv, shortopts, longopts, longind);
Packit 33f14e
}
Packit 33f14e
Packit 33f14e
static void
Packit 33f14e
test_getopt_long_only (void)
Packit 33f14e
{
Packit 33f14e
  /* Test disambiguation of options.  */
Packit 33f14e
  {
Packit 33f14e
    int argc = 0;
Packit 33f14e
    const char *argv[10];
Packit 33f14e
    int option_index;
Packit 33f14e
    int c;
Packit 33f14e
Packit 33f14e
    argv[argc++] = "program";
Packit 33f14e
    argv[argc++] = "-x";
Packit 33f14e
    argv[argc] = NULL;
Packit 33f14e
    optind = 1;
Packit 33f14e
    opterr = 0;
Packit 33f14e
    c = do_getopt_long_only (argc, argv, "ab", long_options_required,
Packit 33f14e
                             &option_index);
Packit 33f14e
    ASSERT (c == '?');
Packit 33f14e
    ASSERT (optopt == 0);
Packit 33f14e
  }
Packit 33f14e
  {
Packit 33f14e
    int argc = 0;
Packit 33f14e
    const char *argv[10];
Packit 33f14e
    int option_index;
Packit 33f14e
    int c;
Packit 33f14e
Packit 33f14e
    argv[argc++] = "program";
Packit 33f14e
    argv[argc++] = "-x";
Packit 33f14e
    argv[argc] = NULL;
Packit 33f14e
    optind = 1;
Packit 33f14e
    opterr = 0;
Packit 33f14e
    c = do_getopt_long_only (argc, argv, "abx", long_options_required,
Packit 33f14e
                             &option_index);
Packit 33f14e
    ASSERT (c == 'x');
Packit 33f14e
    ASSERT (optopt == 0);
Packit 33f14e
  }
Packit 33f14e
  {
Packit 33f14e
    int argc = 0;
Packit 33f14e
    const char *argv[10];
Packit 33f14e
    int option_index;
Packit 33f14e
    int c;
Packit 33f14e
Packit 33f14e
    argv[argc++] = "program";
Packit 33f14e
    argv[argc++] = "--x";
Packit 33f14e
    argv[argc] = NULL;
Packit 33f14e
    optind = 1;
Packit 33f14e
    opterr = 0;
Packit 33f14e
    c = do_getopt_long_only (argc, argv, "abx", long_options_required,
Packit 33f14e
                             &option_index);
Packit 33f14e
    ASSERT (c == '?');
Packit 33f14e
    ASSERT (optopt == 0);
Packit 33f14e
  }
Packit 33f14e
  {
Packit 33f14e
    int argc = 0;
Packit 33f14e
    const char *argv[10];
Packit 33f14e
    int option_index;
Packit 33f14e
    int c;
Packit 33f14e
Packit 33f14e
    argv[argc++] = "program";
Packit 33f14e
    argv[argc++] = "-b";
Packit 33f14e
    argv[argc] = NULL;
Packit 33f14e
    optind = 1;
Packit 33f14e
    opterr = 0;
Packit 33f14e
    b_seen = 0;
Packit 33f14e
    c = do_getopt_long_only (argc, argv, "abx", long_options_required,
Packit 33f14e
                             &option_index);
Packit 33f14e
    ASSERT (c == 'b');
Packit 33f14e
    ASSERT (b_seen == 0);
Packit 33f14e
  }
Packit 33f14e
  {
Packit 33f14e
    int argc = 0;
Packit 33f14e
    const char *argv[10];
Packit 33f14e
    int option_index;
Packit 33f14e
    int c;
Packit 33f14e
Packit 33f14e
    argv[argc++] = "program";
Packit 33f14e
    argv[argc++] = "--b";
Packit 33f14e
    argv[argc] = NULL;
Packit 33f14e
    optind = 1;
Packit 33f14e
    opterr = 0;
Packit 33f14e
    b_seen = 0;
Packit 33f14e
    c = do_getopt_long_only (argc, argv, "abx", long_options_required,
Packit 33f14e
                             &option_index);
Packit 33f14e
    ASSERT (c == 0);
Packit 33f14e
    ASSERT (b_seen == 1);
Packit 33f14e
  }
Packit 33f14e
  {
Packit 33f14e
    int argc = 0;
Packit 33f14e
    const char *argv[10];
Packit 33f14e
    int option_index;
Packit 33f14e
    int c;
Packit 33f14e
Packit 33f14e
    argv[argc++] = "program";
Packit 33f14e
    argv[argc++] = "-xt";
Packit 33f14e
    argv[argc] = NULL;
Packit 33f14e
    optind = 1;
Packit 33f14e
    opterr = 0;
Packit 33f14e
    c = do_getopt_long_only (argc, argv, "ab", long_options_required,
Packit 33f14e
                             &option_index);
Packit 33f14e
    ASSERT (c == '?');
Packit 33f14e
    ASSERT (optopt == 0);
Packit 33f14e
  }
Packit 33f14e
  {
Packit 33f14e
    int argc = 0;
Packit 33f14e
    const char *argv[10];
Packit 33f14e
    int option_index;
Packit 33f14e
    int c;
Packit 33f14e
Packit 33f14e
    argv[argc++] = "program";
Packit 33f14e
    argv[argc++] = "-xt";
Packit 33f14e
    argv[argc] = NULL;
Packit 33f14e
    optind = 1;
Packit 33f14e
    opterr = 0;
Packit 33f14e
    c = do_getopt_long_only (argc, argv, "abx", long_options_required,
Packit 33f14e
                             &option_index);
Packit 33f14e
    ASSERT (c == '?');
Packit 33f14e
    ASSERT (optopt == 0);
Packit 33f14e
  }
Packit 33f14e
  {
Packit 33f14e
    int argc = 0;
Packit 33f14e
    const char *argv[10];
Packit 33f14e
    int option_index;
Packit 33f14e
    int c;
Packit 33f14e
Packit 33f14e
    argv[argc++] = "program";
Packit 33f14e
    argv[argc++] = "-xtra";
Packit 33f14e
    argv[argc] = NULL;
Packit 33f14e
    optind = 1;
Packit 33f14e
    opterr = 0;
Packit 33f14e
    c = do_getopt_long_only (argc, argv, "ab", long_options_required,
Packit 33f14e
                             &option_index);
Packit 33f14e
    ASSERT (c == 1001);
Packit 33f14e
  }
Packit 33f14e
  {
Packit 33f14e
    int argc = 0;
Packit 33f14e
    const char *argv[10];
Packit 33f14e
    int option_index;
Packit 33f14e
    int c;
Packit 33f14e
Packit 33f14e
    argv[argc++] = "program";
Packit 33f14e
    argv[argc++] = "-xtreme";
Packit 33f14e
    argv[argc] = NULL;
Packit 33f14e
    optind = 1;
Packit 33f14e
    opterr = 0;
Packit 33f14e
    c = do_getopt_long_only (argc, argv, "abx:", long_options_required,
Packit 33f14e
                             &option_index);
Packit 33f14e
    ASSERT (c == 1002);
Packit 33f14e
  }
Packit 33f14e
  {
Packit 33f14e
    int argc = 0;
Packit 33f14e
    const char *argv[10];
Packit 33f14e
    int option_index;
Packit 33f14e
    int c;
Packit 33f14e
Packit 33f14e
    argv[argc++] = "program";
Packit 33f14e
    argv[argc++] = "-xtremel";
Packit 33f14e
    argv[argc] = NULL;
Packit 33f14e
    optind = 1;
Packit 33f14e
    opterr = 0;
Packit 33f14e
    c = do_getopt_long_only (argc, argv, "ab", long_options_required,
Packit 33f14e
                             &option_index);
Packit 33f14e
    /* glibc getopt_long_only is intentionally different from
Packit 33f14e
       getopt_long when handling a prefix that is common to two
Packit 33f14e
       spellings, when both spellings have the same option directives.
Packit 33f14e
       BSD getopt_long_only treats both cases the same.  */
Packit 33f14e
    ASSERT (c == 1003 || c == '?');
Packit 33f14e
    ASSERT (optind == 2);
Packit 33f14e
  }
Packit 33f14e
  {
Packit 33f14e
    int argc = 0;
Packit 33f14e
    const char *argv[10];
Packit 33f14e
    int option_index;
Packit 33f14e
    int c;
Packit 33f14e
Packit 33f14e
    argv[argc++] = "program";
Packit 33f14e
    argv[argc++] = "-xtremel";
Packit 33f14e
    argv[argc] = NULL;
Packit 33f14e
    optind = 1;
Packit 33f14e
    opterr = 0;
Packit 33f14e
    c = do_getopt_long_only (argc, argv, "abx::", long_options_required,
Packit 33f14e
                             &option_index);
Packit 33f14e
    /* glibc getopt_long_only is intentionally different from
Packit 33f14e
       getopt_long when handling a prefix that is common to two
Packit 33f14e
       spellings, when both spellings have the same option directives.
Packit 33f14e
       BSD getopt_long_only treats both cases the same.  */
Packit 33f14e
    ASSERT (c == 1003 || c == '?');
Packit 33f14e
    ASSERT (optind == 2);
Packit 33f14e
    ASSERT (optarg == NULL);
Packit 33f14e
  }
Packit 33f14e
  {
Packit 33f14e
    int argc = 0;
Packit 33f14e
    const char *argv[10];
Packit 33f14e
    int option_index;
Packit 33f14e
    int c;
Packit 33f14e
Packit 33f14e
    argv[argc++] = "program";
Packit 33f14e
    argv[argc++] = "-xtras";
Packit 33f14e
    argv[argc] = NULL;
Packit 33f14e
    optind = 1;
Packit 33f14e
    opterr = 0;
Packit 33f14e
    c = do_getopt_long_only (argc, argv, "abx::", long_options_required,
Packit 33f14e
                             &option_index);
Packit 33f14e
    ASSERT (c == 'x');
Packit 33f14e
    ASSERT (strcmp (optarg, "tras") == 0);
Packit 33f14e
  }
Packit 33f14e
}