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