LCOV - GNU Libidn - gltests/test-getopt.h

LCOV - code coverage report
Current view: top level - gltests - test-getopt.h (source / functions) Hit Total Coverage
Test: GNU Libidn Lines: 589 596 98.8 %
Date: 2020年07月22日 17:53:13 Functions: 2 2 100.0 %
Legend: Lines: hit not hit

 Line data Source code
 1  : /* Test of command line argument processing.
 2  : Copyright (C) 2009-2020 Free Software Foundation, Inc.
 3  : 
 4  : This program is free software: you can redistribute it and/or modify
 5  : it under the terms of the GNU General Public License as published by
 6  : the Free Software Foundation; either version 3 of the License, or
 7  : (at your option) any later version.
 8  : 
 9  : This program is distributed in the hope that it will be useful,
 10  : but WITHOUT ANY WARRANTY; without even the implied warranty of
 11  : MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 12  : GNU General Public License for more details.
 13  : 
 14  : You should have received a copy of the GNU General Public License
 15  : along with this program. If not, see <https://www.gnu.org/licenses/>. */
 16  : 
 17  : /* Written by Bruno Haible <bruno@clisp.org>, 2009. */
 18  : 
 19  : #include <stdbool.h>
 20  : 
 21  : /* The glibc/gnulib implementation of getopt supports setting optind =
 22  : 0, but not all other implementations do. This matters for getopt.
 23  : But for getopt_long, we require GNU compatibility. */
 24  : #if defined __GETOPT_PREFIX || (__GLIBC__ >= 2 && !defined __UCLIBC__)
 25  : # define OPTIND_MIN 0
 26  : #elif HAVE_DECL_OPTRESET
 27  : # define OPTIND_MIN (optreset = 1)
 28  : #else
 29  : # define OPTIND_MIN 1
 30  : #endif
 31  : 
 32  : static void
 33  152 : getopt_loop (int argc, const char **argv,
 34  : const char *options,
 35  : int *a_seen, int *b_seen,
 36  : const char **p_value, const char **q_value,
 37  : int *non_options_count, const char **non_options,
 38  : int *unrecognized, bool *message_issued)
 39  : {
 40  : int c;
 41  152 : int pos = ftell (stderr);
 42  : 
 43  480 : while ((c = getopt (argc, (char **) argv, options)) != -1)
 44  : {
 45  328 : switch (c)
 46  : {
 47  132 : case 'a':
 48  132 : (*a_seen)++;
 49  132 : break;
 50  32 : case 'b':
 51  32 : (*b_seen)++;
 52  32 : break;
 53  84 : case 'p':
 54  84 : *p_value = optarg;
 55  84 : break;
 56  8 : case 'q':
 57  8 : *q_value = optarg;
 58  8 : break;
 59  0 : case '1円':
 60  : /* Must only happen with option '-' at the beginning. */
 61  0 : ASSERT (options[0] == '-');
 62  0 : non_options[(*non_options_count)++] = optarg;
 63  0 : break;
 64  8 : case ':':
 65  : /* Must only happen with option ':' at the beginning. */
 66  8 : ASSERT (options[0] == ':'
 67  : || ((options[0] == '-' || options[0] == '+')
 68  : && options[1] == ':'));
 69  : FALLTHROUGH;
 70  : case '?':
 71  72 : *unrecognized = optopt;
 72  72 : break;
 73  0 : default:
 74  0 : *unrecognized = c;
 75  0 : break;
 76  : }
 77  : }
 78  : 
 79  152 : *message_issued = pos < ftell (stderr);
 80  152 : }
 81  : 
 82  : static void
 83  4 : test_getopt (void)
 84  : {
 85  : int start;
 86  4 : bool posixly = !!getenv ("POSIXLY_CORRECT");
 87  : /* See comment in getopt.c:
 88  : glibc gets a LSB-compliant getopt.
 89  : Standalone applications get a POSIX-compliant getopt. */
 90  : #if defined __GETOPT_PREFIX || !(__GLIBC__ >= 2 || defined __MINGW32__)
 91  : /* Using getopt from gnulib or from a non-glibc system. */
 92  : posixly = true;
 93  : #endif
 94  : 
 95  : /* Test processing of boolean options. */
 96  12 : for (start = OPTIND_MIN; start <= 1; start++)
 97  : {
 98  8 : int a_seen = 0;
 99  8 : int b_seen = 0;
 100  8 : const char *p_value = NULL;
 101  8 : const char *q_value = NULL;
 102  8 : int non_options_count = 0;
 103  : const char *non_options[10];
 104  8 : int unrecognized = 0;
 105  : bool output;
 106  8 : int argc = 0;
 107  : const char *argv[10];
 108  : 
 109  8 : argv[argc++] = "program";
 110  8 : argv[argc++] = "-a";
 111  8 : argv[argc++] = "foo";
 112  8 : argv[argc++] = "bar";
 113  8 : argv[argc] = NULL;
 114  8 : optind = start;
 115  8 : opterr = 1;
 116  8 : getopt_loop (argc, argv, "ab",
 117  : &a_seen, &b_seen, &p_value, &q_value,
 118  : &non_options_count, non_options, &unrecognized, &output);
 119  8 : ASSERT (a_seen == 1);
 120  8 : ASSERT (b_seen == 0);
 121  8 : ASSERT (p_value == NULL);
 122  8 : ASSERT (q_value == NULL);
 123  8 : ASSERT (non_options_count == 0);
 124  8 : ASSERT (unrecognized == 0);
 125  8 : ASSERT (optind == 2);
 126  8 : ASSERT (!output);
 127  : }
 128  12 : for (start = OPTIND_MIN; start <= 1; start++)
 129  : {
 130  8 : int a_seen = 0;
 131  8 : int b_seen = 0;
 132  8 : const char *p_value = NULL;
 133  8 : const char *q_value = NULL;
 134  8 : int non_options_count = 0;
 135  : const char *non_options[10];
 136  8 : int unrecognized = 0;
 137  : bool output;
 138  8 : int argc = 0;
 139  : const char *argv[10];
 140  : 
 141  8 : argv[argc++] = "program";
 142  8 : argv[argc++] = "-b";
 143  8 : argv[argc++] = "-a";
 144  8 : argv[argc++] = "foo";
 145  8 : argv[argc++] = "bar";
 146  8 : argv[argc] = NULL;
 147  8 : optind = start;
 148  8 : opterr = 1;
 149  8 : getopt_loop (argc, argv, "ab",
 150  : &a_seen, &b_seen, &p_value, &q_value,
 151  : &non_options_count, non_options, &unrecognized, &output);
 152  8 : ASSERT (a_seen == 1);
 153  8 : ASSERT (b_seen == 1);
 154  8 : ASSERT (p_value == NULL);
 155  8 : ASSERT (q_value == NULL);
 156  8 : ASSERT (non_options_count == 0);
 157  8 : ASSERT (unrecognized == 0);
 158  8 : ASSERT (optind == 3);
 159  8 : ASSERT (!output);
 160  : }
 161  12 : for (start = OPTIND_MIN; start <= 1; start++)
 162  : {
 163  8 : int a_seen = 0;
 164  8 : int b_seen = 0;
 165  8 : const char *p_value = NULL;
 166  8 : const char *q_value = NULL;
 167  8 : int non_options_count = 0;
 168  : const char *non_options[10];
 169  8 : int unrecognized = 0;
 170  : bool output;
 171  8 : int argc = 0;
 172  : const char *argv[10];
 173  : 
 174  8 : argv[argc++] = "program";
 175  8 : argv[argc++] = "-ba";
 176  8 : argv[argc++] = "foo";
 177  8 : argv[argc++] = "bar";
 178  8 : argv[argc] = NULL;
 179  8 : optind = start;
 180  8 : opterr = 1;
 181  8 : getopt_loop (argc, argv, "ab",
 182  : &a_seen, &b_seen, &p_value, &q_value,
 183  : &non_options_count, non_options, &unrecognized, &output);
 184  8 : ASSERT (a_seen == 1);
 185  8 : ASSERT (b_seen == 1);
 186  8 : ASSERT (p_value == NULL);
 187  8 : ASSERT (q_value == NULL);
 188  8 : ASSERT (non_options_count == 0);
 189  8 : ASSERT (unrecognized == 0);
 190  8 : ASSERT (optind == 2);
 191  8 : ASSERT (!output);
 192  : }
 193  12 : for (start = OPTIND_MIN; start <= 1; start++)
 194  : {
 195  8 : int a_seen = 0;
 196  8 : int b_seen = 0;
 197  8 : const char *p_value = NULL;
 198  8 : const char *q_value = NULL;
 199  8 : int non_options_count = 0;
 200  : const char *non_options[10];
 201  8 : int unrecognized = 0;
 202  : bool output;
 203  8 : int argc = 0;
 204  : const char *argv[10];
 205  : 
 206  8 : argv[argc++] = "program";
 207  8 : argv[argc++] = "-ab";
 208  8 : argv[argc++] = "-a";
 209  8 : argv[argc++] = "foo";
 210  8 : argv[argc++] = "bar";
 211  8 : argv[argc] = NULL;
 212  8 : optind = start;
 213  8 : opterr = 1;
 214  8 : getopt_loop (argc, argv, "ab",
 215  : &a_seen, &b_seen, &p_value, &q_value,
 216  : &non_options_count, non_options, &unrecognized, &output);
 217  8 : ASSERT (a_seen == 2);
 218  8 : ASSERT (b_seen == 1);
 219  8 : ASSERT (p_value == NULL);
 220  8 : ASSERT (q_value == NULL);
 221  8 : ASSERT (non_options_count == 0);
 222  8 : ASSERT (unrecognized == 0);
 223  8 : ASSERT (optind == 3);
 224  8 : ASSERT (!output);
 225  : }
 226  : 
 227  : /* Test processing of options with arguments. */
 228  12 : for (start = OPTIND_MIN; start <= 1; start++)
 229  : {
 230  8 : int a_seen = 0;
 231  8 : int b_seen = 0;
 232  8 : const char *p_value = NULL;
 233  8 : const char *q_value = NULL;
 234  8 : int non_options_count = 0;
 235  : const char *non_options[10];
 236  8 : int unrecognized = 0;
 237  : bool output;
 238  8 : int argc = 0;
 239  : const char *argv[10];
 240  : 
 241  8 : argv[argc++] = "program";
 242  8 : argv[argc++] = "-pfoo";
 243  8 : argv[argc++] = "bar";
 244  8 : argv[argc] = NULL;
 245  8 : optind = start;
 246  8 : opterr = 1;
 247  8 : getopt_loop (argc, argv, "p:q:",
 248  : &a_seen, &b_seen, &p_value, &q_value,
 249  : &non_options_count, non_options, &unrecognized, &output);
 250  8 : ASSERT (a_seen == 0);
 251  8 : ASSERT (b_seen == 0);
 252  8 : ASSERT (p_value != NULL && strcmp (p_value, "foo") == 0);
 253  8 : ASSERT (q_value == NULL);
 254  8 : ASSERT (non_options_count == 0);
 255  8 : ASSERT (unrecognized == 0);
 256  8 : ASSERT (optind == 2);
 257  8 : ASSERT (!output);
 258  : }
 259  12 : for (start = OPTIND_MIN; start <= 1; start++)
 260  : {
 261  8 : int a_seen = 0;
 262  8 : int b_seen = 0;
 263  8 : const char *p_value = NULL;
 264  8 : const char *q_value = NULL;
 265  8 : int non_options_count = 0;
 266  : const char *non_options[10];
 267  8 : int unrecognized = 0;
 268  : bool output;
 269  8 : int argc = 0;
 270  : const char *argv[10];
 271  : 
 272  8 : argv[argc++] = "program";
 273  8 : argv[argc++] = "-p";
 274  8 : argv[argc++] = "foo";
 275  8 : argv[argc++] = "bar";
 276  8 : argv[argc] = NULL;
 277  8 : optind = start;
 278  8 : opterr = 1;
 279  8 : getopt_loop (argc, argv, "p:q:",
 280  : &a_seen, &b_seen, &p_value, &q_value,
 281  : &non_options_count, non_options, &unrecognized, &output);
 282  8 : ASSERT (a_seen == 0);
 283  8 : ASSERT (b_seen == 0);
 284  8 : ASSERT (p_value != NULL && strcmp (p_value, "foo") == 0);
 285  8 : ASSERT (q_value == NULL);
 286  8 : ASSERT (non_options_count == 0);
 287  8 : ASSERT (unrecognized == 0);
 288  8 : ASSERT (optind == 3);
 289  8 : ASSERT (!output);
 290  : }
 291  12 : for (start = OPTIND_MIN; start <= 1; start++)
 292  : {
 293  8 : int a_seen = 0;
 294  8 : int b_seen = 0;
 295  8 : const char *p_value = NULL;
 296  8 : const char *q_value = NULL;
 297  8 : int non_options_count = 0;
 298  : const char *non_options[10];
 299  8 : int unrecognized = 0;
 300  : bool output;
 301  8 : int argc = 0;
 302  : const char *argv[10];
 303  : 
 304  8 : argv[argc++] = "program";
 305  8 : argv[argc++] = "-ab";
 306  8 : argv[argc++] = "-q";
 307  8 : argv[argc++] = "baz";
 308  8 : argv[argc++] = "-pfoo";
 309  8 : argv[argc++] = "bar";
 310  8 : argv[argc] = NULL;
 311  8 : optind = start;
 312  8 : opterr = 1;
 313  8 : getopt_loop (argc, argv, "abp:q:",
 314  : &a_seen, &b_seen, &p_value, &q_value,
 315  : &non_options_count, non_options, &unrecognized, &output);
 316  8 : ASSERT (a_seen == 1);
 317  8 : ASSERT (b_seen == 1);
 318  8 : ASSERT (p_value != NULL && strcmp (p_value, "foo") == 0);
 319  8 : ASSERT (q_value != NULL && strcmp (q_value, "baz") == 0);
 320  8 : ASSERT (non_options_count == 0);
 321  8 : ASSERT (unrecognized == 0);
 322  8 : ASSERT (optind == 5);
 323  8 : ASSERT (!output);
 324  : }
 325  : 
 326  : #if GNULIB_TEST_GETOPT_GNU
 327  : /* Test processing of options with optional arguments. */
 328  : for (start = OPTIND_MIN; start <= 1; start++)
 329  : {
 330  : int a_seen = 0;
 331  : int b_seen = 0;
 332  : const char *p_value = NULL;
 333  : const char *q_value = NULL;
 334  : int non_options_count = 0;
 335  : const char *non_options[10];
 336  : int unrecognized = 0;
 337  : bool output;
 338  : int argc = 0;
 339  : const char *argv[10];
 340  : 
 341  : argv[argc++] = "program";
 342  : argv[argc++] = "-pfoo";
 343  : argv[argc++] = "bar";
 344  : argv[argc] = NULL;
 345  : optind = start;
 346  : opterr = 1;
 347  : getopt_loop (argc, argv, "p::q::",
 348  : &a_seen, &b_seen, &p_value, &q_value,
 349  : &non_options_count, non_options, &unrecognized, &output);
 350  : ASSERT (a_seen == 0);
 351  : ASSERT (b_seen == 0);
 352  : ASSERT (p_value != NULL && strcmp (p_value, "foo") == 0);
 353  : ASSERT (q_value == NULL);
 354  : ASSERT (non_options_count == 0);
 355  : ASSERT (unrecognized == 0);
 356  : ASSERT (optind == 2);
 357  : ASSERT (!output);
 358  : }
 359  : for (start = OPTIND_MIN; start <= 1; start++)
 360  : {
 361  : int a_seen = 0;
 362  : int b_seen = 0;
 363  : const char *p_value = NULL;
 364  : const char *q_value = NULL;
 365  : int non_options_count = 0;
 366  : const char *non_options[10];
 367  : int unrecognized = 0;
 368  : bool output;
 369  : int argc = 0;
 370  : const char *argv[10];
 371  : 
 372  : argv[argc++] = "program";
 373  : argv[argc++] = "-p";
 374  : argv[argc++] = "foo";
 375  : argv[argc++] = "bar";
 376  : argv[argc] = NULL;
 377  : optind = start;
 378  : opterr = 1;
 379  : getopt_loop (argc, argv, "p::q::",
 380  : &a_seen, &b_seen, &p_value, &q_value,
 381  : &non_options_count, non_options, &unrecognized, &output);
 382  : ASSERT (a_seen == 0);
 383  : ASSERT (b_seen == 0);
 384  : ASSERT (p_value == NULL);
 385  : ASSERT (q_value == NULL);
 386  : ASSERT (non_options_count == 0);
 387  : ASSERT (unrecognized == 0);
 388  : ASSERT (optind == 2);
 389  : ASSERT (!output);
 390  : }
 391  : for (start = OPTIND_MIN; start <= 1; start++)
 392  : {
 393  : int a_seen = 0;
 394  : int b_seen = 0;
 395  : const char *p_value = NULL;
 396  : const char *q_value = NULL;
 397  : int non_options_count = 0;
 398  : const char *non_options[10];
 399  : int unrecognized = 0;
 400  : bool output;
 401  : int argc = 0;
 402  : const char *argv[10];
 403  : 
 404  : argv[argc++] = "program";
 405  : argv[argc++] = "-p";
 406  : argv[argc++] = "-a";
 407  : argv[argc++] = "bar";
 408  : argv[argc] = NULL;
 409  : optind = start;
 410  : opterr = 1;
 411  : getopt_loop (argc, argv, "abp::q::",
 412  : &a_seen, &b_seen, &p_value, &q_value,
 413  : &non_options_count, non_options, &unrecognized, &output);
 414  : ASSERT (a_seen == 1);
 415  : ASSERT (b_seen == 0);
 416  : ASSERT (p_value == NULL);
 417  : ASSERT (q_value == NULL);
 418  : ASSERT (non_options_count == 0);
 419  : ASSERT (unrecognized == 0);
 420  : ASSERT (optind == 3);
 421  : ASSERT (!output);
 422  : }
 423  : #endif /* GNULIB_TEST_GETOPT_GNU */
 424  : 
 425  : /* Check that invalid options are recognized; and that both opterr
 426  : and leading ':' can silence output. */
 427  12 : for (start = OPTIND_MIN; start <= 1; start++)
 428  : {
 429  8 : int a_seen = 0;
 430  8 : int b_seen = 0;
 431  8 : const char *p_value = NULL;
 432  8 : const char *q_value = NULL;
 433  8 : int non_options_count = 0;
 434  : const char *non_options[10];
 435  8 : int unrecognized = 0;
 436  : bool output;
 437  8 : int argc = 0;
 438  : const char *argv[10];
 439  : 
 440  8 : argv[argc++] = "program";
 441  8 : argv[argc++] = "-p";
 442  8 : argv[argc++] = "foo";
 443  8 : argv[argc++] = "-x";
 444  8 : argv[argc++] = "-a";
 445  8 : argv[argc++] = "bar";
 446  8 : argv[argc] = NULL;
 447  8 : optind = start;
 448  8 : opterr = 42;
 449  8 : getopt_loop (argc, argv, "abp:q:",
 450  : &a_seen, &b_seen, &p_value, &q_value,
 451  : &non_options_count, non_options, &unrecognized, &output);
 452  8 : ASSERT (a_seen == 1);
 453  8 : ASSERT (b_seen == 0);
 454  8 : ASSERT (p_value != NULL && strcmp (p_value, "foo") == 0);
 455  8 : ASSERT (q_value == NULL);
 456  8 : ASSERT (non_options_count == 0);
 457  8 : ASSERT (unrecognized == 'x');
 458  8 : ASSERT (optind == 5);
 459  8 : ASSERT (output);
 460  : }
 461  12 : for (start = OPTIND_MIN; start <= 1; start++)
 462  : {
 463  8 : int a_seen = 0;
 464  8 : int b_seen = 0;
 465  8 : const char *p_value = NULL;
 466  8 : const char *q_value = NULL;
 467  8 : int non_options_count = 0;
 468  : const char *non_options[10];
 469  8 : int unrecognized = 0;
 470  : bool output;
 471  8 : int argc = 0;
 472  : const char *argv[10];
 473  : 
 474  8 : argv[argc++] = "program";
 475  8 : argv[argc++] = "-p";
 476  8 : argv[argc++] = "foo";
 477  8 : argv[argc++] = "-x";
 478  8 : argv[argc++] = "-a";
 479  8 : argv[argc++] = "bar";
 480  8 : argv[argc] = NULL;
 481  8 : optind = start;
 482  8 : opterr = 0;
 483  8 : getopt_loop (argc, argv, "abp:q:",
 484  : &a_seen, &b_seen, &p_value, &q_value,
 485  : &non_options_count, non_options, &unrecognized, &output);
 486  8 : ASSERT (a_seen == 1);
 487  8 : ASSERT (b_seen == 0);
 488  8 : ASSERT (p_value != NULL && strcmp (p_value, "foo") == 0);
 489  8 : ASSERT (q_value == NULL);
 490  8 : ASSERT (non_options_count == 0);
 491  8 : ASSERT (unrecognized == 'x');
 492  8 : ASSERT (optind == 5);
 493  8 : ASSERT (!output);
 494  : }
 495  12 : for (start = OPTIND_MIN; start <= 1; start++)
 496  : {
 497  8 : int a_seen = 0;
 498  8 : int b_seen = 0;
 499  8 : const char *p_value = NULL;
 500  8 : const char *q_value = NULL;
 501  8 : int non_options_count = 0;
 502  : const char *non_options[10];
 503  8 : int unrecognized = 0;
 504  : bool output;
 505  8 : int argc = 0;
 506  : const char *argv[10];
 507  : 
 508  8 : argv[argc++] = "program";
 509  8 : argv[argc++] = "-p";
 510  8 : argv[argc++] = "foo";
 511  8 : argv[argc++] = "-x";
 512  8 : argv[argc++] = "-a";
 513  8 : argv[argc++] = "bar";
 514  8 : argv[argc] = NULL;
 515  8 : optind = start;
 516  8 : opterr = 1;
 517  8 : getopt_loop (argc, argv, ":abp:q:",
 518  : &a_seen, &b_seen, &p_value, &q_value,
 519  : &non_options_count, non_options, &unrecognized, &output);
 520  8 : ASSERT (a_seen == 1);
 521  8 : ASSERT (b_seen == 0);
 522  8 : ASSERT (p_value != NULL && strcmp (p_value, "foo") == 0);
 523  8 : ASSERT (q_value == NULL);
 524  8 : ASSERT (non_options_count == 0);
 525  8 : ASSERT (unrecognized == 'x');
 526  8 : ASSERT (optind == 5);
 527  8 : ASSERT (!output);
 528  : }
 529  12 : for (start = OPTIND_MIN; start <= 1; start++)
 530  : {
 531  8 : int a_seen = 0;
 532  8 : int b_seen = 0;
 533  8 : const char *p_value = NULL;
 534  8 : const char *q_value = NULL;
 535  8 : int non_options_count = 0;
 536  : const char *non_options[10];
 537  8 : int unrecognized = 0;
 538  : bool output;
 539  8 : int argc = 0;
 540  : const char *argv[10];
 541  : 
 542  8 : argv[argc++] = "program";
 543  8 : argv[argc++] = "-p";
 544  8 : argv[argc++] = "foo";
 545  8 : argv[argc++] = "-:";
 546  8 : argv[argc++] = "-a";
 547  8 : argv[argc++] = "bar";
 548  8 : argv[argc] = NULL;
 549  8 : optind = start;
 550  8 : opterr = 42;
 551  8 : getopt_loop (argc, argv, "abp:q:",
 552  : &a_seen, &b_seen, &p_value, &q_value,
 553  : &non_options_count, non_options, &unrecognized, &output);
 554  8 : ASSERT (a_seen == 1);
 555  8 : ASSERT (b_seen == 0);
 556  8 : ASSERT (p_value != NULL && strcmp (p_value, "foo") == 0);
 557  8 : ASSERT (q_value == NULL);
 558  8 : ASSERT (non_options_count == 0);
 559  8 : ASSERT (unrecognized == ':');
 560  8 : ASSERT (optind == 5);
 561  8 : ASSERT (output);
 562  : }
 563  12 : for (start = OPTIND_MIN; start <= 1; start++)
 564  : {
 565  8 : int a_seen = 0;
 566  8 : int b_seen = 0;
 567  8 : const char *p_value = NULL;
 568  8 : const char *q_value = NULL;
 569  8 : int non_options_count = 0;
 570  : const char *non_options[10];
 571  8 : int unrecognized = 0;
 572  : bool output;
 573  8 : int argc = 0;
 574  : const char *argv[10];
 575  : 
 576  8 : argv[argc++] = "program";
 577  8 : argv[argc++] = "-p";
 578  8 : argv[argc++] = "foo";
 579  8 : argv[argc++] = "-:";
 580  8 : argv[argc++] = "-a";
 581  8 : argv[argc++] = "bar";
 582  8 : argv[argc] = NULL;
 583  8 : optind = start;
 584  8 : opterr = 0;
 585  8 : getopt_loop (argc, argv, "abp:q:",
 586  : &a_seen, &b_seen, &p_value, &q_value,
 587  : &non_options_count, non_options, &unrecognized, &output);
 588  8 : ASSERT (a_seen == 1);
 589  8 : ASSERT (b_seen == 0);
 590  8 : ASSERT (p_value != NULL && strcmp (p_value, "foo") == 0);
 591  8 : ASSERT (q_value == NULL);
 592  8 : ASSERT (non_options_count == 0);
 593  8 : ASSERT (unrecognized == ':');
 594  8 : ASSERT (optind == 5);
 595  8 : ASSERT (!output);
 596  : }
 597  12 : for (start = OPTIND_MIN; start <= 1; start++)
 598  : {
 599  8 : int a_seen = 0;
 600  8 : int b_seen = 0;
 601  8 : const char *p_value = NULL;
 602  8 : const char *q_value = NULL;
 603  8 : int non_options_count = 0;
 604  : const char *non_options[10];
 605  8 : int unrecognized = 0;
 606  : bool output;
 607  8 : int argc = 0;
 608  : const char *argv[10];
 609  : 
 610  8 : argv[argc++] = "program";
 611  8 : argv[argc++] = "-p";
 612  8 : argv[argc++] = "foo";
 613  8 : argv[argc++] = "-:";
 614  8 : argv[argc++] = "-a";
 615  8 : argv[argc++] = "bar";
 616  8 : argv[argc] = NULL;
 617  8 : optind = start;
 618  8 : opterr = 1;
 619  8 : getopt_loop (argc, argv, ":abp:q:",
 620  : &a_seen, &b_seen, &p_value, &q_value,
 621  : &non_options_count, non_options, &unrecognized, &output);
 622  8 : ASSERT (a_seen == 1);
 623  8 : ASSERT (b_seen == 0);
 624  8 : ASSERT (p_value != NULL && strcmp (p_value, "foo") == 0);
 625  8 : ASSERT (q_value == NULL);
 626  8 : ASSERT (non_options_count == 0);
 627  8 : ASSERT (unrecognized == ':');
 628  8 : ASSERT (optind == 5);
 629  8 : ASSERT (!output);
 630  : }
 631  : 
 632  : /* Check for missing argument behavior. */
 633  12 : for (start = OPTIND_MIN; start <= 1; start++)
 634  : {
 635  8 : int a_seen = 0;
 636  8 : int b_seen = 0;
 637  8 : const char *p_value = NULL;
 638  8 : const char *q_value = NULL;
 639  8 : int non_options_count = 0;
 640  : const char *non_options[10];
 641  8 : int unrecognized = 0;
 642  : bool output;
 643  8 : int argc = 0;
 644  : const char *argv[10];
 645  : 
 646  8 : argv[argc++] = "program";
 647  8 : argv[argc++] = "-ap";
 648  8 : argv[argc] = NULL;
 649  8 : optind = start;
 650  8 : opterr = 1;
 651  8 : getopt_loop (argc, argv, "abp:q:",
 652  : &a_seen, &b_seen, &p_value, &q_value,
 653  : &non_options_count, non_options, &unrecognized, &output);
 654  8 : ASSERT (a_seen == 1);
 655  8 : ASSERT (b_seen == 0);
 656  8 : ASSERT (p_value == NULL);
 657  8 : ASSERT (q_value == NULL);
 658  8 : ASSERT (non_options_count == 0);
 659  8 : ASSERT (unrecognized == 'p');
 660  8 : ASSERT (optind == 2);
 661  8 : ASSERT (output);
 662  : }
 663  12 : for (start = OPTIND_MIN; start <= 1; start++)
 664  : {
 665  8 : int a_seen = 0;
 666  8 : int b_seen = 0;
 667  8 : const char *p_value = NULL;
 668  8 : const char *q_value = NULL;
 669  8 : int non_options_count = 0;
 670  : const char *non_options[10];
 671  8 : int unrecognized = 0;
 672  : bool output;
 673  8 : int argc = 0;
 674  : const char *argv[10];
 675  : 
 676  8 : argv[argc++] = "program";
 677  8 : argv[argc++] = "-ap";
 678  8 : argv[argc] = NULL;
 679  8 : optind = start;
 680  8 : opterr = 0;
 681  8 : getopt_loop (argc, argv, "abp:q:",
 682  : &a_seen, &b_seen, &p_value, &q_value,
 683  : &non_options_count, non_options, &unrecognized, &output);
 684  8 : ASSERT (a_seen == 1);
 685  8 : ASSERT (b_seen == 0);
 686  8 : ASSERT (p_value == NULL);
 687  8 : ASSERT (q_value == NULL);
 688  8 : ASSERT (non_options_count == 0);
 689  8 : ASSERT (unrecognized == 'p');
 690  8 : ASSERT (optind == 2);
 691  8 : ASSERT (!output);
 692  : }
 693  12 : for (start = OPTIND_MIN; start <= 1; start++)
 694  : {
 695  8 : int a_seen = 0;
 696  8 : int b_seen = 0;
 697  8 : const char *p_value = NULL;
 698  8 : const char *q_value = NULL;
 699  8 : int non_options_count = 0;
 700  : const char *non_options[10];
 701  8 : int unrecognized = 0;
 702  : bool output;
 703  8 : int argc = 0;
 704  : const char *argv[10];
 705  : 
 706  8 : argv[argc++] = "program";
 707  8 : argv[argc++] = "-ap";
 708  8 : argv[argc] = NULL;
 709  8 : optind = start;
 710  8 : opterr = 1;
 711  8 : getopt_loop (argc, argv, ":abp:q:",
 712  : &a_seen, &b_seen, &p_value, &q_value,
 713  : &non_options_count, non_options, &unrecognized, &output);
 714  8 : ASSERT (a_seen == 1);
 715  8 : ASSERT (b_seen == 0);
 716  8 : ASSERT (p_value == NULL);
 717  8 : ASSERT (q_value == NULL);
 718  8 : ASSERT (non_options_count == 0);
 719  8 : ASSERT (unrecognized == 'p');
 720  8 : ASSERT (optind == 2);
 721  8 : ASSERT (!output);
 722  : }
 723  : 
 724  : /* Check that by default, non-options arguments are moved to the end. */
 725  12 : for (start = OPTIND_MIN; start <= 1; start++)
 726  : {
 727  8 : int a_seen = 0;
 728  8 : int b_seen = 0;
 729  8 : const char *p_value = NULL;
 730  8 : const char *q_value = NULL;
 731  8 : int non_options_count = 0;
 732  : const char *non_options[10];
 733  8 : int unrecognized = 0;
 734  : bool output;
 735  8 : int argc = 0;
 736  : const char *argv[10];
 737  : 
 738  8 : argv[argc++] = "program";
 739  8 : argv[argc++] = "donald";
 740  8 : argv[argc++] = "-p";
 741  8 : argv[argc++] = "billy";
 742  8 : argv[argc++] = "duck";
 743  8 : argv[argc++] = "-a";
 744  8 : argv[argc++] = "bar";
 745  8 : argv[argc] = NULL;
 746  8 : optind = start;
 747  8 : opterr = 1;
 748  8 : getopt_loop (argc, argv, "abp:q:",
 749  : &a_seen, &b_seen, &p_value, &q_value,
 750  : &non_options_count, non_options, &unrecognized, &output);
 751  8 : if (posixly)
 752  : {
 753  4 : ASSERT (strcmp (argv[0], "program") == 0);
 754  4 : ASSERT (strcmp (argv[1], "donald") == 0);
 755  4 : ASSERT (strcmp (argv[2], "-p") == 0);
 756  4 : ASSERT (strcmp (argv[3], "billy") == 0);
 757  4 : ASSERT (strcmp (argv[4], "duck") == 0);
 758  4 : ASSERT (strcmp (argv[5], "-a") == 0);
 759  4 : ASSERT (strcmp (argv[6], "bar") == 0);
 760  4 : ASSERT (argv[7] == NULL);
 761  4 : ASSERT (a_seen == 0);
 762  4 : ASSERT (b_seen == 0);
 763  4 : ASSERT (p_value == NULL);
 764  4 : ASSERT (q_value == NULL);
 765  4 : ASSERT (non_options_count == 0);
 766  4 : ASSERT (unrecognized == 0);
 767  4 : ASSERT (optind == 1);
 768  4 : ASSERT (!output);
 769  : }
 770  : else
 771  : {
 772  4 : ASSERT (strcmp (argv[0], "program") == 0);
 773  4 : ASSERT (strcmp (argv[1], "-p") == 0);
 774  4 : ASSERT (strcmp (argv[2], "billy") == 0);
 775  4 : ASSERT (strcmp (argv[3], "-a") == 0);
 776  4 : ASSERT (strcmp (argv[4], "donald") == 0);
 777  4 : ASSERT (strcmp (argv[5], "duck") == 0);
 778  4 : ASSERT (strcmp (argv[6], "bar") == 0);
 779  4 : ASSERT (argv[7] == NULL);
 780  4 : ASSERT (a_seen == 1);
 781  4 : ASSERT (b_seen == 0);
 782  4 : ASSERT (p_value != NULL && strcmp (p_value, "billy") == 0);
 783  4 : ASSERT (q_value == NULL);
 784  4 : ASSERT (non_options_count == 0);
 785  4 : ASSERT (unrecognized == 0);
 786  4 : ASSERT (optind == 4);
 787  4 : ASSERT (!output);
 788  : }
 789  : }
 790  : 
 791  : /* Check that '--' ends the argument processing. */
 792  12 : for (start = OPTIND_MIN; start <= 1; start++)
 793  : {
 794  8 : int a_seen = 0;
 795  8 : int b_seen = 0;
 796  8 : const char *p_value = NULL;
 797  8 : const char *q_value = NULL;
 798  8 : int non_options_count = 0;
 799  : const char *non_options[10];
 800  8 : int unrecognized = 0;
 801  : bool output;
 802  8 : int argc = 0;
 803  : const char *argv[20];
 804  : 
 805  8 : argv[argc++] = "program";
 806  8 : argv[argc++] = "donald";
 807  8 : argv[argc++] = "-p";
 808  8 : argv[argc++] = "billy";
 809  8 : argv[argc++] = "duck";
 810  8 : argv[argc++] = "-a";
 811  8 : argv[argc++] = "--";
 812  8 : argv[argc++] = "-b";
 813  8 : argv[argc++] = "foo";
 814  8 : argv[argc++] = "-q";
 815  8 : argv[argc++] = "johnny";
 816  8 : argv[argc++] = "bar";
 817  8 : argv[argc] = NULL;
 818  8 : optind = start;
 819  8 : opterr = 1;
 820  8 : getopt_loop (argc, argv, "abp:q:",
 821  : &a_seen, &b_seen, &p_value, &q_value,
 822  : &non_options_count, non_options, &unrecognized, &output);
 823  8 : if (posixly)
 824  : {
 825  4 : ASSERT (strcmp (argv[0], "program") == 0);
 826  4 : ASSERT (strcmp (argv[1], "donald") == 0);
 827  4 : ASSERT (strcmp (argv[2], "-p") == 0);
 828  4 : ASSERT (strcmp (argv[3], "billy") == 0);
 829  4 : ASSERT (strcmp (argv[4], "duck") == 0);
 830  4 : ASSERT (strcmp (argv[5], "-a") == 0);
 831  4 : ASSERT (strcmp (argv[6], "--") == 0);
 832  4 : ASSERT (strcmp (argv[7], "-b") == 0);
 833  4 : ASSERT (strcmp (argv[8], "foo") == 0);
 834  4 : ASSERT (strcmp (argv[9], "-q") == 0);
 835  4 : ASSERT (strcmp (argv[10], "johnny") == 0);
 836  4 : ASSERT (strcmp (argv[11], "bar") == 0);
 837  4 : ASSERT (argv[12] == NULL);
 838  4 : ASSERT (a_seen == 0);
 839  4 : ASSERT (b_seen == 0);
 840  4 : ASSERT (p_value == NULL);
 841  4 : ASSERT (q_value == NULL);
 842  4 : ASSERT (non_options_count == 0);
 843  4 : ASSERT (unrecognized == 0);
 844  4 : ASSERT (optind == 1);
 845  4 : ASSERT (!output);
 846  : }
 847  : else
 848  : {
 849  4 : ASSERT (strcmp (argv[0], "program") == 0);
 850  4 : ASSERT (strcmp (argv[1], "-p") == 0);
 851  4 : ASSERT (strcmp (argv[2], "billy") == 0);
 852  4 : ASSERT (strcmp (argv[3], "-a") == 0);
 853  4 : ASSERT (strcmp (argv[4], "--") == 0);
 854  4 : ASSERT (strcmp (argv[5], "donald") == 0);
 855  4 : ASSERT (strcmp (argv[6], "duck") == 0);
 856  4 : ASSERT (strcmp (argv[7], "-b") == 0);
 857  4 : ASSERT (strcmp (argv[8], "foo") == 0);
 858  4 : ASSERT (strcmp (argv[9], "-q") == 0);
 859  4 : ASSERT (strcmp (argv[10], "johnny") == 0);
 860  4 : ASSERT (strcmp (argv[11], "bar") == 0);
 861  4 : ASSERT (argv[12] == NULL);
 862  4 : ASSERT (a_seen == 1);
 863  4 : ASSERT (b_seen == 0);
 864  4 : ASSERT (p_value != NULL && strcmp (p_value, "billy") == 0);
 865  4 : ASSERT (q_value == NULL);
 866  4 : ASSERT (non_options_count == 0);
 867  4 : ASSERT (unrecognized == 0);
 868  4 : ASSERT (optind == 5);
 869  4 : ASSERT (!output);
 870  : }
 871  : }
 872  : 
 873  : #if GNULIB_TEST_GETOPT_GNU
 874  : /* Check that the '-' flag causes non-options to be returned in order. */
 875  : for (start = OPTIND_MIN; start <= 1; start++)
 876  : {
 877  : int a_seen = 0;
 878  : int b_seen = 0;
 879  : const char *p_value = NULL;
 880  : const char *q_value = NULL;
 881  : int non_options_count = 0;
 882  : const char *non_options[10];
 883  : int unrecognized = 0;
 884  : bool output;
 885  : int argc = 0;
 886  : const char *argv[10];
 887  : 
 888  : argv[argc++] = "program";
 889  : argv[argc++] = "donald";
 890  : argv[argc++] = "-p";
 891  : argv[argc++] = "billy";
 892  : argv[argc++] = "duck";
 893  : argv[argc++] = "-a";
 894  : argv[argc++] = "bar";
 895  : argv[argc] = NULL;
 896  : optind = start;
 897  : opterr = 1;
 898  : getopt_loop (argc, argv, "-abp:q:",
 899  : &a_seen, &b_seen, &p_value, &q_value,
 900  : &non_options_count, non_options, &unrecognized, &output);
 901  : ASSERT (strcmp (argv[0], "program") == 0);
 902  : ASSERT (strcmp (argv[1], "donald") == 0);
 903  : ASSERT (strcmp (argv[2], "-p") == 0);
 904  : ASSERT (strcmp (argv[3], "billy") == 0);
 905  : ASSERT (strcmp (argv[4], "duck") == 0);
 906  : ASSERT (strcmp (argv[5], "-a") == 0);
 907  : ASSERT (strcmp (argv[6], "bar") == 0);
 908  : ASSERT (argv[7] == NULL);
 909  : ASSERT (a_seen == 1);
 910  : ASSERT (b_seen == 0);
 911  : ASSERT (p_value != NULL && strcmp (p_value, "billy") == 0);
 912  : ASSERT (q_value == NULL);
 913  : ASSERT (non_options_count == 3);
 914  : ASSERT (strcmp (non_options[0], "donald") == 0);
 915  : ASSERT (strcmp (non_options[1], "duck") == 0);
 916  : ASSERT (strcmp (non_options[2], "bar") == 0);
 917  : ASSERT (unrecognized == 0);
 918  : ASSERT (optind == 7);
 919  : ASSERT (!output);
 920  : }
 921  : 
 922  : /* Check that '--' ends the argument processing. */
 923  : for (start = OPTIND_MIN; start <= 1; start++)
 924  : {
 925  : int a_seen = 0;
 926  : int b_seen = 0;
 927  : const char *p_value = NULL;
 928  : const char *q_value = NULL;
 929  : int non_options_count = 0;
 930  : const char *non_options[10];
 931  : int unrecognized = 0;
 932  : bool output;
 933  : int argc = 0;
 934  : const char *argv[20];
 935  : 
 936  : argv[argc++] = "program";
 937  : argv[argc++] = "donald";
 938  : argv[argc++] = "-p";
 939  : argv[argc++] = "billy";
 940  : argv[argc++] = "duck";
 941  : argv[argc++] = "-a";
 942  : argv[argc++] = "--";
 943  : argv[argc++] = "-b";
 944  : argv[argc++] = "foo";
 945  : argv[argc++] = "-q";
 946  : argv[argc++] = "johnny";
 947  : argv[argc++] = "bar";
 948  : argv[argc] = NULL;
 949  : optind = start;
 950  : opterr = 1;
 951  : getopt_loop (argc, argv, "-abp:q:",
 952  : &a_seen, &b_seen, &p_value, &q_value,
 953  : &non_options_count, non_options, &unrecognized, &output);
 954  : ASSERT (strcmp (argv[0], "program") == 0);
 955  : ASSERT (strcmp (argv[1], "donald") == 0);
 956  : ASSERT (strcmp (argv[2], "-p") == 0);
 957  : ASSERT (strcmp (argv[3], "billy") == 0);
 958  : ASSERT (strcmp (argv[4], "duck") == 0);
 959  : ASSERT (strcmp (argv[5], "-a") == 0);
 960  : ASSERT (strcmp (argv[6], "--") == 0);
 961  : ASSERT (strcmp (argv[7], "-b") == 0);
 962  : ASSERT (strcmp (argv[8], "foo") == 0);
 963  : ASSERT (strcmp (argv[9], "-q") == 0);
 964  : ASSERT (strcmp (argv[10], "johnny") == 0);
 965  : ASSERT (strcmp (argv[11], "bar") == 0);
 966  : ASSERT (argv[12] == NULL);
 967  : ASSERT (a_seen == 1);
 968  : ASSERT (b_seen == 0);
 969  : ASSERT (p_value != NULL && strcmp (p_value, "billy") == 0);
 970  : ASSERT (q_value == NULL);
 971  : ASSERT (!output);
 972  : if (non_options_count == 2)
 973  : {
 974  : /* glibc behaviour. */
 975  : ASSERT (non_options_count == 2);
 976  : ASSERT (strcmp (non_options[0], "donald") == 0);
 977  : ASSERT (strcmp (non_options[1], "duck") == 0);
 978  : ASSERT (unrecognized == 0);
 979  : ASSERT (optind == 7);
 980  : }
 981  : else
 982  : {
 983  : /* Another valid behaviour. */
 984  : ASSERT (non_options_count == 7);
 985  : ASSERT (strcmp (non_options[0], "donald") == 0);
 986  : ASSERT (strcmp (non_options[1], "duck") == 0);
 987  : ASSERT (strcmp (non_options[2], "-b") == 0);
 988  : ASSERT (strcmp (non_options[3], "foo") == 0);
 989  : ASSERT (strcmp (non_options[4], "-q") == 0);
 990  : ASSERT (strcmp (non_options[5], "johnny") == 0);
 991  : ASSERT (strcmp (non_options[6], "bar") == 0);
 992  : ASSERT (unrecognized == 0);
 993  : ASSERT (optind == 12);
 994  : }
 995  : }
 996  : 
 997  : /* Check that the '-' flag has to come first. */
 998  : for (start = OPTIND_MIN; start <= 1; start++)
 999  : {
 1000  : int a_seen = 0;
 1001  : int b_seen = 0;
 1002  : const char *p_value = NULL;
 1003  : const char *q_value = NULL;
 1004  : int non_options_count = 0;
 1005  : const char *non_options[10];
 1006  : int unrecognized = 0;
 1007  : bool output;
 1008  : int argc = 0;
 1009  : const char *argv[10];
 1010  : 
 1011  : argv[argc++] = "program";
 1012  : argv[argc++] = "donald";
 1013  : argv[argc++] = "-p";
 1014  : argv[argc++] = "billy";
 1015  : argv[argc++] = "duck";
 1016  : argv[argc++] = "-a";
 1017  : argv[argc++] = "bar";
 1018  : argv[argc] = NULL;
 1019  : optind = start;
 1020  : opterr = 1;
 1021  : getopt_loop (argc, argv, "abp:q:-",
 1022  : &a_seen, &b_seen, &p_value, &q_value,
 1023  : &non_options_count, non_options, &unrecognized, &output);
 1024  : if (posixly)
 1025  : {
 1026  : ASSERT (strcmp (argv[0], "program") == 0);
 1027  : ASSERT (strcmp (argv[1], "donald") == 0);
 1028  : ASSERT (strcmp (argv[2], "-p") == 0);
 1029  : ASSERT (strcmp (argv[3], "billy") == 0);
 1030  : ASSERT (strcmp (argv[4], "duck") == 0);
 1031  : ASSERT (strcmp (argv[5], "-a") == 0);
 1032  : ASSERT (strcmp (argv[6], "bar") == 0);
 1033  : ASSERT (argv[7] == NULL);
 1034  : ASSERT (a_seen == 0);
 1035  : ASSERT (b_seen == 0);
 1036  : ASSERT (p_value == NULL);
 1037  : ASSERT (q_value == NULL);
 1038  : ASSERT (non_options_count == 0);
 1039  : ASSERT (unrecognized == 0);
 1040  : ASSERT (optind == 1);
 1041  : ASSERT (!output);
 1042  : }
 1043  : else
 1044  : {
 1045  : ASSERT (strcmp (argv[0], "program") == 0);
 1046  : ASSERT (strcmp (argv[1], "-p") == 0);
 1047  : ASSERT (strcmp (argv[2], "billy") == 0);
 1048  : ASSERT (strcmp (argv[3], "-a") == 0);
 1049  : ASSERT (strcmp (argv[4], "donald") == 0);
 1050  : ASSERT (strcmp (argv[5], "duck") == 0);
 1051  : ASSERT (strcmp (argv[6], "bar") == 0);
 1052  : ASSERT (argv[7] == NULL);
 1053  : ASSERT (a_seen == 1);
 1054  : ASSERT (b_seen == 0);
 1055  : ASSERT (p_value != NULL && strcmp (p_value, "billy") == 0);
 1056  : ASSERT (q_value == NULL);
 1057  : ASSERT (non_options_count == 0);
 1058  : ASSERT (unrecognized == 0);
 1059  : ASSERT (optind == 4);
 1060  : ASSERT (!output);
 1061  : }
 1062  : }
 1063  : 
 1064  : /* Check that the '+' flag causes the first non-option to terminate the
 1065  : loop. */
 1066  : for (start = OPTIND_MIN; start <= 1; start++)
 1067  : {
 1068  : int a_seen = 0;
 1069  : int b_seen = 0;
 1070  : const char *p_value = NULL;
 1071  : const char *q_value = NULL;
 1072  : int non_options_count = 0;
 1073  : const char *non_options[10];
 1074  : int unrecognized = 0;
 1075  : bool output;
 1076  : int argc = 0;
 1077  : const char *argv[10];
 1078  : 
 1079  : argv[argc++] = "program";
 1080  : argv[argc++] = "donald";
 1081  : argv[argc++] = "-p";
 1082  : argv[argc++] = "billy";
 1083  : argv[argc++] = "duck";
 1084  : argv[argc++] = "-a";
 1085  : argv[argc++] = "bar";
 1086  : argv[argc] = NULL;
 1087  : optind = start;
 1088  : opterr = 1;
 1089  : getopt_loop (argc, argv, "+abp:q:",
 1090  : &a_seen, &b_seen, &p_value, &q_value,
 1091  : &non_options_count, non_options, &unrecognized, &output);
 1092  : ASSERT (strcmp (argv[0], "program") == 0);
 1093  : ASSERT (strcmp (argv[1], "donald") == 0);
 1094  : ASSERT (strcmp (argv[2], "-p") == 0);
 1095  : ASSERT (strcmp (argv[3], "billy") == 0);
 1096  : ASSERT (strcmp (argv[4], "duck") == 0);
 1097  : ASSERT (strcmp (argv[5], "-a") == 0);
 1098  : ASSERT (strcmp (argv[6], "bar") == 0);
 1099  : ASSERT (argv[7] == NULL);
 1100  : ASSERT (a_seen == 0);
 1101  : ASSERT (b_seen == 0);
 1102  : ASSERT (p_value == NULL);
 1103  : ASSERT (q_value == NULL);
 1104  : ASSERT (non_options_count == 0);
 1105  : ASSERT (unrecognized == 0);
 1106  : ASSERT (optind == 1);
 1107  : ASSERT (!output);
 1108  : }
 1109  : for (start = OPTIND_MIN; start <= 1; start++)
 1110  : {
 1111  : int a_seen = 0;
 1112  : int b_seen = 0;
 1113  : const char *p_value = NULL;
 1114  : const char *q_value = NULL;
 1115  : int non_options_count = 0;
 1116  : const char *non_options[10];
 1117  : int unrecognized = 0;
 1118  : bool output;
 1119  : int argc = 0;
 1120  : const char *argv[10];
 1121  : 
 1122  : argv[argc++] = "program";
 1123  : argv[argc++] = "-+";
 1124  : argv[argc] = NULL;
 1125  : optind = start;
 1126  : getopt_loop (argc, argv, "+abp:q:",
 1127  : &a_seen, &b_seen, &p_value, &q_value,
 1128  : &non_options_count, non_options, &unrecognized, &output);
 1129  : ASSERT (a_seen == 0);
 1130  : ASSERT (b_seen == 0);
 1131  : ASSERT (p_value == NULL);
 1132  : ASSERT (q_value == NULL);
 1133  : ASSERT (non_options_count == 0);
 1134  : ASSERT (unrecognized == '+');
 1135  : ASSERT (optind == 2);
 1136  : ASSERT (output);
 1137  : }
 1138  : 
 1139  : /* Check that '--' ends the argument processing. */
 1140  : for (start = OPTIND_MIN; start <= 1; start++)
 1141  : {
 1142  : int a_seen = 0;
 1143  : int b_seen = 0;
 1144  : const char *p_value = NULL;
 1145  : const char *q_value = NULL;
 1146  : int non_options_count = 0;
 1147  : const char *non_options[10];
 1148  : int unrecognized = 0;
 1149  : bool output;
 1150  : int argc = 0;
 1151  : const char *argv[20];
 1152  : 
 1153  : argv[argc++] = "program";
 1154  : argv[argc++] = "donald";
 1155  : argv[argc++] = "-p";
 1156  : argv[argc++] = "billy";
 1157  : argv[argc++] = "duck";
 1158  : argv[argc++] = "-a";
 1159  : argv[argc++] = "--";
 1160  : argv[argc++] = "-b";
 1161  : argv[argc++] = "foo";
 1162  : argv[argc++] = "-q";
 1163  : argv[argc++] = "johnny";
 1164  : argv[argc++] = "bar";
 1165  : argv[argc] = NULL;
 1166  : optind = start;
 1167  : opterr = 1;
 1168  : getopt_loop (argc, argv, "+abp:q:",
 1169  : &a_seen, &b_seen, &p_value, &q_value,
 1170  : &non_options_count, non_options, &unrecognized, &output);
 1171  : ASSERT (strcmp (argv[0], "program") == 0);
 1172  : ASSERT (strcmp (argv[1], "donald") == 0);
 1173  : ASSERT (strcmp (argv[2], "-p") == 0);
 1174  : ASSERT (strcmp (argv[3], "billy") == 0);
 1175  : ASSERT (strcmp (argv[4], "duck") == 0);
 1176  : ASSERT (strcmp (argv[5], "-a") == 0);
 1177  : ASSERT (strcmp (argv[6], "--") == 0);
 1178  : ASSERT (strcmp (argv[7], "-b") == 0);
 1179  : ASSERT (strcmp (argv[8], "foo") == 0);
 1180  : ASSERT (strcmp (argv[9], "-q") == 0);
 1181  : ASSERT (strcmp (argv[10], "johnny") == 0);
 1182  : ASSERT (strcmp (argv[11], "bar") == 0);
 1183  : ASSERT (argv[12] == NULL);
 1184  : ASSERT (a_seen == 0);
 1185  : ASSERT (b_seen == 0);
 1186  : ASSERT (p_value == NULL);
 1187  : ASSERT (q_value == NULL);
 1188  : ASSERT (non_options_count == 0);
 1189  : ASSERT (unrecognized == 0);
 1190  : ASSERT (optind == 1);
 1191  : ASSERT (!output);
 1192  : }
 1193  : #endif /* GNULIB_TEST_GETOPT_GNU */
 1194  : 
 1195  : /* Check that the '+' flag has to come first. */
 1196  12 : for (start = OPTIND_MIN; start <= 1; start++)
 1197  : {
 1198  8 : int a_seen = 0;
 1199  8 : int b_seen = 0;
 1200  8 : const char *p_value = NULL;
 1201  8 : const char *q_value = NULL;
 1202  8 : int non_options_count = 0;
 1203  : const char *non_options[10];
 1204  8 : int unrecognized = 0;
 1205  : bool output;
 1206  8 : int argc = 0;
 1207  : const char *argv[10];
 1208  : 
 1209  8 : argv[argc++] = "program";
 1210  8 : argv[argc++] = "donald";
 1211  8 : argv[argc++] = "-p";
 1212  8 : argv[argc++] = "billy";
 1213  8 : argv[argc++] = "duck";
 1214  8 : argv[argc++] = "-a";
 1215  8 : argv[argc++] = "bar";
 1216  8 : argv[argc] = NULL;
 1217  8 : optind = start;
 1218  8 : opterr = 1;
 1219  8 : getopt_loop (argc, argv, "abp:q:+",
 1220  : &a_seen, &b_seen, &p_value, &q_value,
 1221  : &non_options_count, non_options, &unrecognized, &output);
 1222  8 : if (posixly)
 1223  : {
 1224  4 : ASSERT (strcmp (argv[0], "program") == 0);
 1225  4 : ASSERT (strcmp (argv[1], "donald") == 0);
 1226  4 : ASSERT (strcmp (argv[2], "-p") == 0);
 1227  4 : ASSERT (strcmp (argv[3], "billy") == 0);
 1228  4 : ASSERT (strcmp (argv[4], "duck") == 0);
 1229  4 : ASSERT (strcmp (argv[5], "-a") == 0);
 1230  4 : ASSERT (strcmp (argv[6], "bar") == 0);
 1231  4 : ASSERT (argv[7] == NULL);
 1232  4 : ASSERT (a_seen == 0);
 1233  4 : ASSERT (b_seen == 0);
 1234  4 : ASSERT (p_value == NULL);
 1235  4 : ASSERT (q_value == NULL);
 1236  4 : ASSERT (non_options_count == 0);
 1237  4 : ASSERT (unrecognized == 0);
 1238  4 : ASSERT (optind == 1);
 1239  4 : ASSERT (!output);
 1240  : }
 1241  : else
 1242  : {
 1243  4 : ASSERT (strcmp (argv[0], "program") == 0);
 1244  4 : ASSERT (strcmp (argv[1], "-p") == 0);
 1245  4 : ASSERT (strcmp (argv[2], "billy") == 0);
 1246  4 : ASSERT (strcmp (argv[3], "-a") == 0);
 1247  4 : ASSERT (strcmp (argv[4], "donald") == 0);
 1248  4 : ASSERT (strcmp (argv[5], "duck") == 0);
 1249  4 : ASSERT (strcmp (argv[6], "bar") == 0);
 1250  4 : ASSERT (argv[7] == NULL);
 1251  4 : ASSERT (a_seen == 1);
 1252  4 : ASSERT (b_seen == 0);
 1253  4 : ASSERT (p_value != NULL && strcmp (p_value, "billy") == 0);
 1254  4 : ASSERT (q_value == NULL);
 1255  4 : ASSERT (non_options_count == 0);
 1256  4 : ASSERT (unrecognized == 0);
 1257  4 : ASSERT (optind == 4);
 1258  4 : ASSERT (!output);
 1259  : }
 1260  : }
 1261  : 
 1262  : #if GNULIB_TEST_GETOPT_GNU
 1263  : /* If GNU extensions are supported, require compliance with POSIX
 1264  : interpretation on leading '+' behavior.
 1265  : http://austingroupbugs.net/view.php?id=191 */
 1266  : for (start = OPTIND_MIN; start <= 1; start++)
 1267  : {
 1268  : int a_seen = 0;
 1269  : int b_seen = 0;
 1270  : const char *p_value = NULL;
 1271  : const char *q_value = NULL;
 1272  : int non_options_count = 0;
 1273  : const char *non_options[10];
 1274  : int unrecognized = 0;
 1275  : bool output;
 1276  : int argc = 0;
 1277  : const char *argv[10];
 1278  : 
 1279  : argv[argc++] = "program";
 1280  : argv[argc++] = "donald";
 1281  : argv[argc++] = "-p";
 1282  : argv[argc++] = "billy";
 1283  : argv[argc++] = "duck";
 1284  : argv[argc++] = "-a";
 1285  : argv[argc++] = "bar";
 1286  : argv[argc] = NULL;
 1287  : optind = start;
 1288  : opterr = 1;
 1289  : getopt_loop (argc, argv, "+:abp:q:",
 1290  : &a_seen, &b_seen, &p_value, &q_value,
 1291  : &non_options_count, non_options, &unrecognized, &output);
 1292  : ASSERT (strcmp (argv[0], "program") == 0);
 1293  : ASSERT (strcmp (argv[1], "donald") == 0);
 1294  : ASSERT (strcmp (argv[2], "-p") == 0);
 1295  : ASSERT (strcmp (argv[3], "billy") == 0);
 1296  : ASSERT (strcmp (argv[4], "duck") == 0);
 1297  : ASSERT (strcmp (argv[5], "-a") == 0);
 1298  : ASSERT (strcmp (argv[6], "bar") == 0);
 1299  : ASSERT (argv[7] == NULL);
 1300  : ASSERT (a_seen == 0);
 1301  : ASSERT (b_seen == 0);
 1302  : ASSERT (p_value == NULL);
 1303  : ASSERT (q_value == NULL);
 1304  : ASSERT (non_options_count == 0);
 1305  : ASSERT (unrecognized == 0);
 1306  : ASSERT (optind == 1);
 1307  : ASSERT (!output);
 1308  : }
 1309  : for (start = OPTIND_MIN; start <= 1; start++)
 1310  : {
 1311  : int a_seen = 0;
 1312  : int b_seen = 0;
 1313  : const char *p_value = NULL;
 1314  : const char *q_value = NULL;
 1315  : int non_options_count = 0;
 1316  : const char *non_options[10];
 1317  : int unrecognized = 0;
 1318  : bool output;
 1319  : int argc = 0;
 1320  : const char *argv[10];
 1321  : 
 1322  : argv[argc++] = "program";
 1323  : argv[argc++] = "-p";
 1324  : argv[argc] = NULL;
 1325  : optind = start;
 1326  : getopt_loop (argc, argv, "+:abp:q:",
 1327  : &a_seen, &b_seen, &p_value, &q_value,
 1328  : &non_options_count, non_options, &unrecognized, &output);
 1329  : ASSERT (a_seen == 0);
 1330  : ASSERT (b_seen == 0);
 1331  : ASSERT (p_value == NULL);
 1332  : ASSERT (q_value == NULL);
 1333  : ASSERT (non_options_count == 0);
 1334  : ASSERT (unrecognized == 'p');
 1335  : ASSERT (optind == 2);
 1336  : ASSERT (!output);
 1337  : }
 1338  : for (start = OPTIND_MIN; start <= 1; start++)
 1339  : {
 1340  : int a_seen = 0;
 1341  : int b_seen = 0;
 1342  : const char *p_value = NULL;
 1343  : const char *q_value = NULL;
 1344  : int non_options_count = 0;
 1345  : const char *non_options[10];
 1346  : int unrecognized = 0;
 1347  : bool output;
 1348  : int argc = 0;
 1349  : const char *argv[10];
 1350  : 
 1351  : argv[argc++] = "program";
 1352  : argv[argc++] = "-b";
 1353  : argv[argc++] = "-p";
 1354  : argv[argc] = NULL;
 1355  : optind = start;
 1356  : getopt_loop (argc, argv, "+:abp:q:",
 1357  : &a_seen, &b_seen, &p_value, &q_value,
 1358  : &non_options_count, non_options, &unrecognized, &output);
 1359  : ASSERT (a_seen == 0);
 1360  : ASSERT (b_seen == 1);
 1361  : ASSERT (p_value == NULL);
 1362  : ASSERT (q_value == NULL);
 1363  : ASSERT (non_options_count == 0);
 1364  : ASSERT (unrecognized == 'p');
 1365  : ASSERT (optind == 3);
 1366  : ASSERT (!output);
 1367  : }
 1368  : 
 1369  : /* Check that 'W' does not dump core:
 1370  : https://sourceware.org/bugzilla/show_bug.cgi?id=12922
 1371  : Technically, POSIX says the presence of ';' in the opt-string
 1372  : gives unspecified behavior, so we only test this when GNU compliance
 1373  : is desired. */
 1374  : for (start = OPTIND_MIN; start <= 1; start++)
 1375  : {
 1376  : int argc = 0;
 1377  : const char *argv[10];
 1378  : int pos = ftell (stderr);
 1379  : 
 1380  : argv[argc++] = "program";
 1381  : argv[argc++] = "-W";
 1382  : argv[argc++] = "dummy";
 1383  : argv[argc] = NULL;
 1384  : optind = start;
 1385  : opterr = 1;
 1386  : ASSERT (getopt (argc, (char **) argv, "W;") == 'W');
 1387  : ASSERT (ftell (stderr) == pos);
 1388  : ASSERT (optind == 2);
 1389  : }
 1390  : #endif /* GNULIB_TEST_GETOPT_GNU */
 1391  4 : }

Generated by: LCOV version 1.13

AltStyle によって変換されたページ (->オリジナル) /