/* Written by Bruno Haible <bruno@clisp.org>, 2009. */
+#include <stdbool.h>
+
static void
getopt_loop (int argc, const char **argv,
const char *options,
test_getopt (void)
{
int start;
+ bool posixly = !!getenv ("POSIXLY_CORRECT");
+ /* See comment in getopt.c:
+ glibc gets a LSB-compliant getopt.
+ Standalone applications get a POSIX-compliant getopt. */
+#if defined __GETOPT_PREFIX || !(__GLIBC__ >= 2 || defined __MINGW32__)
+ /* Using getopt from gnulib or from a non-glibc system. */
+ posixly = true;
+#endif
/* Test processing of boolean options. */
for (start = OPTIND_MIN; start <= 1; start++)
argv[argc++] = "-a";
argv[argc++] = "foo";
argv[argc++] = "bar";
+ argv[argc] = NULL;
optind = start;
getopt_loop (argc, argv, "ab",
&a_seen, &b_seen, &p_value, &q_value,
argv[argc++] = "-a";
argv[argc++] = "foo";
argv[argc++] = "bar";
+ argv[argc] = NULL;
optind = start;
getopt_loop (argc, argv, "ab",
&a_seen, &b_seen, &p_value, &q_value,
argv[argc++] = "-ba";
argv[argc++] = "foo";
argv[argc++] = "bar";
+ argv[argc] = NULL;
optind = start;
getopt_loop (argc, argv, "ab",
&a_seen, &b_seen, &p_value, &q_value,
argv[argc++] = "-a";
argv[argc++] = "foo";
argv[argc++] = "bar";
+ argv[argc] = NULL;
optind = start;
getopt_loop (argc, argv, "ab",
&a_seen, &b_seen, &p_value, &q_value,
argv[argc++] = "program";
argv[argc++] = "-pfoo";
argv[argc++] = "bar";
+ argv[argc] = NULL;
optind = start;
getopt_loop (argc, argv, "p:q:",
&a_seen, &b_seen, &p_value, &q_value,
argv[argc++] = "-p";
argv[argc++] = "foo";
argv[argc++] = "bar";
+ argv[argc] = NULL;
optind = start;
getopt_loop (argc, argv, "p:q:",
&a_seen, &b_seen, &p_value, &q_value,
argv[argc++] = "baz";
argv[argc++] = "-pfoo";
argv[argc++] = "bar";
+ argv[argc] = NULL;
optind = start;
getopt_loop (argc, argv, "abp:q:",
&a_seen, &b_seen, &p_value, &q_value,
argv[argc++] = "program";
argv[argc++] = "-pfoo";
argv[argc++] = "bar";
+ argv[argc] = NULL;
optind = start;
getopt_loop (argc, argv, "p::q::",
&a_seen, &b_seen, &p_value, &q_value,
argv[argc++] = "-p";
argv[argc++] = "foo";
argv[argc++] = "bar";
+ argv[argc] = NULL;
optind = start;
getopt_loop (argc, argv, "p::q::",
&a_seen, &b_seen, &p_value, &q_value,
argv[argc++] = "-p";
argv[argc++] = "-a";
argv[argc++] = "bar";
+ argv[argc] = NULL;
optind = start;
getopt_loop (argc, argv, "abp::q::",
&a_seen, &b_seen, &p_value, &q_value,
argv[argc++] = "-x";
argv[argc++] = "-a";
argv[argc++] = "bar";
+ argv[argc] = NULL;
optind = start;
getopt_loop (argc, argv, "abp:q:",
&a_seen, &b_seen, &p_value, &q_value,
argv[argc++] = "duck";
argv[argc++] = "-a";
argv[argc++] = "bar";
+ argv[argc] = NULL;
optind = start;
getopt_loop (argc, argv, "abp:q:",
&a_seen, &b_seen, &p_value, &q_value,
&non_options_count, non_options, &unrecognized);
- /* See comment in getopt.c:
- glibc gets a LSB-compliant getopt.
- Standalone applications get a POSIX-compliant getopt. */
-#if defined __GETOPT_PREFIX || !(__GLIBC__ >= 2 || defined __MINGW32__)
- /* Using getopt from gnulib or from a non-glibc system. */
- 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 (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);
-#else
- /* Using getopt from glibc. */
- 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 (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);
-#endif
+ if (posixly)
+ {
+ 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);
+ }
+ else
+ {
+ 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. */
argv[argc++] = "-q";
argv[argc++] = "johnny";
argv[argc++] = "bar";
+ argv[argc] = NULL;
optind = start;
getopt_loop (argc, argv, "abp:q:",
&a_seen, &b_seen, &p_value, &q_value,
&non_options_count, non_options, &unrecognized);
- /* See comment in getopt.c:
- glibc gets a LSB-compliant getopt.
- Standalone applications get a POSIX-compliant getopt. */
-#if defined __GETOPT_PREFIX || !(__GLIBC__ >= 2 || defined __MINGW32__)
- /* Using getopt from gnulib or from a non-glibc system. */
- 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 (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);
-#else
- /* Using getopt from glibc. */
- 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 (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);
-#endif
+ if (posixly)
+ {
+ 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);
+ }
+ else
+ {
+ 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);
+ }
}
#if GNULIB_GETOPT_GNU
argv[argc++] = "duck";
argv[argc++] = "-a";
argv[argc++] = "bar";
+ argv[argc] = NULL;
optind = start;
getopt_loop (argc, argv, "-abp:q:",
&a_seen, &b_seen, &p_value, &q_value,
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);
argv[argc++] = "-q";
argv[argc++] = "johnny";
argv[argc++] = "bar";
+ argv[argc] = NULL;
optind = start;
getopt_loop (argc, argv, "-abp:q:",
&a_seen, &b_seen, &p_value, &q_value,
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);
argv[argc++] = "duck";
argv[argc++] = "-a";
argv[argc++] = "bar";
+ argv[argc] = NULL;
optind = start;
getopt_loop (argc, argv, "abp:q:-",
&a_seen, &b_seen, &p_value, &q_value,
&non_options_count, non_options, &unrecognized);
- /* See comment in getopt.c:
- glibc gets a LSB-compliant getopt.
- Standalone applications get a POSIX-compliant getopt. */
-#if defined __GETOPT_PREFIX || !(__GLIBC__ >= 2 || defined __MINGW32__)
- /* Using getopt from gnulib or from a non-glibc system. */
- 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 (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);
-#else
- /* Using getopt from glibc. */
- 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 (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);
-#endif
+ if (posixly)
+ {
+ 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);
+ }
+ else
+ {
+ 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
argv[argc++] = "duck";
argv[argc++] = "-a";
argv[argc++] = "bar";
+ argv[argc] = NULL;
optind = start;
getopt_loop (argc, argv, "+abp:q:",
&a_seen, &b_seen, &p_value, &q_value,
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);
argv[argc++] = "program";
argv[argc++] = "-+";
+ argv[argc] = NULL;
optind = start;
getopt_loop (argc, argv, "+abp:q:",
&a_seen, &b_seen, &p_value, &q_value,
argv[argc++] = "-q";
argv[argc++] = "johnny";
argv[argc++] = "bar";
+ argv[argc] = NULL;
optind = start;
getopt_loop (argc, argv, "+abp:q:",
&a_seen, &b_seen, &p_value, &q_value,
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);
argv[argc++] = "duck";
argv[argc++] = "-a";
argv[argc++] = "bar";
+ argv[argc] = NULL;
optind = start;
getopt_loop (argc, argv, "abp:q:+",
&a_seen, &b_seen, &p_value, &q_value,
&non_options_count, non_options, &unrecognized);
- /* See comment in getopt.c:
- glibc gets a LSB-compliant getopt.
- Standalone applications get a POSIX-compliant getopt. */
-#if defined __GETOPT_PREFIX || !(__GLIBC__ >= 2 || defined __MINGW32__)
- /* Using getopt from gnulib or from a non-glibc system. */
- 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 (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);
-#else
- /* Using getopt from glibc. */
- 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 (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);
-#endif
+ if (posixly)
+ {
+ 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);
+ }
+ else
+ {
+ 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);
+ }
}
}
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);
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);
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);
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);
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);
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);
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);
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);
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);
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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);
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,
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);
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,
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);
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,
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);
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,
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);
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,
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);
argv[argc++] = "program";
argv[argc++] = "-+";
+ argv[argc] = NULL;
optind = start;
getopt_long_loop (argc, argv, "+abp:q:", long_options_required,
&p_value, &q_value,
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,
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);
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,
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);
static void
test_getopt_long_posix (void)
{
- int c = 3;
- const char *v[4] = {"test", "-r", "foo", NULL};
- struct option l[] = {{NULL, 0, NULL, 0}};
int start;
- int result;
+
+ /* Check that POSIXLY_CORRECT doesn't change optional arguments. */
+ for (start = OPTIND_MIN; 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 = OPTIND_MIN; 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;
- result = do_getopt_long (c, v, "r::", l, NULL);
+ 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);
}
- ASSERT (result == 'r');
- ASSERT (optarg == NULL);
}