Blame gnulib-tests/test-getopt_long.h

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