X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=tests%2Ftest-getopt.h;h=9c877b3d181282e3776a6772d7b389ca58178a52;hb=f6a5a124d0cb326acd4dfa9ce3276baa26734b16;hp=400bc279e99a40e04d83af6afbb31b7d9a13aec3;hpb=a8ec28b6975fc065b84c511b8108dc3658d2ccd4;p=gnulib.git diff --git a/tests/test-getopt.h b/tests/test-getopt.h index 400bc279e..9c877b3d1 100644 --- a/tests/test-getopt.h +++ b/tests/test-getopt.h @@ -1,5 +1,5 @@ /* Test of command line argument processing. - Copyright (C) 2009 Free Software Foundation, Inc. + Copyright (C) 2009-2011 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 @@ -21,7 +21,7 @@ /* The glibc/gnulib implementation of getopt supports setting optind = 0, but not all other implementations do. This matters for getopt. But for getopt_long, we require GNU compatibility. */ -#if defined __GETOPT_PREFIX || (__GLIBC__ >= 2) +#if defined __GETOPT_PREFIX || (__GLIBC__ >= 2 && !defined __UCLIBC__) # define OPTIND_MIN 0 #elif HAVE_DECL_OPTRESET # define OPTIND_MIN (optreset = 1) @@ -35,11 +35,11 @@ getopt_loop (int argc, const char **argv, int *a_seen, int *b_seen, const char **p_value, const char **q_value, int *non_options_count, const char **non_options, - int *unrecognized) + int *unrecognized, bool *message_issued) { int c; + int pos = ftell (stderr); - opterr = 0; while ((c = getopt (argc, (char **) argv, options)) != -1) { switch (c) @@ -61,6 +61,12 @@ getopt_loop (int argc, const char **argv, 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; @@ -69,6 +75,8 @@ getopt_loop (int argc, const char **argv, break; } } + + *message_issued = pos < ftell (stderr); } static void @@ -94,6 +102,7 @@ test_getopt (void) int non_options_count = 0; const char *non_options[10]; int unrecognized = 0; + bool output; int argc = 0; const char *argv[10]; @@ -103,9 +112,10 @@ test_getopt (void) argv[argc++] = "bar"; argv[argc] = NULL; optind = start; + opterr = 1; getopt_loop (argc, argv, "ab", &a_seen, &b_seen, &p_value, &q_value, - &non_options_count, non_options, &unrecognized); + &non_options_count, non_options, &unrecognized, &output); ASSERT (a_seen == 1); ASSERT (b_seen == 0); ASSERT (p_value == NULL); @@ -113,6 +123,7 @@ test_getopt (void) ASSERT (non_options_count == 0); ASSERT (unrecognized == 0); ASSERT (optind == 2); + ASSERT (!output); } for (start = OPTIND_MIN; start <= 1; start++) { @@ -123,6 +134,7 @@ test_getopt (void) int non_options_count = 0; const char *non_options[10]; int unrecognized = 0; + bool output; int argc = 0; const char *argv[10]; @@ -133,9 +145,10 @@ test_getopt (void) argv[argc++] = "bar"; argv[argc] = NULL; optind = start; + opterr = 1; getopt_loop (argc, argv, "ab", &a_seen, &b_seen, &p_value, &q_value, - &non_options_count, non_options, &unrecognized); + &non_options_count, non_options, &unrecognized, &output); ASSERT (a_seen == 1); ASSERT (b_seen == 1); ASSERT (p_value == NULL); @@ -143,6 +156,7 @@ test_getopt (void) ASSERT (non_options_count == 0); ASSERT (unrecognized == 0); ASSERT (optind == 3); + ASSERT (!output); } for (start = OPTIND_MIN; start <= 1; start++) { @@ -153,6 +167,7 @@ test_getopt (void) int non_options_count = 0; const char *non_options[10]; int unrecognized = 0; + bool output; int argc = 0; const char *argv[10]; @@ -162,9 +177,10 @@ test_getopt (void) argv[argc++] = "bar"; argv[argc] = NULL; optind = start; + opterr = 1; getopt_loop (argc, argv, "ab", &a_seen, &b_seen, &p_value, &q_value, - &non_options_count, non_options, &unrecognized); + &non_options_count, non_options, &unrecognized, &output); ASSERT (a_seen == 1); ASSERT (b_seen == 1); ASSERT (p_value == NULL); @@ -172,6 +188,7 @@ test_getopt (void) ASSERT (non_options_count == 0); ASSERT (unrecognized == 0); ASSERT (optind == 2); + ASSERT (!output); } for (start = OPTIND_MIN; start <= 1; start++) { @@ -182,6 +199,7 @@ test_getopt (void) int non_options_count = 0; const char *non_options[10]; int unrecognized = 0; + bool output; int argc = 0; const char *argv[10]; @@ -192,9 +210,10 @@ test_getopt (void) argv[argc++] = "bar"; argv[argc] = NULL; optind = start; + opterr = 1; getopt_loop (argc, argv, "ab", &a_seen, &b_seen, &p_value, &q_value, - &non_options_count, non_options, &unrecognized); + &non_options_count, non_options, &unrecognized, &output); ASSERT (a_seen == 2); ASSERT (b_seen == 1); ASSERT (p_value == NULL); @@ -202,6 +221,7 @@ test_getopt (void) ASSERT (non_options_count == 0); ASSERT (unrecognized == 0); ASSERT (optind == 3); + ASSERT (!output); } /* Test processing of options with arguments. */ @@ -214,6 +234,7 @@ test_getopt (void) int non_options_count = 0; const char *non_options[10]; int unrecognized = 0; + bool output; int argc = 0; const char *argv[10]; @@ -222,9 +243,10 @@ test_getopt (void) argv[argc++] = "bar"; argv[argc] = NULL; optind = start; + opterr = 1; getopt_loop (argc, argv, "p:q:", &a_seen, &b_seen, &p_value, &q_value, - &non_options_count, non_options, &unrecognized); + &non_options_count, non_options, &unrecognized, &output); ASSERT (a_seen == 0); ASSERT (b_seen == 0); ASSERT (p_value != NULL && strcmp (p_value, "foo") == 0); @@ -232,6 +254,7 @@ test_getopt (void) ASSERT (non_options_count == 0); ASSERT (unrecognized == 0); ASSERT (optind == 2); + ASSERT (!output); } for (start = OPTIND_MIN; start <= 1; start++) { @@ -242,6 +265,7 @@ test_getopt (void) int non_options_count = 0; const char *non_options[10]; int unrecognized = 0; + bool output; int argc = 0; const char *argv[10]; @@ -251,9 +275,10 @@ test_getopt (void) argv[argc++] = "bar"; argv[argc] = NULL; optind = start; + opterr = 1; getopt_loop (argc, argv, "p:q:", &a_seen, &b_seen, &p_value, &q_value, - &non_options_count, non_options, &unrecognized); + &non_options_count, non_options, &unrecognized, &output); ASSERT (a_seen == 0); ASSERT (b_seen == 0); ASSERT (p_value != NULL && strcmp (p_value, "foo") == 0); @@ -261,6 +286,7 @@ test_getopt (void) ASSERT (non_options_count == 0); ASSERT (unrecognized == 0); ASSERT (optind == 3); + ASSERT (!output); } for (start = OPTIND_MIN; start <= 1; start++) { @@ -271,6 +297,7 @@ test_getopt (void) int non_options_count = 0; const char *non_options[10]; int unrecognized = 0; + bool output; int argc = 0; const char *argv[10]; @@ -282,9 +309,10 @@ test_getopt (void) argv[argc++] = "bar"; argv[argc] = NULL; optind = start; + opterr = 1; getopt_loop (argc, argv, "abp:q:", &a_seen, &b_seen, &p_value, &q_value, - &non_options_count, non_options, &unrecognized); + &non_options_count, non_options, &unrecognized, &output); ASSERT (a_seen == 1); ASSERT (b_seen == 1); ASSERT (p_value != NULL && strcmp (p_value, "foo") == 0); @@ -292,9 +320,10 @@ test_getopt (void) ASSERT (non_options_count == 0); ASSERT (unrecognized == 0); ASSERT (optind == 5); + ASSERT (!output); } -#if GNULIB_GETOPT_GNU +#if GNULIB_TEST_GETOPT_GNU /* Test processing of options with optional arguments. */ for (start = OPTIND_MIN; start <= 1; start++) { @@ -305,6 +334,7 @@ test_getopt (void) int non_options_count = 0; const char *non_options[10]; int unrecognized = 0; + bool output; int argc = 0; const char *argv[10]; @@ -313,9 +343,10 @@ test_getopt (void) argv[argc++] = "bar"; argv[argc] = NULL; optind = start; + opterr = 1; getopt_loop (argc, argv, "p::q::", &a_seen, &b_seen, &p_value, &q_value, - &non_options_count, non_options, &unrecognized); + &non_options_count, non_options, &unrecognized, &output); ASSERT (a_seen == 0); ASSERT (b_seen == 0); ASSERT (p_value != NULL && strcmp (p_value, "foo") == 0); @@ -323,6 +354,7 @@ test_getopt (void) ASSERT (non_options_count == 0); ASSERT (unrecognized == 0); ASSERT (optind == 2); + ASSERT (!output); } for (start = OPTIND_MIN; start <= 1; start++) { @@ -333,6 +365,7 @@ test_getopt (void) int non_options_count = 0; const char *non_options[10]; int unrecognized = 0; + bool output; int argc = 0; const char *argv[10]; @@ -342,9 +375,10 @@ test_getopt (void) argv[argc++] = "bar"; argv[argc] = NULL; optind = start; + opterr = 1; getopt_loop (argc, argv, "p::q::", &a_seen, &b_seen, &p_value, &q_value, - &non_options_count, non_options, &unrecognized); + &non_options_count, non_options, &unrecognized, &output); ASSERT (a_seen == 0); ASSERT (b_seen == 0); ASSERT (p_value == NULL); @@ -352,6 +386,7 @@ test_getopt (void) ASSERT (non_options_count == 0); ASSERT (unrecognized == 0); ASSERT (optind == 2); + ASSERT (!output); } for (start = OPTIND_MIN; start <= 1; start++) { @@ -362,6 +397,7 @@ test_getopt (void) int non_options_count = 0; const char *non_options[10]; int unrecognized = 0; + bool output; int argc = 0; const char *argv[10]; @@ -371,9 +407,10 @@ test_getopt (void) argv[argc++] = "bar"; argv[argc] = NULL; optind = start; + opterr = 1; getopt_loop (argc, argv, "abp::q::", &a_seen, &b_seen, &p_value, &q_value, - &non_options_count, non_options, &unrecognized); + &non_options_count, non_options, &unrecognized, &output); ASSERT (a_seen == 1); ASSERT (b_seen == 0); ASSERT (p_value == NULL); @@ -381,10 +418,12 @@ test_getopt (void) ASSERT (non_options_count == 0); ASSERT (unrecognized == 0); ASSERT (optind == 3); + ASSERT (!output); } -#endif +#endif /* GNULIB_TEST_GETOPT_GNU */ - /* Check that invalid options are recognized. */ + /* Check that invalid options are recognized; and that both opterr + and leading ':' can silence output. */ for (start = OPTIND_MIN; start <= 1; start++) { int a_seen = 0; @@ -394,6 +433,7 @@ test_getopt (void) int non_options_count = 0; const char *non_options[10]; int unrecognized = 0; + bool output; int argc = 0; const char *argv[10]; @@ -405,9 +445,10 @@ test_getopt (void) argv[argc++] = "bar"; argv[argc] = NULL; optind = start; + opterr = 42; getopt_loop (argc, argv, "abp:q:", &a_seen, &b_seen, &p_value, &q_value, - &non_options_count, non_options, &unrecognized); + &non_options_count, non_options, &unrecognized, &output); ASSERT (a_seen == 1); ASSERT (b_seen == 0); ASSERT (p_value != NULL && strcmp (p_value, "foo") == 0); @@ -415,6 +456,269 @@ test_getopt (void) ASSERT (non_options_count == 0); ASSERT (unrecognized == 'x'); ASSERT (optind == 5); + ASSERT (output); + } + for (start = OPTIND_MIN; start <= 1; start++) + { + int a_seen = 0; + int b_seen = 0; + const char *p_value = NULL; + const char *q_value = NULL; + int non_options_count = 0; + const char *non_options[10]; + int unrecognized = 0; + bool output; + int argc = 0; + const char *argv[10]; + + argv[argc++] = "program"; + argv[argc++] = "-p"; + argv[argc++] = "foo"; + argv[argc++] = "-x"; + argv[argc++] = "-a"; + argv[argc++] = "bar"; + argv[argc] = NULL; + optind = start; + opterr = 0; + getopt_loop (argc, argv, "abp:q:", + &a_seen, &b_seen, &p_value, &q_value, + &non_options_count, non_options, &unrecognized, &output); + 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); + ASSERT (!output); + } + for (start = OPTIND_MIN; start <= 1; start++) + { + int a_seen = 0; + int b_seen = 0; + const char *p_value = NULL; + const char *q_value = NULL; + int non_options_count = 0; + const char *non_options[10]; + int unrecognized = 0; + bool output; + int argc = 0; + const char *argv[10]; + + argv[argc++] = "program"; + argv[argc++] = "-p"; + argv[argc++] = "foo"; + argv[argc++] = "-x"; + argv[argc++] = "-a"; + argv[argc++] = "bar"; + argv[argc] = NULL; + optind = start; + opterr = 1; + getopt_loop (argc, argv, ":abp:q:", + &a_seen, &b_seen, &p_value, &q_value, + &non_options_count, non_options, &unrecognized, &output); + 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); + ASSERT (!output); + } + for (start = OPTIND_MIN; start <= 1; start++) + { + int a_seen = 0; + int b_seen = 0; + const char *p_value = NULL; + const char *q_value = NULL; + int non_options_count = 0; + const char *non_options[10]; + int unrecognized = 0; + bool output; + int argc = 0; + const char *argv[10]; + + argv[argc++] = "program"; + argv[argc++] = "-p"; + argv[argc++] = "foo"; + argv[argc++] = "-:"; + argv[argc++] = "-a"; + argv[argc++] = "bar"; + argv[argc] = NULL; + optind = start; + opterr = 42; + getopt_loop (argc, argv, "abp:q:", + &a_seen, &b_seen, &p_value, &q_value, + &non_options_count, non_options, &unrecognized, &output); + 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); + ASSERT (output); + } + for (start = OPTIND_MIN; start <= 1; start++) + { + int a_seen = 0; + int b_seen = 0; + const char *p_value = NULL; + const char *q_value = NULL; + int non_options_count = 0; + const char *non_options[10]; + int unrecognized = 0; + bool output; + int argc = 0; + const char *argv[10]; + + argv[argc++] = "program"; + argv[argc++] = "-p"; + argv[argc++] = "foo"; + argv[argc++] = "-:"; + argv[argc++] = "-a"; + argv[argc++] = "bar"; + argv[argc] = NULL; + optind = start; + opterr = 0; + getopt_loop (argc, argv, "abp:q:", + &a_seen, &b_seen, &p_value, &q_value, + &non_options_count, non_options, &unrecognized, &output); + 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); + ASSERT (!output); + } + for (start = OPTIND_MIN; start <= 1; start++) + { + int a_seen = 0; + int b_seen = 0; + const char *p_value = NULL; + const char *q_value = NULL; + int non_options_count = 0; + const char *non_options[10]; + int unrecognized = 0; + bool output; + int argc = 0; + const char *argv[10]; + + argv[argc++] = "program"; + argv[argc++] = "-p"; + argv[argc++] = "foo"; + argv[argc++] = "-:"; + argv[argc++] = "-a"; + argv[argc++] = "bar"; + argv[argc] = NULL; + optind = start; + opterr = 1; + getopt_loop (argc, argv, ":abp:q:", + &a_seen, &b_seen, &p_value, &q_value, + &non_options_count, non_options, &unrecognized, &output); + 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); + ASSERT (!output); + } + + /* Check for missing argument behavior. */ + for (start = OPTIND_MIN; start <= 1; start++) + { + int a_seen = 0; + int b_seen = 0; + const char *p_value = NULL; + const char *q_value = NULL; + int non_options_count = 0; + const char *non_options[10]; + int unrecognized = 0; + bool output; + int argc = 0; + const char *argv[10]; + + argv[argc++] = "program"; + argv[argc++] = "-ap"; + argv[argc] = NULL; + optind = start; + opterr = 1; + getopt_loop (argc, argv, "abp:q:", + &a_seen, &b_seen, &p_value, &q_value, + &non_options_count, non_options, &unrecognized, &output); + ASSERT (a_seen == 1); + ASSERT (b_seen == 0); + ASSERT (p_value == NULL); + ASSERT (q_value == NULL); + ASSERT (non_options_count == 0); + ASSERT (unrecognized == 'p'); + ASSERT (optind == 2); + ASSERT (output); + } + for (start = OPTIND_MIN; start <= 1; start++) + { + int a_seen = 0; + int b_seen = 0; + const char *p_value = NULL; + const char *q_value = NULL; + int non_options_count = 0; + const char *non_options[10]; + int unrecognized = 0; + bool output; + int argc = 0; + const char *argv[10]; + + argv[argc++] = "program"; + argv[argc++] = "-ap"; + argv[argc] = NULL; + optind = start; + opterr = 0; + getopt_loop (argc, argv, "abp:q:", + &a_seen, &b_seen, &p_value, &q_value, + &non_options_count, non_options, &unrecognized, &output); + ASSERT (a_seen == 1); + ASSERT (b_seen == 0); + ASSERT (p_value == NULL); + ASSERT (q_value == NULL); + ASSERT (non_options_count == 0); + ASSERT (unrecognized == 'p'); + ASSERT (optind == 2); + ASSERT (!output); + } + for (start = OPTIND_MIN; start <= 1; start++) + { + int a_seen = 0; + int b_seen = 0; + const char *p_value = NULL; + const char *q_value = NULL; + int non_options_count = 0; + const char *non_options[10]; + int unrecognized = 0; + bool output; + int argc = 0; + const char *argv[10]; + + argv[argc++] = "program"; + argv[argc++] = "-ap"; + argv[argc] = NULL; + optind = start; + opterr = 1; + getopt_loop (argc, argv, ":abp:q:", + &a_seen, &b_seen, &p_value, &q_value, + &non_options_count, non_options, &unrecognized, &output); + ASSERT (a_seen == 1); + ASSERT (b_seen == 0); + ASSERT (p_value == NULL); + ASSERT (q_value == NULL); + ASSERT (non_options_count == 0); + ASSERT (unrecognized == 'p'); + ASSERT (optind == 2); + ASSERT (!output); } /* Check that by default, non-options arguments are moved to the end. */ @@ -427,6 +731,7 @@ test_getopt (void) int non_options_count = 0; const char *non_options[10]; int unrecognized = 0; + bool output; int argc = 0; const char *argv[10]; @@ -439,9 +744,10 @@ test_getopt (void) argv[argc++] = "bar"; argv[argc] = NULL; optind = start; + opterr = 1; getopt_loop (argc, argv, "abp:q:", &a_seen, &b_seen, &p_value, &q_value, - &non_options_count, non_options, &unrecognized); + &non_options_count, non_options, &unrecognized, &output); if (posixly) { ASSERT (strcmp (argv[0], "program") == 0); @@ -459,6 +765,7 @@ test_getopt (void) ASSERT (non_options_count == 0); ASSERT (unrecognized == 0); ASSERT (optind == 1); + ASSERT (!output); } else { @@ -477,6 +784,7 @@ test_getopt (void) ASSERT (non_options_count == 0); ASSERT (unrecognized == 0); ASSERT (optind == 4); + ASSERT (!output); } } @@ -490,6 +798,7 @@ test_getopt (void) int non_options_count = 0; const char *non_options[10]; int unrecognized = 0; + bool output; int argc = 0; const char *argv[20]; @@ -507,9 +816,10 @@ test_getopt (void) argv[argc++] = "bar"; argv[argc] = NULL; optind = start; + opterr = 1; getopt_loop (argc, argv, "abp:q:", &a_seen, &b_seen, &p_value, &q_value, - &non_options_count, non_options, &unrecognized); + &non_options_count, non_options, &unrecognized, &output); if (posixly) { ASSERT (strcmp (argv[0], "program") == 0); @@ -532,6 +842,7 @@ test_getopt (void) ASSERT (non_options_count == 0); ASSERT (unrecognized == 0); ASSERT (optind == 1); + ASSERT (!output); } else { @@ -555,10 +866,11 @@ test_getopt (void) ASSERT (non_options_count == 0); ASSERT (unrecognized == 0); ASSERT (optind == 5); + ASSERT (!output); } } -#if GNULIB_GETOPT_GNU +#if GNULIB_TEST_GETOPT_GNU /* Check that the '-' flag causes non-options to be returned in order. */ for (start = OPTIND_MIN; start <= 1; start++) { @@ -569,6 +881,7 @@ test_getopt (void) int non_options_count = 0; const char *non_options[10]; int unrecognized = 0; + bool output; int argc = 0; const char *argv[10]; @@ -581,9 +894,10 @@ test_getopt (void) argv[argc++] = "bar"; argv[argc] = NULL; optind = start; + opterr = 1; getopt_loop (argc, argv, "-abp:q:", &a_seen, &b_seen, &p_value, &q_value, - &non_options_count, non_options, &unrecognized); + &non_options_count, non_options, &unrecognized, &output); ASSERT (strcmp (argv[0], "program") == 0); ASSERT (strcmp (argv[1], "donald") == 0); ASSERT (strcmp (argv[2], "-p") == 0); @@ -602,6 +916,7 @@ test_getopt (void) ASSERT (strcmp (non_options[2], "bar") == 0); ASSERT (unrecognized == 0); ASSERT (optind == 7); + ASSERT (!output); } /* Check that '--' ends the argument processing. */ @@ -614,6 +929,7 @@ test_getopt (void) int non_options_count = 0; const char *non_options[10]; int unrecognized = 0; + bool output; int argc = 0; const char *argv[20]; @@ -631,9 +947,10 @@ test_getopt (void) argv[argc++] = "bar"; argv[argc] = NULL; optind = start; + opterr = 1; getopt_loop (argc, argv, "-abp:q:", &a_seen, &b_seen, &p_value, &q_value, - &non_options_count, non_options, &unrecognized); + &non_options_count, non_options, &unrecognized, &output); ASSERT (strcmp (argv[0], "program") == 0); ASSERT (strcmp (argv[1], "donald") == 0); ASSERT (strcmp (argv[2], "-p") == 0); @@ -651,6 +968,7 @@ test_getopt (void) ASSERT (b_seen == 0); ASSERT (p_value != NULL && strcmp (p_value, "billy") == 0); ASSERT (q_value == NULL); + ASSERT (!output); if (non_options_count == 2) { /* glibc behaviour. */ @@ -675,7 +993,6 @@ test_getopt (void) ASSERT (optind == 12); } } -#endif /* Check that the '-' flag has to come first. */ for (start = OPTIND_MIN; start <= 1; start++) @@ -687,6 +1004,7 @@ test_getopt (void) int non_options_count = 0; const char *non_options[10]; int unrecognized = 0; + bool output; int argc = 0; const char *argv[10]; @@ -699,9 +1017,10 @@ test_getopt (void) argv[argc++] = "bar"; argv[argc] = NULL; optind = start; + opterr = 1; getopt_loop (argc, argv, "abp:q:-", &a_seen, &b_seen, &p_value, &q_value, - &non_options_count, non_options, &unrecognized); + &non_options_count, non_options, &unrecognized, &output); if (posixly) { ASSERT (strcmp (argv[0], "program") == 0); @@ -719,6 +1038,7 @@ test_getopt (void) ASSERT (non_options_count == 0); ASSERT (unrecognized == 0); ASSERT (optind == 1); + ASSERT (!output); } else { @@ -737,6 +1057,7 @@ test_getopt (void) ASSERT (non_options_count == 0); ASSERT (unrecognized == 0); ASSERT (optind == 4); + ASSERT (!output); } } @@ -751,6 +1072,7 @@ test_getopt (void) int non_options_count = 0; const char *non_options[10]; int unrecognized = 0; + bool output; int argc = 0; const char *argv[10]; @@ -763,9 +1085,10 @@ test_getopt (void) argv[argc++] = "bar"; argv[argc] = NULL; optind = start; + opterr = 1; getopt_loop (argc, argv, "+abp:q:", &a_seen, &b_seen, &p_value, &q_value, - &non_options_count, non_options, &unrecognized); + &non_options_count, non_options, &unrecognized, &output); ASSERT (strcmp (argv[0], "program") == 0); ASSERT (strcmp (argv[1], "donald") == 0); ASSERT (strcmp (argv[2], "-p") == 0); @@ -781,6 +1104,7 @@ test_getopt (void) ASSERT (non_options_count == 0); ASSERT (unrecognized == 0); ASSERT (optind == 1); + ASSERT (!output); } for (start = OPTIND_MIN; start <= 1; start++) { @@ -791,6 +1115,7 @@ test_getopt (void) int non_options_count = 0; const char *non_options[10]; int unrecognized = 0; + bool output; int argc = 0; const char *argv[10]; @@ -800,7 +1125,7 @@ test_getopt (void) optind = start; getopt_loop (argc, argv, "+abp:q:", &a_seen, &b_seen, &p_value, &q_value, - &non_options_count, non_options, &unrecognized); + &non_options_count, non_options, &unrecognized, &output); ASSERT (a_seen == 0); ASSERT (b_seen == 0); ASSERT (p_value == NULL); @@ -808,6 +1133,7 @@ test_getopt (void) ASSERT (non_options_count == 0); ASSERT (unrecognized == '+'); ASSERT (optind == 2); + ASSERT (output); } /* Check that '--' ends the argument processing. */ @@ -820,6 +1146,7 @@ test_getopt (void) int non_options_count = 0; const char *non_options[10]; int unrecognized = 0; + bool output; int argc = 0; const char *argv[20]; @@ -837,9 +1164,10 @@ test_getopt (void) argv[argc++] = "bar"; argv[argc] = NULL; optind = start; + opterr = 1; getopt_loop (argc, argv, "+abp:q:", &a_seen, &b_seen, &p_value, &q_value, - &non_options_count, non_options, &unrecognized); + &non_options_count, non_options, &unrecognized, &output); ASSERT (strcmp (argv[0], "program") == 0); ASSERT (strcmp (argv[1], "donald") == 0); ASSERT (strcmp (argv[2], "-p") == 0); @@ -859,8 +1187,10 @@ test_getopt (void) ASSERT (q_value == NULL); ASSERT (non_options_count == 0); ASSERT (unrecognized == 0); - ASSERT (optind = 1); + ASSERT (optind == 1); + ASSERT (!output); } +#endif /* GNULIB_TEST_GETOPT_GNU */ /* Check that the '+' flag has to come first. */ for (start = OPTIND_MIN; start <= 1; start++) @@ -872,6 +1202,7 @@ test_getopt (void) int non_options_count = 0; const char *non_options[10]; int unrecognized = 0; + bool output; int argc = 0; const char *argv[10]; @@ -884,9 +1215,10 @@ test_getopt (void) argv[argc++] = "bar"; argv[argc] = NULL; optind = start; + opterr = 1; getopt_loop (argc, argv, "abp:q:+", &a_seen, &b_seen, &p_value, &q_value, - &non_options_count, non_options, &unrecognized); + &non_options_count, non_options, &unrecognized, &output); if (posixly) { ASSERT (strcmp (argv[0], "program") == 0); @@ -904,6 +1236,7 @@ test_getopt (void) ASSERT (non_options_count == 0); ASSERT (unrecognized == 0); ASSERT (optind == 1); + ASSERT (!output); } else { @@ -922,6 +1255,115 @@ test_getopt (void) ASSERT (non_options_count == 0); ASSERT (unrecognized == 0); ASSERT (optind == 4); + ASSERT (!output); } } + +#if GNULIB_TEST_GETOPT_GNU + /* If GNU extensions are supported, require compliance with POSIX + interpretation on leading '+' behavior. + http://austingroupbugs.net/view.php?id=191 */ + for (start = OPTIND_MIN; start <= 1; start++) + { + int a_seen = 0; + int b_seen = 0; + const char *p_value = NULL; + const char *q_value = NULL; + int non_options_count = 0; + const char *non_options[10]; + int unrecognized = 0; + bool output; + int argc = 0; + const char *argv[10]; + + 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; + opterr = 1; + getopt_loop (argc, argv, "+:abp:q:", + &a_seen, &b_seen, &p_value, &q_value, + &non_options_count, non_options, &unrecognized, &output); + 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); + ASSERT (!output); + } + for (start = OPTIND_MIN; start <= 1; start++) + { + int a_seen = 0; + int b_seen = 0; + const char *p_value = NULL; + const char *q_value = NULL; + int non_options_count = 0; + const char *non_options[10]; + int unrecognized = 0; + bool output; + int argc = 0; + const char *argv[10]; + + argv[argc++] = "program"; + argv[argc++] = "-p"; + 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, &output); + ASSERT (a_seen == 0); + ASSERT (b_seen == 0); + ASSERT (p_value == NULL); + ASSERT (q_value == NULL); + ASSERT (non_options_count == 0); + ASSERT (unrecognized == 'p'); + ASSERT (optind == 2); + ASSERT (!output); + } + for (start = OPTIND_MIN; start <= 1; start++) + { + int a_seen = 0; + int b_seen = 0; + const char *p_value = NULL; + const char *q_value = NULL; + int non_options_count = 0; + const char *non_options[10]; + int unrecognized = 0; + bool output; + int argc = 0; + const char *argv[10]; + + argv[argc++] = "program"; + argv[argc++] = "-b"; + argv[argc++] = "-p"; + 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, &output); + ASSERT (a_seen == 0); + ASSERT (b_seen == 1); + ASSERT (p_value == NULL); + ASSERT (q_value == NULL); + ASSERT (non_options_count == 0); + ASSERT (unrecognized == 'p'); + ASSERT (optind == 3); + ASSERT (!output); + } +#endif /* GNULIB_TEST_GETOPT_GNU */ }