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

LCOV - code coverage report
Current view: top level - gltests - test-getopt_long.h (source / functions) Hit Total Coverage
Test: GNU Libidn Lines: 1453 1472 98.7 %
Date: 2020年07月22日 17:53:13 Functions: 6 6 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  : static int a_seen;
 20  : static int b_seen;
 21  : static int q_seen;
 22  : 
 23  : static const struct option long_options_required[] =
 24  : {
 25  : { "alpha", no_argument, NULL, 'a' },
 26  : { "beta", no_argument, &b_seen, 1 },
 27  : { "prune", required_argument, NULL, 'p' },
 28  : { "quetsche", required_argument, &q_seen, 1 },
 29  : { "xtremely-",no_argument, NULL, 1003 },
 30  : { "xtra", no_argument, NULL, 1001 },
 31  : { "xtreme", no_argument, NULL, 1002 },
 32  : { "xtremely", no_argument, NULL, 1003 },
 33  : { NULL, 0, NULL, 0 }
 34  : };
 35  : 
 36  : static const struct option long_options_optional[] =
 37  : {
 38  : { "alpha", no_argument, NULL, 'a' },
 39  : { "beta", no_argument, &b_seen, 1 },
 40  : { "prune", optional_argument, NULL, 'p' },
 41  : { "quetsche", optional_argument, &q_seen, 1 },
 42  : { NULL, 0, NULL, 0 }
 43  : };
 44  : 
 45  : static void
 46  94 : getopt_long_loop (int argc, const char **argv,
 47  : const char *options, const struct option *long_options,
 48  : const char **p_value, const char **q_value,
 49  : int *non_options_count, const char **non_options,
 50  : int *unrecognized)
 51  : {
 52  94 : int option_index = -1;
 53  : int c;
 54  : 
 55  94 : opterr = 0;
 56  94 : q_seen = 0;
 57  268 : while ((c = getopt_long (argc, (char **) argv, options, long_options,
 58  : &option_index))
 59  : != -1)
 60  : {
 61  174 : switch (c)
 62  : {
 63  16 : case 0:
 64  : /* An option with a non-NULL flag pointer was processed. */
 65  16 : if (q_seen)
 66  4 : *q_value = optarg;
 67  16 : break;
 68  56 : case 'a':
 69  56 : a_seen++;
 70  56 : break;
 71  14 : case 'b':
 72  14 : b_seen = 1;
 73  14 : break;
 74  64 : case 'p':
 75  64 : *p_value = optarg;
 76  64 : break;
 77  2 : case 'q':
 78  2 : *q_value = optarg;
 79  2 : break;
 80  12 : case '1円':
 81  : /* Must only happen with option '-' at the beginning. */
 82  12 : ASSERT (options[0] == '-');
 83  12 : non_options[(*non_options_count)++] = optarg;
 84  12 : break;
 85  0 : case ':':
 86  : /* Must only happen with option ':' at the beginning. */
 87  0 : ASSERT (options[0] == ':'
 88  : || ((options[0] == '-' || options[0] == '+')
 89  : && options[1] == ':'));
 90  : FALLTHROUGH;
 91  : case '?':
 92  10 : *unrecognized = optopt;
 93  10 : break;
 94  0 : default:
 95  0 : *unrecognized = c;
 96  0 : break;
 97  : }
 98  : }
 99  94 : }
 100  : 
 101  : /* Reduce casting, so we can use string literals elsewhere.
 102  : getopt_long takes an array of char*, but luckily does not modify
 103  : those elements, so we can pass const char*. */
 104  : static int
 105  13 : do_getopt_long (int argc, const char **argv, const char *shortopts,
 106  : const struct option *longopts, int *longind)
 107  : {
 108  13 : return getopt_long (argc, (char **) argv, shortopts, longopts, longind);
 109  : }
 110  : 
 111  : static void
 112  1 : test_getopt_long (void)
 113  : {
 114  : int start;
 115  : 
 116  : /* Test disambiguation of options. */
 117  : {
 118  1 : int argc = 0;
 119  : const char *argv[10];
 120  : int option_index;
 121  : int c;
 122  : 
 123  1 : argv[argc++] = "program";
 124  1 : argv[argc++] = "--x";
 125  1 : argv[argc] = NULL;
 126  1 : optind = 1;
 127  1 : opterr = 0;
 128  1 : c = do_getopt_long (argc, argv, "ab", long_options_required, &option_index);
 129  1 : ASSERT (c == '?');
 130  1 : ASSERT (optopt == 0);
 131  : }
 132  : {
 133  1 : int argc = 0;
 134  : const char *argv[10];
 135  : int option_index;
 136  : int c;
 137  : 
 138  1 : argv[argc++] = "program";
 139  1 : argv[argc++] = "--xt";
 140  1 : argv[argc] = NULL;
 141  1 : optind = 1;
 142  1 : opterr = 0;
 143  1 : c = do_getopt_long (argc, argv, "ab", long_options_required, &option_index);
 144  1 : ASSERT (c == '?');
 145  1 : ASSERT (optopt == 0);
 146  : }
 147  : {
 148  1 : int argc = 0;
 149  : const char *argv[10];
 150  : int option_index;
 151  : int c;
 152  : 
 153  1 : argv[argc++] = "program";
 154  1 : argv[argc++] = "--xtr";
 155  1 : argv[argc] = NULL;
 156  1 : optind = 1;
 157  1 : opterr = 0;
 158  1 : c = do_getopt_long (argc, argv, "ab", long_options_required, &option_index);
 159  1 : ASSERT (c == '?');
 160  1 : ASSERT (optopt == 0);
 161  : }
 162  : {
 163  1 : int argc = 0;
 164  : const char *argv[10];
 165  : int option_index;
 166  : int c;
 167  : 
 168  1 : argv[argc++] = "program";
 169  1 : argv[argc++] = "--xtra";
 170  1 : argv[argc] = NULL;
 171  1 : optind = 1;
 172  1 : opterr = 0;
 173  1 : c = do_getopt_long (argc, argv, "ab", long_options_required, &option_index);
 174  1 : ASSERT (c == 1001);
 175  : }
 176  : {
 177  1 : int argc = 0;
 178  : const char *argv[10];
 179  : int option_index;
 180  : int c;
 181  : 
 182  1 : argv[argc++] = "program";
 183  1 : argv[argc++] = "--xtre";
 184  1 : argv[argc] = NULL;
 185  1 : optind = 1;
 186  1 : opterr = 0;
 187  1 : c = do_getopt_long (argc, argv, "ab", long_options_required, &option_index);
 188  1 : ASSERT (c == '?');
 189  1 : ASSERT (optopt == 0);
 190  : }
 191  : {
 192  1 : int argc = 0;
 193  : const char *argv[10];
 194  : int option_index;
 195  : int c;
 196  : 
 197  1 : argv[argc++] = "program";
 198  1 : argv[argc++] = "--xtrem";
 199  1 : argv[argc] = NULL;
 200  1 : optind = 1;
 201  1 : opterr = 0;
 202  1 : c = do_getopt_long (argc, argv, "ab", long_options_required, &option_index);
 203  1 : ASSERT (c == '?');
 204  1 : ASSERT (optopt == 0);
 205  : }
 206  : {
 207  1 : int argc = 0;
 208  : const char *argv[10];
 209  : int option_index;
 210  : int c;
 211  : 
 212  1 : argv[argc++] = "program";
 213  1 : argv[argc++] = "--xtreme";
 214  1 : argv[argc] = NULL;
 215  1 : optind = 1;
 216  1 : opterr = 0;
 217  1 : c = do_getopt_long (argc, argv, "ab", long_options_required, &option_index);
 218  1 : ASSERT (c == 1002);
 219  : }
 220  : {
 221  1 : int argc = 0;
 222  : const char *argv[10];
 223  : int option_index;
 224  : int c;
 225  : 
 226  1 : argv[argc++] = "program";
 227  1 : argv[argc++] = "--xtremel";
 228  1 : argv[argc] = NULL;
 229  1 : optind = 1;
 230  1 : opterr = 0;
 231  1 : c = do_getopt_long (argc, argv, "ab", long_options_required, &option_index);
 232  1 : ASSERT (c == 1003);
 233  : }
 234  : {
 235  1 : int argc = 0;
 236  : const char *argv[10];
 237  : int option_index;
 238  : int c;
 239  : 
 240  1 : argv[argc++] = "program";
 241  1 : argv[argc++] = "--xtremely";
 242  1 : argv[argc] = NULL;
 243  1 : optind = 1;
 244  1 : opterr = 0;
 245  1 : c = do_getopt_long (argc, argv, "ab", long_options_required, &option_index);
 246  1 : ASSERT (c == 1003);
 247  : }
 248  : 
 249  : /* Check that -W handles unknown options. */
 250  : {
 251  1 : int argc = 0;
 252  : const char *argv[10];
 253  : int option_index;
 254  : int c;
 255  : 
 256  1 : argv[argc++] = "program";
 257  1 : argv[argc++] = "-W";
 258  1 : argv[argc] = NULL;
 259  1 : optind = 1;
 260  1 : opterr = 0;
 261  1 : c = do_getopt_long (argc, argv, "W;", long_options_required, &option_index);
 262  1 : ASSERT (c == '?');
 263  1 : ASSERT (optopt == 'W');
 264  : }
 265  : {
 266  1 : int argc = 0;
 267  : const char *argv[10];
 268  : int option_index;
 269  : int c;
 270  : 
 271  1 : argv[argc++] = "program";
 272  1 : argv[argc++] = "-Wunknown";
 273  1 : argv[argc] = NULL;
 274  1 : optind = 1;
 275  1 : opterr = 0;
 276  1 : c = do_getopt_long (argc, argv, "W;", long_options_required, &option_index);
 277  : /* glibc and BSD behave differently here, but for now, we allow
 278  : both behaviors since W support is not frequently used. */
 279  1 : if (c == '?')
 280  : {
 281  1 : ASSERT (optopt == 0);
 282  1 : ASSERT (optarg == NULL);
 283  : }
 284  : else
 285  : {
 286  0 : ASSERT (c == 'W');
 287  0 : ASSERT (strcmp (optarg, "unknown") == 0);
 288  : }
 289  : }
 290  : {
 291  1 : int argc = 0;
 292  : const char *argv[10];
 293  : int option_index;
 294  : int c;
 295  : 
 296  1 : argv[argc++] = "program";
 297  1 : argv[argc++] = "-W";
 298  1 : argv[argc++] = "unknown";
 299  1 : argv[argc] = NULL;
 300  1 : optind = 1;
 301  1 : opterr = 0;
 302  1 : c = do_getopt_long (argc, argv, "W;", long_options_required, &option_index);
 303  : /* glibc and BSD behave differently here, but for now, we allow
 304  : both behaviors since W support is not frequently used. */
 305  1 : if (c == '?')
 306  : {
 307  1 : ASSERT (optopt == 0);
 308  1 : ASSERT (optarg == NULL);
 309  : }
 310  : else
 311  : {
 312  0 : ASSERT (c == 'W');
 313  0 : ASSERT (strcmp (optarg, "unknown") == 0);
 314  : }
 315  : }
 316  : 
 317  : /* Test that 'W' does not dump core:
 318  : https://sourceware.org/bugzilla/show_bug.cgi?id=12922 */
 319  : {
 320  1 : int argc = 0;
 321  : const char *argv[10];
 322  : int option_index;
 323  : int c;
 324  : 
 325  1 : argv[argc++] = "program";
 326  1 : argv[argc++] = "-W";
 327  1 : argv[argc++] = "dummy";
 328  1 : argv[argc] = NULL;
 329  1 : optind = 1;
 330  1 : opterr = 0;
 331  1 : c = do_getopt_long (argc, argv, "W;", NULL, &option_index);
 332  1 : ASSERT (c == 'W');
 333  1 : ASSERT (optind == 2);
 334  : }
 335  : 
 336  : /* Test processing of boolean short options. */
 337  3 : for (start = 0; start <= 1; start++)
 338  : {
 339  2 : const char *p_value = NULL;
 340  2 : const char *q_value = NULL;
 341  2 : int non_options_count = 0;
 342  : const char *non_options[10];
 343  2 : int unrecognized = 0;
 344  2 : int argc = 0;
 345  : const char *argv[10];
 346  2 : a_seen = 0;
 347  2 : b_seen = 0;
 348  : 
 349  2 : argv[argc++] = "program";
 350  2 : argv[argc++] = "-a";
 351  2 : argv[argc++] = "foo";
 352  2 : argv[argc++] = "bar";
 353  2 : argv[argc] = NULL;
 354  2 : optind = start;
 355  2 : getopt_long_loop (argc, argv, "ab", long_options_required,
 356  : &p_value, &q_value,
 357  : &non_options_count, non_options, &unrecognized);
 358  2 : ASSERT (a_seen == 1);
 359  2 : ASSERT (b_seen == 0);
 360  2 : ASSERT (p_value == NULL);
 361  2 : ASSERT (q_value == NULL);
 362  2 : ASSERT (non_options_count == 0);
 363  2 : ASSERT (unrecognized == 0);
 364  2 : ASSERT (optind == 2);
 365  : }
 366  3 : for (start = 0; start <= 1; start++)
 367  : {
 368  2 : const char *p_value = NULL;
 369  2 : const char *q_value = NULL;
 370  2 : int non_options_count = 0;
 371  : const char *non_options[10];
 372  2 : int unrecognized = 0;
 373  2 : int argc = 0;
 374  : const char *argv[10];
 375  2 : a_seen = 0;
 376  2 : b_seen = 0;
 377  : 
 378  2 : argv[argc++] = "program";
 379  2 : argv[argc++] = "-b";
 380  2 : argv[argc++] = "-a";
 381  2 : argv[argc++] = "foo";
 382  2 : argv[argc++] = "bar";
 383  2 : argv[argc] = NULL;
 384  2 : optind = start;
 385  2 : getopt_long_loop (argc, argv, "ab", long_options_required,
 386  : &p_value, &q_value,
 387  : &non_options_count, non_options, &unrecognized);
 388  2 : ASSERT (a_seen == 1);
 389  2 : ASSERT (b_seen == 1);
 390  2 : ASSERT (p_value == NULL);
 391  2 : ASSERT (q_value == NULL);
 392  2 : ASSERT (non_options_count == 0);
 393  2 : ASSERT (unrecognized == 0);
 394  2 : ASSERT (optind == 3);
 395  : }
 396  3 : for (start = 0; start <= 1; start++)
 397  : {
 398  2 : const char *p_value = NULL;
 399  2 : const char *q_value = NULL;
 400  2 : int non_options_count = 0;
 401  : const char *non_options[10];
 402  2 : int unrecognized = 0;
 403  2 : int argc = 0;
 404  : const char *argv[10];
 405  2 : a_seen = 0;
 406  2 : b_seen = 0;
 407  : 
 408  2 : argv[argc++] = "program";
 409  2 : argv[argc++] = "-ba";
 410  2 : argv[argc++] = "foo";
 411  2 : argv[argc++] = "bar";
 412  2 : argv[argc] = NULL;
 413  2 : optind = start;
 414  2 : getopt_long_loop (argc, argv, "ab", long_options_required,
 415  : &p_value, &q_value,
 416  : &non_options_count, non_options, &unrecognized);
 417  2 : ASSERT (a_seen == 1);
 418  2 : ASSERT (b_seen == 1);
 419  2 : ASSERT (p_value == NULL);
 420  2 : ASSERT (q_value == NULL);
 421  2 : ASSERT (non_options_count == 0);
 422  2 : ASSERT (unrecognized == 0);
 423  2 : ASSERT (optind == 2);
 424  : }
 425  3 : for (start = 0; start <= 1; start++)
 426  : {
 427  2 : const char *p_value = NULL;
 428  2 : const char *q_value = NULL;
 429  2 : int non_options_count = 0;
 430  : const char *non_options[10];
 431  2 : int unrecognized = 0;
 432  2 : int argc = 0;
 433  : const char *argv[10];
 434  2 : a_seen = 0;
 435  2 : b_seen = 0;
 436  : 
 437  2 : argv[argc++] = "program";
 438  2 : argv[argc++] = "-ab";
 439  2 : argv[argc++] = "-a";
 440  2 : argv[argc++] = "foo";
 441  2 : argv[argc++] = "bar";
 442  2 : argv[argc] = NULL;
 443  2 : optind = start;
 444  2 : getopt_long_loop (argc, argv, "ab", long_options_required,
 445  : &p_value, &q_value,
 446  : &non_options_count, non_options, &unrecognized);
 447  2 : ASSERT (a_seen == 2);
 448  2 : ASSERT (b_seen == 1);
 449  2 : ASSERT (p_value == NULL);
 450  2 : ASSERT (q_value == NULL);
 451  2 : ASSERT (non_options_count == 0);
 452  2 : ASSERT (unrecognized == 0);
 453  2 : ASSERT (optind == 3);
 454  : }
 455  : 
 456  : /* Test processing of boolean long options. */
 457  3 : for (start = 0; start <= 1; start++)
 458  : {
 459  2 : const char *p_value = NULL;
 460  2 : const char *q_value = NULL;
 461  2 : int non_options_count = 0;
 462  : const char *non_options[10];
 463  2 : int unrecognized = 0;
 464  2 : int argc = 0;
 465  : const char *argv[10];
 466  2 : a_seen = 0;
 467  2 : b_seen = 0;
 468  : 
 469  2 : argv[argc++] = "program";
 470  2 : argv[argc++] = "--alpha";
 471  2 : argv[argc++] = "foo";
 472  2 : argv[argc++] = "bar";
 473  2 : argv[argc] = NULL;
 474  2 : optind = start;
 475  2 : getopt_long_loop (argc, argv, "ab", long_options_required,
 476  : &p_value, &q_value,
 477  : &non_options_count, non_options, &unrecognized);
 478  2 : ASSERT (a_seen == 1);
 479  2 : ASSERT (b_seen == 0);
 480  2 : ASSERT (p_value == NULL);
 481  2 : ASSERT (q_value == NULL);
 482  2 : ASSERT (non_options_count == 0);
 483  2 : ASSERT (unrecognized == 0);
 484  2 : ASSERT (optind == 2);
 485  : }
 486  3 : for (start = 0; start <= 1; start++)
 487  : {
 488  2 : const char *p_value = NULL;
 489  2 : const char *q_value = NULL;
 490  2 : int non_options_count = 0;
 491  : const char *non_options[10];
 492  2 : int unrecognized = 0;
 493  2 : int argc = 0;
 494  : const char *argv[10];
 495  2 : a_seen = 0;
 496  2 : b_seen = 0;
 497  : 
 498  2 : argv[argc++] = "program";
 499  2 : argv[argc++] = "--beta";
 500  2 : argv[argc++] = "--alpha";
 501  2 : argv[argc++] = "foo";
 502  2 : argv[argc++] = "bar";
 503  2 : argv[argc] = NULL;
 504  2 : optind = start;
 505  2 : getopt_long_loop (argc, argv, "ab", long_options_required,
 506  : &p_value, &q_value,
 507  : &non_options_count, non_options, &unrecognized);
 508  2 : ASSERT (a_seen == 1);
 509  2 : ASSERT (b_seen == 1);
 510  2 : ASSERT (p_value == NULL);
 511  2 : ASSERT (q_value == NULL);
 512  2 : ASSERT (non_options_count == 0);
 513  2 : ASSERT (unrecognized == 0);
 514  2 : ASSERT (optind == 3);
 515  : }
 516  3 : for (start = 0; start <= 1; start++)
 517  : {
 518  2 : const char *p_value = NULL;
 519  2 : const char *q_value = NULL;
 520  2 : int non_options_count = 0;
 521  : const char *non_options[10];
 522  2 : int unrecognized = 0;
 523  2 : int argc = 0;
 524  : const char *argv[10];
 525  2 : a_seen = 0;
 526  2 : b_seen = 0;
 527  : 
 528  2 : argv[argc++] = "program";
 529  2 : argv[argc++] = "--alpha";
 530  2 : argv[argc++] = "--beta";
 531  2 : argv[argc++] = "--alpha";
 532  2 : argv[argc++] = "--beta";
 533  2 : argv[argc++] = "foo";
 534  2 : argv[argc++] = "bar";
 535  2 : argv[argc] = NULL;
 536  2 : optind = start;
 537  2 : getopt_long_loop (argc, argv, "ab", long_options_required,
 538  : &p_value, &q_value,
 539  : &non_options_count, non_options, &unrecognized);
 540  2 : ASSERT (a_seen == 2);
 541  2 : ASSERT (b_seen == 1);
 542  2 : ASSERT (p_value == NULL);
 543  2 : ASSERT (q_value == NULL);
 544  2 : ASSERT (non_options_count == 0);
 545  2 : ASSERT (unrecognized == 0);
 546  2 : ASSERT (optind == 5);
 547  : }
 548  : 
 549  : /* Test processing of boolean long options via -W. */
 550  3 : for (start = 0; start <= 1; start++)
 551  : {
 552  2 : const char *p_value = NULL;
 553  2 : const char *q_value = NULL;
 554  2 : int non_options_count = 0;
 555  : const char *non_options[10];
 556  2 : int unrecognized = 0;
 557  2 : int argc = 0;
 558  : const char *argv[10];
 559  2 : a_seen = 0;
 560  2 : b_seen = 0;
 561  : 
 562  2 : argv[argc++] = "program";
 563  2 : argv[argc++] = "-Walpha";
 564  2 : argv[argc++] = "foo";
 565  2 : argv[argc++] = "bar";
 566  2 : argv[argc] = NULL;
 567  2 : optind = start;
 568  2 : getopt_long_loop (argc, argv, "abW;", long_options_required,
 569  : &p_value, &q_value,
 570  : &non_options_count, non_options, &unrecognized);
 571  2 : ASSERT (a_seen == 1);
 572  2 : ASSERT (b_seen == 0);
 573  2 : ASSERT (p_value == NULL);
 574  2 : ASSERT (q_value == NULL);
 575  2 : ASSERT (non_options_count == 0);
 576  2 : ASSERT (unrecognized == 0);
 577  2 : ASSERT (optind == 2);
 578  : }
 579  3 : for (start = 0; start <= 1; start++)
 580  : {
 581  2 : const char *p_value = NULL;
 582  2 : const char *q_value = NULL;
 583  2 : int non_options_count = 0;
 584  : const char *non_options[10];
 585  2 : int unrecognized = 0;
 586  2 : int argc = 0;
 587  : const char *argv[10];
 588  2 : a_seen = 0;
 589  2 : b_seen = 0;
 590  : 
 591  2 : argv[argc++] = "program";
 592  2 : argv[argc++] = "-W";
 593  2 : argv[argc++] = "beta";
 594  2 : argv[argc++] = "-W";
 595  2 : argv[argc++] = "alpha";
 596  2 : argv[argc++] = "foo";
 597  2 : argv[argc++] = "bar";
 598  2 : argv[argc] = NULL;
 599  2 : optind = start;
 600  2 : getopt_long_loop (argc, argv, "aW;b", long_options_required,
 601  : &p_value, &q_value,
 602  : &non_options_count, non_options, &unrecognized);
 603  2 : ASSERT (a_seen == 1);
 604  2 : ASSERT (b_seen == 1);
 605  2 : ASSERT (p_value == NULL);
 606  2 : ASSERT (q_value == NULL);
 607  2 : ASSERT (non_options_count == 0);
 608  2 : ASSERT (unrecognized == 0);
 609  2 : ASSERT (optind == 5);
 610  : }
 611  3 : for (start = 0; start <= 1; start++)
 612  : {
 613  2 : const char *p_value = NULL;
 614  2 : const char *q_value = NULL;
 615  2 : int non_options_count = 0;
 616  : const char *non_options[10];
 617  2 : int unrecognized = 0;
 618  2 : int argc = 0;
 619  : const char *argv[10];
 620  2 : a_seen = 0;
 621  2 : b_seen = 0;
 622  : 
 623  2 : argv[argc++] = "program";
 624  2 : argv[argc++] = "-Walpha";
 625  2 : argv[argc++] = "-Wbeta";
 626  2 : argv[argc++] = "-Walpha";
 627  2 : argv[argc++] = "-Wbeta";
 628  2 : argv[argc++] = "foo";
 629  2 : argv[argc++] = "bar";
 630  2 : argv[argc] = NULL;
 631  2 : optind = start;
 632  2 : getopt_long_loop (argc, argv, "W;ab", long_options_required,
 633  : &p_value, &q_value,
 634  : &non_options_count, non_options, &unrecognized);
 635  2 : ASSERT (a_seen == 2);
 636  2 : ASSERT (b_seen == 1);
 637  2 : ASSERT (p_value == NULL);
 638  2 : ASSERT (q_value == NULL);
 639  2 : ASSERT (non_options_count == 0);
 640  2 : ASSERT (unrecognized == 0);
 641  2 : ASSERT (optind == 5);
 642  : }
 643  : 
 644  : /* Test processing of short options with arguments. */
 645  3 : for (start = 0; start <= 1; start++)
 646  : {
 647  2 : const char *p_value = NULL;
 648  2 : const char *q_value = NULL;
 649  2 : int non_options_count = 0;
 650  : const char *non_options[10];
 651  2 : int unrecognized = 0;
 652  2 : int argc = 0;
 653  : const char *argv[10];
 654  2 : a_seen = 0;
 655  2 : b_seen = 0;
 656  : 
 657  2 : argv[argc++] = "program";
 658  2 : argv[argc++] = "-pfoo";
 659  2 : argv[argc++] = "bar";
 660  2 : argv[argc] = NULL;
 661  2 : optind = start;
 662  2 : getopt_long_loop (argc, argv, "p:q:", long_options_required,
 663  : &p_value, &q_value,
 664  : &non_options_count, non_options, &unrecognized);
 665  2 : ASSERT (a_seen == 0);
 666  2 : ASSERT (b_seen == 0);
 667  2 : ASSERT (p_value != NULL && strcmp (p_value, "foo") == 0);
 668  2 : ASSERT (q_value == NULL);
 669  2 : ASSERT (non_options_count == 0);
 670  2 : ASSERT (unrecognized == 0);
 671  2 : ASSERT (optind == 2);
 672  : }
 673  3 : for (start = 0; start <= 1; start++)
 674  : {
 675  2 : const char *p_value = NULL;
 676  2 : const char *q_value = NULL;
 677  2 : int non_options_count = 0;
 678  : const char *non_options[10];
 679  2 : int unrecognized = 0;
 680  2 : int argc = 0;
 681  : const char *argv[10];
 682  2 : a_seen = 0;
 683  2 : b_seen = 0;
 684  : 
 685  2 : argv[argc++] = "program";
 686  2 : argv[argc++] = "-p";
 687  2 : argv[argc++] = "foo";
 688  2 : argv[argc++] = "bar";
 689  2 : argv[argc] = NULL;
 690  2 : optind = start;
 691  2 : getopt_long_loop (argc, argv, "p:q:", long_options_required,
 692  : &p_value, &q_value,
 693  : &non_options_count, non_options, &unrecognized);
 694  2 : ASSERT (a_seen == 0);
 695  2 : ASSERT (b_seen == 0);
 696  2 : ASSERT (p_value != NULL && strcmp (p_value, "foo") == 0);
 697  2 : ASSERT (q_value == NULL);
 698  2 : ASSERT (non_options_count == 0);
 699  2 : ASSERT (unrecognized == 0);
 700  2 : ASSERT (optind == 3);
 701  : }
 702  3 : for (start = 0; start <= 1; start++)
 703  : {
 704  2 : const char *p_value = NULL;
 705  2 : const char *q_value = NULL;
 706  2 : int non_options_count = 0;
 707  : const char *non_options[10];
 708  2 : int unrecognized = 0;
 709  2 : int argc = 0;
 710  : const char *argv[10];
 711  2 : a_seen = 0;
 712  2 : b_seen = 0;
 713  : 
 714  2 : argv[argc++] = "program";
 715  2 : argv[argc++] = "-ab";
 716  2 : argv[argc++] = "-q";
 717  2 : argv[argc++] = "baz";
 718  2 : argv[argc++] = "-pfoo";
 719  2 : argv[argc++] = "bar";
 720  2 : argv[argc] = NULL;
 721  2 : optind = start;
 722  2 : getopt_long_loop (argc, argv, "abp:q:", long_options_required,
 723  : &p_value, &q_value,
 724  : &non_options_count, non_options, &unrecognized);
 725  2 : ASSERT (a_seen == 1);
 726  2 : ASSERT (b_seen == 1);
 727  2 : ASSERT (p_value != NULL && strcmp (p_value, "foo") == 0);
 728  2 : ASSERT (q_value != NULL && strcmp (q_value, "baz") == 0);
 729  2 : ASSERT (non_options_count == 0);
 730  2 : ASSERT (unrecognized == 0);
 731  2 : ASSERT (optind == 5);
 732  : }
 733  : 
 734  : /* Test processing of long options with arguments. */
 735  3 : for (start = 0; start <= 1; start++)
 736  : {
 737  2 : const char *p_value = NULL;
 738  2 : const char *q_value = NULL;
 739  2 : int non_options_count = 0;
 740  : const char *non_options[10];
 741  2 : int unrecognized = 0;
 742  2 : int argc = 0;
 743  : const char *argv[10];
 744  2 : a_seen = 0;
 745  2 : b_seen = 0;
 746  : 
 747  2 : argv[argc++] = "program";
 748  2 : argv[argc++] = "--p=foo";
 749  2 : argv[argc++] = "bar";
 750  2 : argv[argc] = NULL;
 751  2 : optind = start;
 752  2 : getopt_long_loop (argc, argv, "p:q:", long_options_required,
 753  : &p_value, &q_value,
 754  : &non_options_count, non_options, &unrecognized);
 755  2 : ASSERT (a_seen == 0);
 756  2 : ASSERT (b_seen == 0);
 757  2 : ASSERT (p_value != NULL && strcmp (p_value, "foo") == 0);
 758  2 : ASSERT (q_value == NULL);
 759  2 : ASSERT (non_options_count == 0);
 760  2 : ASSERT (unrecognized == 0);
 761  2 : ASSERT (optind == 2);
 762  : }
 763  3 : for (start = 0; start <= 1; start++)
 764  : {
 765  2 : const char *p_value = NULL;
 766  2 : const char *q_value = NULL;
 767  2 : int non_options_count = 0;
 768  : const char *non_options[10];
 769  2 : int unrecognized = 0;
 770  2 : int argc = 0;
 771  : const char *argv[10];
 772  2 : a_seen = 0;
 773  2 : b_seen = 0;
 774  : 
 775  2 : argv[argc++] = "program";
 776  2 : argv[argc++] = "--p";
 777  2 : argv[argc++] = "foo";
 778  2 : argv[argc++] = "bar";
 779  2 : argv[argc] = NULL;
 780  2 : optind = start;
 781  2 : getopt_long_loop (argc, argv, "p:q:", long_options_required,
 782  : &p_value, &q_value,
 783  : &non_options_count, non_options, &unrecognized);
 784  2 : ASSERT (a_seen == 0);
 785  2 : ASSERT (b_seen == 0);
 786  2 : ASSERT (p_value != NULL && strcmp (p_value, "foo") == 0);
 787  2 : ASSERT (q_value == NULL);
 788  2 : ASSERT (non_options_count == 0);
 789  2 : ASSERT (unrecognized == 0);
 790  2 : ASSERT (optind == 3);
 791  : }
 792  3 : for (start = 0; start <= 1; start++)
 793  : {
 794  2 : const char *p_value = NULL;
 795  2 : const char *q_value = NULL;
 796  2 : int non_options_count = 0;
 797  : const char *non_options[10];
 798  2 : int unrecognized = 0;
 799  2 : int argc = 0;
 800  : const char *argv[10];
 801  2 : a_seen = 0;
 802  2 : b_seen = 0;
 803  : 
 804  2 : argv[argc++] = "program";
 805  2 : argv[argc++] = "-ab";
 806  2 : argv[argc++] = "--q";
 807  2 : argv[argc++] = "baz";
 808  2 : argv[argc++] = "--p=foo";
 809  2 : argv[argc++] = "bar";
 810  2 : argv[argc] = NULL;
 811  2 : optind = start;
 812  2 : getopt_long_loop (argc, argv, "abp:q:", long_options_required,
 813  : &p_value, &q_value,
 814  : &non_options_count, non_options, &unrecognized);
 815  2 : ASSERT (a_seen == 1);
 816  2 : ASSERT (b_seen == 1);
 817  2 : ASSERT (p_value != NULL && strcmp (p_value, "foo") == 0);
 818  2 : ASSERT (q_value != NULL && strcmp (q_value, "baz") == 0);
 819  2 : ASSERT (non_options_count == 0);
 820  2 : ASSERT (unrecognized == 0);
 821  2 : ASSERT (optind == 5);
 822  : }
 823  : 
 824  : /* Test processing of long options with arguments via -W. */
 825  3 : for (start = 0; start <= 1; start++)
 826  : {
 827  2 : const char *p_value = NULL;
 828  2 : const char *q_value = NULL;
 829  2 : int non_options_count = 0;
 830  : const char *non_options[10];
 831  2 : int unrecognized = 0;
 832  2 : int argc = 0;
 833  : const char *argv[10];
 834  2 : a_seen = 0;
 835  2 : b_seen = 0;
 836  : 
 837  2 : argv[argc++] = "program";
 838  2 : argv[argc++] = "-Wp=foo";
 839  2 : argv[argc++] = "bar";
 840  2 : argv[argc] = NULL;
 841  2 : optind = start;
 842  2 : getopt_long_loop (argc, argv, "p:q:W;", long_options_required,
 843  : &p_value, &q_value,
 844  : &non_options_count, non_options, &unrecognized);
 845  2 : ASSERT (a_seen == 0);
 846  2 : ASSERT (b_seen == 0);
 847  2 : ASSERT (p_value != NULL && strcmp (p_value, "foo") == 0);
 848  2 : ASSERT (q_value == NULL);
 849  2 : ASSERT (non_options_count == 0);
 850  2 : ASSERT (unrecognized == 0);
 851  2 : ASSERT (optind == 2);
 852  : }
 853  3 : for (start = 0; start <= 1; start++)
 854  : {
 855  2 : const char *p_value = NULL;
 856  2 : const char *q_value = NULL;
 857  2 : int non_options_count = 0;
 858  : const char *non_options[10];
 859  2 : int unrecognized = 0;
 860  2 : int argc = 0;
 861  : const char *argv[10];
 862  2 : a_seen = 0;
 863  2 : b_seen = 0;
 864  : 
 865  2 : argv[argc++] = "program";
 866  2 : argv[argc++] = "-W";
 867  2 : argv[argc++] = "p";
 868  2 : argv[argc++] = "foo";
 869  2 : argv[argc++] = "bar";
 870  2 : argv[argc] = NULL;
 871  2 : optind = start;
 872  2 : getopt_long_loop (argc, argv, "p:W;q:", long_options_required,
 873  : &p_value, &q_value,
 874  : &non_options_count, non_options, &unrecognized);
 875  2 : ASSERT (a_seen == 0);
 876  2 : ASSERT (b_seen == 0);
 877  2 : ASSERT (p_value != NULL && strcmp (p_value, "foo") == 0);
 878  2 : ASSERT (q_value == NULL);
 879  2 : ASSERT (non_options_count == 0);
 880  2 : ASSERT (unrecognized == 0);
 881  2 : ASSERT (optind == 4);
 882  : }
 883  3 : for (start = 0; start <= 1; start++)
 884  : {
 885  2 : const char *p_value = NULL;
 886  2 : const char *q_value = NULL;
 887  2 : int non_options_count = 0;
 888  : const char *non_options[10];
 889  2 : int unrecognized = 0;
 890  2 : int argc = 0;
 891  : const char *argv[10];
 892  2 : a_seen = 0;
 893  2 : b_seen = 0;
 894  : 
 895  2 : argv[argc++] = "program";
 896  2 : argv[argc++] = "-ab";
 897  2 : argv[argc++] = "-Wq";
 898  2 : argv[argc++] = "baz";
 899  2 : argv[argc++] = "-W";
 900  2 : argv[argc++] = "p=foo";
 901  2 : argv[argc++] = "bar";
 902  2 : argv[argc] = NULL;
 903  2 : optind = start;
 904  2 : getopt_long_loop (argc, argv, "W;abp:q:", long_options_required,
 905  : &p_value, &q_value,
 906  : &non_options_count, non_options, &unrecognized);
 907  2 : ASSERT (a_seen == 1);
 908  2 : ASSERT (b_seen == 1);
 909  2 : ASSERT (p_value != NULL && strcmp (p_value, "foo") == 0);
 910  2 : ASSERT (q_value != NULL && strcmp (q_value, "baz") == 0);
 911  2 : ASSERT (non_options_count == 0);
 912  2 : ASSERT (unrecognized == 0);
 913  2 : ASSERT (optind == 6);
 914  : }
 915  : 
 916  : /* Test processing of short options with optional arguments. */
 917  3 : for (start = 0; start <= 1; start++)
 918  : {
 919  2 : const char *p_value = NULL;
 920  2 : const char *q_value = NULL;
 921  2 : int non_options_count = 0;
 922  : const char *non_options[10];
 923  2 : int unrecognized = 0;
 924  2 : int argc = 0;
 925  : const char *argv[10];
 926  2 : a_seen = 0;
 927  2 : b_seen = 0;
 928  : 
 929  2 : argv[argc++] = "program";
 930  2 : argv[argc++] = "-pfoo";
 931  2 : argv[argc++] = "bar";
 932  2 : argv[argc] = NULL;
 933  2 : optind = start;
 934  2 : getopt_long_loop (argc, argv, "p::q::", long_options_optional,
 935  : &p_value, &q_value,
 936  : &non_options_count, non_options, &unrecognized);
 937  2 : ASSERT (a_seen == 0);
 938  2 : ASSERT (b_seen == 0);
 939  2 : ASSERT (p_value != NULL && strcmp (p_value, "foo") == 0);
 940  2 : ASSERT (q_value == NULL);
 941  2 : ASSERT (non_options_count == 0);
 942  2 : ASSERT (unrecognized == 0);
 943  2 : ASSERT (optind == 2);
 944  : }
 945  3 : for (start = 0; start <= 1; start++)
 946  : {
 947  2 : const char *p_value = NULL;
 948  2 : const char *q_value = NULL;
 949  2 : int non_options_count = 0;
 950  : const char *non_options[10];
 951  2 : int unrecognized = 0;
 952  2 : int argc = 0;
 953  : const char *argv[10];
 954  2 : a_seen = 0;
 955  2 : b_seen = 0;
 956  : 
 957  2 : argv[argc++] = "program";
 958  2 : argv[argc++] = "-p";
 959  2 : argv[argc++] = "foo";
 960  2 : argv[argc++] = "bar";
 961  2 : argv[argc] = NULL;
 962  2 : optind = start;
 963  2 : getopt_long_loop (argc, argv, "p::q::", long_options_optional,
 964  : &p_value, &q_value,
 965  : &non_options_count, non_options, &unrecognized);
 966  2 : ASSERT (a_seen == 0);
 967  2 : ASSERT (b_seen == 0);
 968  2 : ASSERT (p_value == NULL);
 969  2 : ASSERT (q_value == NULL);
 970  2 : ASSERT (non_options_count == 0);
 971  2 : ASSERT (unrecognized == 0);
 972  2 : ASSERT (optind == 2);
 973  : }
 974  3 : for (start = 0; start <= 1; start++)
 975  : {
 976  2 : const char *p_value = NULL;
 977  2 : const char *q_value = NULL;
 978  2 : int non_options_count = 0;
 979  : const char *non_options[10];
 980  2 : int unrecognized = 0;
 981  2 : int argc = 0;
 982  : const char *argv[10];
 983  2 : a_seen = 0;
 984  2 : b_seen = 0;
 985  : 
 986  2 : argv[argc++] = "program";
 987  2 : argv[argc++] = "-p";
 988  2 : argv[argc++] = "-a";
 989  2 : argv[argc++] = "bar";
 990  2 : argv[argc] = NULL;
 991  2 : optind = start;
 992  2 : getopt_long_loop (argc, argv, "abp::q::", long_options_optional,
 993  : &p_value, &q_value,
 994  : &non_options_count, non_options, &unrecognized);
 995  2 : ASSERT (a_seen == 1);
 996  2 : ASSERT (b_seen == 0);
 997  2 : ASSERT (p_value == NULL);
 998  2 : ASSERT (q_value == NULL);
 999  2 : ASSERT (non_options_count == 0);
 1000  2 : ASSERT (unrecognized == 0);
 1001  2 : ASSERT (optind == 3);
 1002  : }
 1003  : 
 1004  : /* Test processing of long options with optional arguments. */
 1005  3 : for (start = 0; start <= 1; start++)
 1006  : {
 1007  2 : const char *p_value = NULL;
 1008  2 : const char *q_value = NULL;
 1009  2 : int non_options_count = 0;
 1010  : const char *non_options[10];
 1011  2 : int unrecognized = 0;
 1012  2 : int argc = 0;
 1013  : const char *argv[10];
 1014  2 : a_seen = 0;
 1015  2 : b_seen = 0;
 1016  : 
 1017  2 : argv[argc++] = "program";
 1018  2 : argv[argc++] = "--p=foo";
 1019  2 : argv[argc++] = "bar";
 1020  2 : argv[argc] = NULL;
 1021  2 : optind = start;
 1022  2 : getopt_long_loop (argc, argv, "p::q::", long_options_optional,
 1023  : &p_value, &q_value,
 1024  : &non_options_count, non_options, &unrecognized);
 1025  2 : ASSERT (a_seen == 0);
 1026  2 : ASSERT (b_seen == 0);
 1027  2 : ASSERT (p_value != NULL && strcmp (p_value, "foo") == 0);
 1028  2 : ASSERT (q_value == NULL);
 1029  2 : ASSERT (non_options_count == 0);
 1030  2 : ASSERT (unrecognized == 0);
 1031  2 : ASSERT (optind == 2);
 1032  : }
 1033  3 : for (start = 0; start <= 1; start++)
 1034  : {
 1035  2 : const char *p_value = NULL;
 1036  2 : const char *q_value = NULL;
 1037  2 : int non_options_count = 0;
 1038  : const char *non_options[10];
 1039  2 : int unrecognized = 0;
 1040  2 : int argc = 0;
 1041  : const char *argv[10];
 1042  2 : a_seen = 0;
 1043  2 : b_seen = 0;
 1044  : 
 1045  2 : argv[argc++] = "program";
 1046  2 : argv[argc++] = "--p";
 1047  2 : argv[argc++] = "foo";
 1048  2 : argv[argc++] = "bar";
 1049  2 : argv[argc] = NULL;
 1050  2 : optind = start;
 1051  2 : getopt_long_loop (argc, argv, "p::q::", long_options_optional,
 1052  : &p_value, &q_value,
 1053  : &non_options_count, non_options, &unrecognized);
 1054  2 : ASSERT (a_seen == 0);
 1055  2 : ASSERT (b_seen == 0);
 1056  2 : ASSERT (p_value == NULL);
 1057  2 : ASSERT (q_value == NULL);
 1058  2 : ASSERT (non_options_count == 0);
 1059  2 : ASSERT (unrecognized == 0);
 1060  2 : ASSERT (optind == 2);
 1061  : }
 1062  3 : for (start = 0; start <= 1; start++)
 1063  : {
 1064  2 : const char *p_value = NULL;
 1065  2 : const char *q_value = NULL;
 1066  2 : int non_options_count = 0;
 1067  : const char *non_options[10];
 1068  2 : int unrecognized = 0;
 1069  2 : int argc = 0;
 1070  : const char *argv[10];
 1071  2 : a_seen = 0;
 1072  2 : b_seen = 0;
 1073  : 
 1074  2 : argv[argc++] = "program";
 1075  2 : argv[argc++] = "--p=";
 1076  2 : argv[argc++] = "foo";
 1077  2 : argv[argc++] = "bar";
 1078  2 : argv[argc] = NULL;
 1079  2 : optind = start;
 1080  2 : getopt_long_loop (argc, argv, "p::q::", long_options_optional,
 1081  : &p_value, &q_value,
 1082  : &non_options_count, non_options, &unrecognized);
 1083  2 : ASSERT (a_seen == 0);
 1084  2 : ASSERT (b_seen == 0);
 1085  2 : ASSERT (p_value != NULL && *p_value == '0円');
 1086  2 : ASSERT (q_value == NULL);
 1087  2 : ASSERT (non_options_count == 0);
 1088  2 : ASSERT (unrecognized == 0);
 1089  2 : ASSERT (optind == 2);
 1090  : }
 1091  3 : for (start = 0; start <= 1; start++)
 1092  : {
 1093  2 : const char *p_value = NULL;
 1094  2 : const char *q_value = NULL;
 1095  2 : int non_options_count = 0;
 1096  : const char *non_options[10];
 1097  2 : int unrecognized = 0;
 1098  2 : int argc = 0;
 1099  : const char *argv[10];
 1100  2 : a_seen = 0;
 1101  2 : b_seen = 0;
 1102  : 
 1103  2 : argv[argc++] = "program";
 1104  2 : argv[argc++] = "--p";
 1105  2 : argv[argc++] = "-a";
 1106  2 : argv[argc++] = "bar";
 1107  2 : argv[argc] = NULL;
 1108  2 : optind = start;
 1109  2 : getopt_long_loop (argc, argv, "abp::q::", long_options_optional,
 1110  : &p_value, &q_value,
 1111  : &non_options_count, non_options, &unrecognized);
 1112  2 : ASSERT (a_seen == 1);
 1113  2 : ASSERT (b_seen == 0);
 1114  2 : ASSERT (p_value == NULL);
 1115  2 : ASSERT (q_value == NULL);
 1116  2 : ASSERT (non_options_count == 0);
 1117  2 : ASSERT (unrecognized == 0);
 1118  2 : ASSERT (optind == 3);
 1119  : }
 1120  : 
 1121  : /* Test processing of long options with optional arguments via -W. */
 1122  3 : for (start = 0; start <= 1; start++)
 1123  : {
 1124  2 : const char *p_value = NULL;
 1125  2 : const char *q_value = NULL;
 1126  2 : int non_options_count = 0;
 1127  : const char *non_options[10];
 1128  2 : int unrecognized = 0;
 1129  2 : int argc = 0;
 1130  : const char *argv[10];
 1131  2 : a_seen = 0;
 1132  2 : b_seen = 0;
 1133  : 
 1134  2 : argv[argc++] = "program";
 1135  2 : argv[argc++] = "-Wp=foo";
 1136  2 : argv[argc++] = "bar";
 1137  2 : argv[argc] = NULL;
 1138  2 : optind = start;
 1139  2 : getopt_long_loop (argc, argv, "p::q::W;", long_options_optional,
 1140  : &p_value, &q_value,
 1141  : &non_options_count, non_options, &unrecognized);
 1142  2 : ASSERT (a_seen == 0);
 1143  2 : ASSERT (b_seen == 0);
 1144  2 : ASSERT (p_value != NULL && strcmp (p_value, "foo") == 0);
 1145  2 : ASSERT (q_value == NULL);
 1146  2 : ASSERT (non_options_count == 0);
 1147  2 : ASSERT (unrecognized == 0);
 1148  2 : ASSERT (optind == 2);
 1149  : }
 1150  3 : for (start = 0; start <= 1; start++)
 1151  : {
 1152  2 : const char *p_value = NULL;
 1153  2 : const char *q_value = NULL;
 1154  2 : int non_options_count = 0;
 1155  : const char *non_options[10];
 1156  2 : int unrecognized = 0;
 1157  2 : int argc = 0;
 1158  : const char *argv[10];
 1159  2 : a_seen = 0;
 1160  2 : b_seen = 0;
 1161  : 
 1162  2 : argv[argc++] = "program";
 1163  2 : argv[argc++] = "-Wp";
 1164  2 : argv[argc++] = "foo";
 1165  2 : argv[argc++] = "bar";
 1166  2 : argv[argc] = NULL;
 1167  2 : optind = start;
 1168  2 : getopt_long_loop (argc, argv, "p::q::W;", long_options_optional,
 1169  : &p_value, &q_value,
 1170  : &non_options_count, non_options, &unrecognized);
 1171  2 : ASSERT (a_seen == 0);
 1172  2 : ASSERT (b_seen == 0);
 1173  2 : ASSERT (p_value == NULL);
 1174  2 : ASSERT (q_value == NULL);
 1175  2 : ASSERT (non_options_count == 0);
 1176  2 : ASSERT (unrecognized == 0);
 1177  2 : ASSERT (optind == 2);
 1178  : }
 1179  3 : for (start = 0; start <= 1; start++)
 1180  : {
 1181  2 : const char *p_value = NULL;
 1182  2 : const char *q_value = NULL;
 1183  2 : int non_options_count = 0;
 1184  : const char *non_options[10];
 1185  2 : int unrecognized = 0;
 1186  2 : int argc = 0;
 1187  : const char *argv[10];
 1188  2 : a_seen = 0;
 1189  2 : b_seen = 0;
 1190  : 
 1191  2 : argv[argc++] = "program";
 1192  2 : argv[argc++] = "-Wp=";
 1193  2 : argv[argc++] = "foo";
 1194  2 : argv[argc++] = "bar";
 1195  2 : argv[argc] = NULL;
 1196  2 : optind = start;
 1197  2 : getopt_long_loop (argc, argv, "W;p::q::", long_options_optional,
 1198  : &p_value, &q_value,
 1199  : &non_options_count, non_options, &unrecognized);
 1200  2 : ASSERT (a_seen == 0);
 1201  2 : ASSERT (b_seen == 0);
 1202  2 : ASSERT (p_value != NULL && *p_value == '0円');
 1203  2 : ASSERT (q_value == NULL);
 1204  2 : ASSERT (non_options_count == 0);
 1205  2 : ASSERT (unrecognized == 0);
 1206  2 : ASSERT (optind == 2);
 1207  : }
 1208  3 : for (start = 0; start <= 1; start++)
 1209  : {
 1210  2 : const char *p_value = NULL;
 1211  2 : const char *q_value = NULL;
 1212  2 : int non_options_count = 0;
 1213  : const char *non_options[10];
 1214  2 : int unrecognized = 0;
 1215  2 : int argc = 0;
 1216  : const char *argv[10];
 1217  2 : a_seen = 0;
 1218  2 : b_seen = 0;
 1219  : 
 1220  2 : argv[argc++] = "program";
 1221  2 : argv[argc++] = "-W";
 1222  2 : argv[argc++] = "p=";
 1223  2 : argv[argc++] = "foo";
 1224  2 : argv[argc++] = "bar";
 1225  2 : argv[argc] = NULL;
 1226  2 : optind = start;
 1227  2 : getopt_long_loop (argc, argv, "W;p::q::", long_options_optional,
 1228  : &p_value, &q_value,
 1229  : &non_options_count, non_options, &unrecognized);
 1230  2 : ASSERT (a_seen == 0);
 1231  2 : ASSERT (b_seen == 0);
 1232  2 : ASSERT (p_value != NULL && *p_value == '0円');
 1233  2 : ASSERT (q_value == NULL);
 1234  2 : ASSERT (non_options_count == 0);
 1235  2 : ASSERT (unrecognized == 0);
 1236  2 : ASSERT (optind == 3);
 1237  : }
 1238  3 : for (start = 0; start <= 1; start++)
 1239  : {
 1240  2 : const char *p_value = NULL;
 1241  2 : const char *q_value = NULL;
 1242  2 : int non_options_count = 0;
 1243  : const char *non_options[10];
 1244  2 : int unrecognized = 0;
 1245  2 : int argc = 0;
 1246  : const char *argv[10];
 1247  2 : a_seen = 0;
 1248  2 : b_seen = 0;
 1249  : 
 1250  2 : argv[argc++] = "program";
 1251  2 : argv[argc++] = "-W";
 1252  2 : argv[argc++] = "p";
 1253  2 : argv[argc++] = "-a";
 1254  2 : argv[argc++] = "bar";
 1255  2 : argv[argc] = NULL;
 1256  2 : optind = start;
 1257  2 : getopt_long_loop (argc, argv, "W;abp::q::", long_options_optional,
 1258  : &p_value, &q_value,
 1259  : &non_options_count, non_options, &unrecognized);
 1260  2 : ASSERT (a_seen == 1);
 1261  2 : ASSERT (b_seen == 0);
 1262  : /* ASSERT (p_value == NULL); */
 1263  2 : ASSERT (q_value == NULL);
 1264  2 : ASSERT (non_options_count == 0);
 1265  2 : ASSERT (unrecognized == 0);
 1266  2 : ASSERT (optind == 4);
 1267  : }
 1268  : 
 1269  : /* Check that invalid options are recognized. */
 1270  3 : for (start = 0; start <= 1; start++)
 1271  : {
 1272  2 : const char *p_value = NULL;
 1273  2 : const char *q_value = NULL;
 1274  2 : int non_options_count = 0;
 1275  : const char *non_options[10];
 1276  2 : int unrecognized = 0;
 1277  2 : int argc = 0;
 1278  : const char *argv[10];
 1279  2 : a_seen = 0;
 1280  2 : b_seen = 0;
 1281  : 
 1282  2 : argv[argc++] = "program";
 1283  2 : argv[argc++] = "-p";
 1284  2 : argv[argc++] = "foo";
 1285  2 : argv[argc++] = "-x";
 1286  2 : argv[argc++] = "-a";
 1287  2 : argv[argc++] = "bar";
 1288  2 : argv[argc] = NULL;
 1289  2 : optind = start;
 1290  2 : getopt_long_loop (argc, argv, "abp:q:", long_options_required,
 1291  : &p_value, &q_value,
 1292  : &non_options_count, non_options, &unrecognized);
 1293  2 : ASSERT (a_seen == 1);
 1294  2 : ASSERT (b_seen == 0);
 1295  2 : ASSERT (p_value != NULL && strcmp (p_value, "foo") == 0);
 1296  2 : ASSERT (q_value == NULL);
 1297  2 : ASSERT (non_options_count == 0);
 1298  2 : ASSERT (unrecognized == 'x');
 1299  2 : ASSERT (optind == 5);
 1300  : }
 1301  3 : for (start = 0; start <= 1; start++)
 1302  : {
 1303  2 : const char *p_value = NULL;
 1304  2 : const char *q_value = NULL;
 1305  2 : int non_options_count = 0;
 1306  : const char *non_options[10];
 1307  2 : int unrecognized = 0;
 1308  2 : int argc = 0;
 1309  : const char *argv[10];
 1310  2 : a_seen = 0;
 1311  2 : b_seen = 0;
 1312  : 
 1313  2 : argv[argc++] = "program";
 1314  2 : argv[argc++] = "-p";
 1315  2 : argv[argc++] = "foo";
 1316  2 : argv[argc++] = "-:";
 1317  2 : argv[argc++] = "-a";
 1318  2 : argv[argc++] = "bar";
 1319  2 : argv[argc] = NULL;
 1320  2 : optind = start;
 1321  2 : getopt_long_loop (argc, argv, "abp:q:", long_options_required,
 1322  : &p_value, &q_value,
 1323  : &non_options_count, non_options, &unrecognized);
 1324  2 : ASSERT (a_seen == 1);
 1325  2 : ASSERT (b_seen == 0);
 1326  2 : ASSERT (p_value != NULL && strcmp (p_value, "foo") == 0);
 1327  2 : ASSERT (q_value == NULL);
 1328  2 : ASSERT (non_options_count == 0);
 1329  2 : ASSERT (unrecognized == ':');
 1330  2 : ASSERT (optind == 5);
 1331  : }
 1332  : 
 1333  : /* Check that unexpected arguments are recognized. */
 1334  3 : for (start = 0; start <= 1; start++)
 1335  : {
 1336  2 : const char *p_value = NULL;
 1337  2 : const char *q_value = NULL;
 1338  2 : int non_options_count = 0;
 1339  : const char *non_options[10];
 1340  2 : int unrecognized = 0;
 1341  2 : int argc = 0;
 1342  : const char *argv[10];
 1343  2 : a_seen = 0;
 1344  2 : b_seen = 0;
 1345  : 
 1346  2 : argv[argc++] = "program";
 1347  2 : argv[argc++] = "-p";
 1348  2 : argv[argc++] = "foo";
 1349  2 : argv[argc++] = "--a=";
 1350  2 : argv[argc++] = "bar";
 1351  2 : argv[argc] = NULL;
 1352  2 : optind = start;
 1353  2 : getopt_long_loop (argc, argv, "abp:q:", long_options_required,
 1354  : &p_value, &q_value,
 1355  : &non_options_count, non_options, &unrecognized);
 1356  2 : ASSERT (a_seen == 0);
 1357  2 : ASSERT (b_seen == 0);
 1358  2 : ASSERT (p_value != NULL && strcmp (p_value, "foo") == 0);
 1359  2 : ASSERT (q_value == NULL);
 1360  2 : ASSERT (non_options_count == 0);
 1361  2 : ASSERT (unrecognized == 'a');
 1362  2 : ASSERT (optind == 4);
 1363  : }
 1364  3 : for (start = 0; start <= 1; start++)
 1365  : {
 1366  2 : const char *p_value = NULL;
 1367  2 : const char *q_value = NULL;
 1368  2 : int non_options_count = 0;
 1369  : const char *non_options[10];
 1370  2 : int unrecognized = 0;
 1371  2 : int argc = 0;
 1372  : const char *argv[10];
 1373  2 : a_seen = 0;
 1374  2 : b_seen = 0;
 1375  : 
 1376  2 : argv[argc++] = "program";
 1377  2 : argv[argc++] = "-p";
 1378  2 : argv[argc++] = "foo";
 1379  2 : argv[argc++] = "--b=";
 1380  2 : argv[argc++] = "bar";
 1381  2 : argv[argc] = NULL;
 1382  2 : optind = start;
 1383  2 : getopt_long_loop (argc, argv, "abp:q:", long_options_required,
 1384  : &p_value, &q_value,
 1385  : &non_options_count, non_options, &unrecognized);
 1386  2 : ASSERT (a_seen == 0);
 1387  2 : ASSERT (b_seen == 0);
 1388  2 : ASSERT (p_value != NULL && strcmp (p_value, "foo") == 0);
 1389  2 : ASSERT (q_value == NULL);
 1390  2 : ASSERT (non_options_count == 0);
 1391  : /* When flag is non-zero, glibc sets optopt anyway, but BSD
 1392  : leaves optopt unchanged. */
 1393  2 : ASSERT (unrecognized == 1 || unrecognized == 0);
 1394  2 : ASSERT (optind == 4);
 1395  : }
 1396  : 
 1397  : /* Check that by default, non-options arguments are moved to the end. */
 1398  3 : for (start = 0; start <= 1; start++)
 1399  : {
 1400  2 : const char *p_value = NULL;
 1401  2 : const char *q_value = NULL;
 1402  2 : int non_options_count = 0;
 1403  : const char *non_options[10];
 1404  2 : int unrecognized = 0;
 1405  2 : int argc = 0;
 1406  : const char *argv[10];
 1407  2 : a_seen = 0;
 1408  2 : b_seen = 0;
 1409  : 
 1410  2 : argv[argc++] = "program";
 1411  2 : argv[argc++] = "donald";
 1412  2 : argv[argc++] = "-p";
 1413  2 : argv[argc++] = "billy";
 1414  2 : argv[argc++] = "duck";
 1415  2 : argv[argc++] = "-a";
 1416  2 : argv[argc++] = "bar";
 1417  2 : argv[argc] = NULL;
 1418  2 : optind = start;
 1419  2 : getopt_long_loop (argc, argv, "abp:q:", long_options_required,
 1420  : &p_value, &q_value,
 1421  : &non_options_count, non_options, &unrecognized);
 1422  2 : ASSERT (strcmp (argv[0], "program") == 0);
 1423  2 : ASSERT (strcmp (argv[1], "-p") == 0);
 1424  2 : ASSERT (strcmp (argv[2], "billy") == 0);
 1425  2 : ASSERT (strcmp (argv[3], "-a") == 0);
 1426  2 : ASSERT (strcmp (argv[4], "donald") == 0);
 1427  2 : ASSERT (strcmp (argv[5], "duck") == 0);
 1428  2 : ASSERT (strcmp (argv[6], "bar") == 0);
 1429  2 : ASSERT (argv[7] == NULL);
 1430  2 : ASSERT (a_seen == 1);
 1431  2 : ASSERT (b_seen == 0);
 1432  2 : ASSERT (p_value != NULL && strcmp (p_value, "billy") == 0);
 1433  2 : ASSERT (q_value == NULL);
 1434  2 : ASSERT (non_options_count == 0);
 1435  2 : ASSERT (unrecognized == 0);
 1436  2 : ASSERT (optind == 4);
 1437  : }
 1438  : 
 1439  : /* Check that '--' ends the argument processing. */
 1440  3 : for (start = 0; start <= 1; start++)
 1441  : {
 1442  2 : const char *p_value = NULL;
 1443  2 : const char *q_value = NULL;
 1444  2 : int non_options_count = 0;
 1445  : const char *non_options[10];
 1446  2 : int unrecognized = 0;
 1447  2 : int argc = 0;
 1448  : const char *argv[20];
 1449  2 : a_seen = 0;
 1450  2 : b_seen = 0;
 1451  : 
 1452  2 : argv[argc++] = "program";
 1453  2 : argv[argc++] = "donald";
 1454  2 : argv[argc++] = "-p";
 1455  2 : argv[argc++] = "billy";
 1456  2 : argv[argc++] = "duck";
 1457  2 : argv[argc++] = "-a";
 1458  2 : argv[argc++] = "--";
 1459  2 : argv[argc++] = "-b";
 1460  2 : argv[argc++] = "foo";
 1461  2 : argv[argc++] = "-q";
 1462  2 : argv[argc++] = "johnny";
 1463  2 : argv[argc++] = "bar";
 1464  2 : argv[argc] = NULL;
 1465  2 : optind = start;
 1466  2 : getopt_long_loop (argc, argv, "abp:q:", long_options_required,
 1467  : &p_value, &q_value,
 1468  : &non_options_count, non_options, &unrecognized);
 1469  2 : ASSERT (strcmp (argv[0], "program") == 0);
 1470  2 : ASSERT (strcmp (argv[1], "-p") == 0);
 1471  2 : ASSERT (strcmp (argv[2], "billy") == 0);
 1472  2 : ASSERT (strcmp (argv[3], "-a") == 0);
 1473  2 : ASSERT (strcmp (argv[4], "--") == 0);
 1474  2 : ASSERT (strcmp (argv[5], "donald") == 0);
 1475  2 : ASSERT (strcmp (argv[6], "duck") == 0);
 1476  2 : ASSERT (strcmp (argv[7], "-b") == 0);
 1477  2 : ASSERT (strcmp (argv[8], "foo") == 0);
 1478  2 : ASSERT (strcmp (argv[9], "-q") == 0);
 1479  2 : ASSERT (strcmp (argv[10], "johnny") == 0);
 1480  2 : ASSERT (strcmp (argv[11], "bar") == 0);
 1481  2 : ASSERT (argv[12] == NULL);
 1482  2 : ASSERT (a_seen == 1);
 1483  2 : ASSERT (b_seen == 0);
 1484  2 : ASSERT (p_value != NULL && strcmp (p_value, "billy") == 0);
 1485  2 : ASSERT (q_value == NULL);
 1486  2 : ASSERT (non_options_count == 0);
 1487  2 : ASSERT (unrecognized == 0);
 1488  2 : ASSERT (optind == 5);
 1489  : }
 1490  : 
 1491  : /* Check that the '-' flag causes non-options to be returned in order. */
 1492  3 : for (start = 0; start <= 1; start++)
 1493  : {
 1494  2 : const char *p_value = NULL;
 1495  2 : const char *q_value = NULL;
 1496  2 : int non_options_count = 0;
 1497  : const char *non_options[10];
 1498  2 : int unrecognized = 0;
 1499  2 : int argc = 0;
 1500  : const char *argv[10];
 1501  2 : a_seen = 0;
 1502  2 : b_seen = 0;
 1503  : 
 1504  2 : argv[argc++] = "program";
 1505  2 : argv[argc++] = "donald";
 1506  2 : argv[argc++] = "-p";
 1507  2 : argv[argc++] = "billy";
 1508  2 : argv[argc++] = "duck";
 1509  2 : argv[argc++] = "-a";
 1510  2 : argv[argc++] = "bar";
 1511  2 : argv[argc] = NULL;
 1512  2 : optind = start;
 1513  2 : getopt_long_loop (argc, argv, "-abp:q:", long_options_required,
 1514  : &p_value, &q_value,
 1515  : &non_options_count, non_options, &unrecognized);
 1516  2 : ASSERT (strcmp (argv[0], "program") == 0);
 1517  2 : ASSERT (strcmp (argv[1], "donald") == 0);
 1518  2 : ASSERT (strcmp (argv[2], "-p") == 0);
 1519  2 : ASSERT (strcmp (argv[3], "billy") == 0);
 1520  2 : ASSERT (strcmp (argv[4], "duck") == 0);
 1521  2 : ASSERT (strcmp (argv[5], "-a") == 0);
 1522  2 : ASSERT (strcmp (argv[6], "bar") == 0);
 1523  2 : ASSERT (argv[7] == NULL);
 1524  2 : ASSERT (a_seen == 1);
 1525  2 : ASSERT (b_seen == 0);
 1526  2 : ASSERT (p_value != NULL && strcmp (p_value, "billy") == 0);
 1527  2 : ASSERT (q_value == NULL);
 1528  2 : ASSERT (non_options_count == 3);
 1529  2 : ASSERT (strcmp (non_options[0], "donald") == 0);
 1530  2 : ASSERT (strcmp (non_options[1], "duck") == 0);
 1531  2 : ASSERT (strcmp (non_options[2], "bar") == 0);
 1532  2 : ASSERT (unrecognized == 0);
 1533  2 : ASSERT (optind == 7);
 1534  : }
 1535  : 
 1536  : /* Check that '--' ends the argument processing. */
 1537  3 : for (start = 0; start <= 1; start++)
 1538  : {
 1539  2 : const char *p_value = NULL;
 1540  2 : const char *q_value = NULL;
 1541  2 : int non_options_count = 0;
 1542  : const char *non_options[10];
 1543  2 : int unrecognized = 0;
 1544  2 : int argc = 0;
 1545  : const char *argv[20];
 1546  2 : a_seen = 0;
 1547  2 : b_seen = 0;
 1548  : 
 1549  2 : argv[argc++] = "program";
 1550  2 : argv[argc++] = "donald";
 1551  2 : argv[argc++] = "-p";
 1552  2 : argv[argc++] = "billy";
 1553  2 : argv[argc++] = "duck";
 1554  2 : argv[argc++] = "-a";
 1555  2 : argv[argc++] = "--";
 1556  2 : argv[argc++] = "-b";
 1557  2 : argv[argc++] = "foo";
 1558  2 : argv[argc++] = "-q";
 1559  2 : argv[argc++] = "johnny";
 1560  2 : argv[argc++] = "bar";
 1561  2 : argv[argc] = NULL;
 1562  2 : optind = start;
 1563  2 : getopt_long_loop (argc, argv, "-abp:q:", long_options_required,
 1564  : &p_value, &q_value,
 1565  : &non_options_count, non_options, &unrecognized);
 1566  2 : ASSERT (strcmp (argv[0], "program") == 0);
 1567  2 : ASSERT (strcmp (argv[1], "donald") == 0);
 1568  2 : ASSERT (strcmp (argv[2], "-p") == 0);
 1569  2 : ASSERT (strcmp (argv[3], "billy") == 0);
 1570  2 : ASSERT (strcmp (argv[4], "duck") == 0);
 1571  2 : ASSERT (strcmp (argv[5], "-a") == 0);
 1572  2 : ASSERT (strcmp (argv[6], "--") == 0);
 1573  2 : ASSERT (strcmp (argv[7], "-b") == 0);
 1574  2 : ASSERT (strcmp (argv[8], "foo") == 0);
 1575  2 : ASSERT (strcmp (argv[9], "-q") == 0);
 1576  2 : ASSERT (strcmp (argv[10], "johnny") == 0);
 1577  2 : ASSERT (strcmp (argv[11], "bar") == 0);
 1578  2 : ASSERT (argv[12] == NULL);
 1579  2 : ASSERT (a_seen == 1);
 1580  2 : ASSERT (b_seen == 0);
 1581  2 : ASSERT (p_value != NULL && strcmp (p_value, "billy") == 0);
 1582  2 : ASSERT (q_value == NULL);
 1583  2 : if (non_options_count == 2)
 1584  : {
 1585  : /* glibc behaviour. */
 1586  2 : ASSERT (non_options_count == 2);
 1587  2 : ASSERT (strcmp (non_options[0], "donald") == 0);
 1588  2 : ASSERT (strcmp (non_options[1], "duck") == 0);
 1589  2 : ASSERT (unrecognized == 0);
 1590  2 : ASSERT (optind == 7);
 1591  : }
 1592  : else
 1593  : {
 1594  : /* Another valid behaviour. */
 1595  0 : ASSERT (non_options_count == 7);
 1596  0 : ASSERT (strcmp (non_options[0], "donald") == 0);
 1597  0 : ASSERT (strcmp (non_options[1], "duck") == 0);
 1598  0 : ASSERT (strcmp (non_options[2], "-b") == 0);
 1599  0 : ASSERT (strcmp (non_options[3], "foo") == 0);
 1600  0 : ASSERT (strcmp (non_options[4], "-q") == 0);
 1601  0 : ASSERT (strcmp (non_options[5], "johnny") == 0);
 1602  0 : ASSERT (strcmp (non_options[6], "bar") == 0);
 1603  0 : ASSERT (unrecognized == 0);
 1604  0 : ASSERT (optind == 12);
 1605  : }
 1606  : }
 1607  : 
 1608  : /* Check that the '-' flag has to come first. */
 1609  3 : for (start = 0; start <= 1; start++)
 1610  : {
 1611  2 : const char *p_value = NULL;
 1612  2 : const char *q_value = NULL;
 1613  2 : int non_options_count = 0;
 1614  : const char *non_options[10];
 1615  2 : int unrecognized = 0;
 1616  2 : int argc = 0;
 1617  : const char *argv[10];
 1618  2 : a_seen = 0;
 1619  2 : b_seen = 0;
 1620  : 
 1621  2 : argv[argc++] = "program";
 1622  2 : argv[argc++] = "donald";
 1623  2 : argv[argc++] = "-p";
 1624  2 : argv[argc++] = "billy";
 1625  2 : argv[argc++] = "duck";
 1626  2 : argv[argc++] = "-a";
 1627  2 : argv[argc++] = "bar";
 1628  2 : argv[argc] = NULL;
 1629  2 : optind = start;
 1630  2 : getopt_long_loop (argc, argv, "abp:q:-", long_options_required,
 1631  : &p_value, &q_value,
 1632  : &non_options_count, non_options, &unrecognized);
 1633  2 : ASSERT (strcmp (argv[0], "program") == 0);
 1634  2 : ASSERT (strcmp (argv[1], "-p") == 0);
 1635  2 : ASSERT (strcmp (argv[2], "billy") == 0);
 1636  2 : ASSERT (strcmp (argv[3], "-a") == 0);
 1637  2 : ASSERT (strcmp (argv[4], "donald") == 0);
 1638  2 : ASSERT (strcmp (argv[5], "duck") == 0);
 1639  2 : ASSERT (strcmp (argv[6], "bar") == 0);
 1640  2 : ASSERT (argv[7] == NULL);
 1641  2 : ASSERT (a_seen == 1);
 1642  2 : ASSERT (b_seen == 0);
 1643  2 : ASSERT (p_value != NULL && strcmp (p_value, "billy") == 0);
 1644  2 : ASSERT (q_value == NULL);
 1645  2 : ASSERT (non_options_count == 0);
 1646  2 : ASSERT (unrecognized == 0);
 1647  2 : ASSERT (optind == 4);
 1648  : }
 1649  : 
 1650  : /* Check that the '+' flag causes the first non-option to terminate the
 1651  : loop. */
 1652  3 : for (start = 0; start <= 1; start++)
 1653  : {
 1654  2 : const char *p_value = NULL;
 1655  2 : const char *q_value = NULL;
 1656  2 : int non_options_count = 0;
 1657  : const char *non_options[10];
 1658  2 : int unrecognized = 0;
 1659  2 : int argc = 0;
 1660  : const char *argv[10];
 1661  2 : a_seen = 0;
 1662  2 : b_seen = 0;
 1663  : 
 1664  2 : argv[argc++] = "program";
 1665  2 : argv[argc++] = "donald";
 1666  2 : argv[argc++] = "-p";
 1667  2 : argv[argc++] = "billy";
 1668  2 : argv[argc++] = "duck";
 1669  2 : argv[argc++] = "-a";
 1670  2 : argv[argc++] = "bar";
 1671  2 : argv[argc] = NULL;
 1672  2 : optind = start;
 1673  2 : getopt_long_loop (argc, argv, "+abp:q:", long_options_required,
 1674  : &p_value, &q_value,
 1675  : &non_options_count, non_options, &unrecognized);
 1676  2 : ASSERT (strcmp (argv[0], "program") == 0);
 1677  2 : ASSERT (strcmp (argv[1], "donald") == 0);
 1678  2 : ASSERT (strcmp (argv[2], "-p") == 0);
 1679  2 : ASSERT (strcmp (argv[3], "billy") == 0);
 1680  2 : ASSERT (strcmp (argv[4], "duck") == 0);
 1681  2 : ASSERT (strcmp (argv[5], "-a") == 0);
 1682  2 : ASSERT (strcmp (argv[6], "bar") == 0);
 1683  2 : ASSERT (argv[7] == NULL);
 1684  2 : ASSERT (a_seen == 0);
 1685  2 : ASSERT (b_seen == 0);
 1686  2 : ASSERT (p_value == NULL);
 1687  2 : ASSERT (q_value == NULL);
 1688  2 : ASSERT (non_options_count == 0);
 1689  2 : ASSERT (unrecognized == 0);
 1690  2 : ASSERT (optind == 1);
 1691  : }
 1692  3 : for (start = 0; start <= 1; start++)
 1693  : {
 1694  2 : const char *p_value = NULL;
 1695  2 : const char *q_value = NULL;
 1696  2 : int non_options_count = 0;
 1697  : const char *non_options[10];
 1698  2 : int unrecognized = 0;
 1699  2 : int argc = 0;
 1700  : const char *argv[10];
 1701  2 : a_seen = 0;
 1702  2 : b_seen = 0;
 1703  : 
 1704  2 : argv[argc++] = "program";
 1705  2 : argv[argc++] = "-+";
 1706  2 : argv[argc] = NULL;
 1707  2 : optind = start;
 1708  2 : getopt_long_loop (argc, argv, "+abp:q:", long_options_required,
 1709  : &p_value, &q_value,
 1710  : &non_options_count, non_options, &unrecognized);
 1711  2 : ASSERT (a_seen == 0);
 1712  2 : ASSERT (b_seen == 0);
 1713  2 : ASSERT (p_value == NULL);
 1714  2 : ASSERT (q_value == NULL);
 1715  2 : ASSERT (non_options_count == 0);
 1716  2 : ASSERT (unrecognized == '+');
 1717  2 : ASSERT (optind == 2);
 1718  : }
 1719  : 
 1720  : /* Check that '--' ends the argument processing. */
 1721  3 : for (start = 0; start <= 1; start++)
 1722  : {
 1723  2 : const char *p_value = NULL;
 1724  2 : const char *q_value = NULL;
 1725  2 : int non_options_count = 0;
 1726  : const char *non_options[10];
 1727  2 : int unrecognized = 0;
 1728  2 : int argc = 0;
 1729  : const char *argv[20];
 1730  2 : a_seen = 0;
 1731  2 : b_seen = 0;
 1732  : 
 1733  2 : argv[argc++] = "program";
 1734  2 : argv[argc++] = "donald";
 1735  2 : argv[argc++] = "-p";
 1736  2 : argv[argc++] = "billy";
 1737  2 : argv[argc++] = "duck";
 1738  2 : argv[argc++] = "-a";
 1739  2 : argv[argc++] = "--";
 1740  2 : argv[argc++] = "-b";
 1741  2 : argv[argc++] = "foo";
 1742  2 : argv[argc++] = "-q";
 1743  2 : argv[argc++] = "johnny";
 1744  2 : argv[argc++] = "bar";
 1745  2 : argv[argc] = NULL;
 1746  2 : optind = start;
 1747  2 : getopt_long_loop (argc, argv, "+abp:q:", long_options_required,
 1748  : &p_value, &q_value,
 1749  : &non_options_count, non_options, &unrecognized);
 1750  2 : ASSERT (strcmp (argv[0], "program") == 0);
 1751  2 : ASSERT (strcmp (argv[1], "donald") == 0);
 1752  2 : ASSERT (strcmp (argv[2], "-p") == 0);
 1753  2 : ASSERT (strcmp (argv[3], "billy") == 0);
 1754  2 : ASSERT (strcmp (argv[4], "duck") == 0);
 1755  2 : ASSERT (strcmp (argv[5], "-a") == 0);
 1756  2 : ASSERT (strcmp (argv[6], "--") == 0);
 1757  2 : ASSERT (strcmp (argv[7], "-b") == 0);
 1758  2 : ASSERT (strcmp (argv[8], "foo") == 0);
 1759  2 : ASSERT (strcmp (argv[9], "-q") == 0);
 1760  2 : ASSERT (strcmp (argv[10], "johnny") == 0);
 1761  2 : ASSERT (strcmp (argv[11], "bar") == 0);
 1762  2 : ASSERT (argv[12] == NULL);
 1763  2 : ASSERT (a_seen == 0);
 1764  2 : ASSERT (b_seen == 0);
 1765  2 : ASSERT (p_value == NULL);
 1766  2 : ASSERT (q_value == NULL);
 1767  2 : ASSERT (non_options_count == 0);
 1768  2 : ASSERT (unrecognized == 0);
 1769  2 : ASSERT (optind == 1);
 1770  : }
 1771  : 
 1772  : /* Check that the '+' flag has to come first. */
 1773  3 : for (start = 0; start <= 1; start++)
 1774  : {
 1775  2 : const char *p_value = NULL;
 1776  2 : const char *q_value = NULL;
 1777  2 : int non_options_count = 0;
 1778  : const char *non_options[10];
 1779  2 : int unrecognized = 0;
 1780  2 : int argc = 0;
 1781  : const char *argv[10];
 1782  2 : a_seen = 0;
 1783  2 : b_seen = 0;
 1784  : 
 1785  2 : argv[argc++] = "program";
 1786  2 : argv[argc++] = "donald";
 1787  2 : argv[argc++] = "-p";
 1788  2 : argv[argc++] = "billy";
 1789  2 : argv[argc++] = "duck";
 1790  2 : argv[argc++] = "-a";
 1791  2 : argv[argc++] = "bar";
 1792  2 : argv[argc] = NULL;
 1793  2 : optind = start;
 1794  2 : getopt_long_loop (argc, argv, "abp:q:+", long_options_required,
 1795  : &p_value, &q_value,
 1796  : &non_options_count, non_options, &unrecognized);
 1797  2 : ASSERT (strcmp (argv[0], "program") == 0);
 1798  2 : ASSERT (strcmp (argv[1], "-p") == 0);
 1799  2 : ASSERT (strcmp (argv[2], "billy") == 0);
 1800  2 : ASSERT (strcmp (argv[3], "-a") == 0);
 1801  2 : ASSERT (strcmp (argv[4], "donald") == 0);
 1802  2 : ASSERT (strcmp (argv[5], "duck") == 0);
 1803  2 : ASSERT (strcmp (argv[6], "bar") == 0);
 1804  2 : ASSERT (argv[7] == NULL);
 1805  2 : ASSERT (a_seen == 1);
 1806  2 : ASSERT (b_seen == 0);
 1807  2 : ASSERT (p_value != NULL && strcmp (p_value, "billy") == 0);
 1808  2 : ASSERT (q_value == NULL);
 1809  2 : ASSERT (non_options_count == 0);
 1810  2 : ASSERT (unrecognized == 0);
 1811  2 : ASSERT (optind == 4);
 1812  : }
 1813  1 : }
 1814  : 
 1815  : /* Test behavior of getopt_long when POSIXLY_CORRECT is set in the
 1816  : environment. Options with optional arguments should not change
 1817  : behavior just because of an environment variable.
 1818  : https://lists.gnu.org/r/bug-m4/2006-09/msg00028.html */
 1819  : static void
 1820  1 : test_getopt_long_posix (void)
 1821  : {
 1822  : int start;
 1823  : 
 1824  : /* Check that POSIXLY_CORRECT stops parsing the same as leading '+'. */
 1825  3 : for (start = 0; start <= 1; start++)
 1826  : {
 1827  2 : const char *p_value = NULL;
 1828  2 : const char *q_value = NULL;
 1829  2 : int non_options_count = 0;
 1830  : const char *non_options[10];
 1831  2 : int unrecognized = 0;
 1832  2 : int argc = 0;
 1833  : const char *argv[10];
 1834  2 : a_seen = 0;
 1835  2 : b_seen = 0;
 1836  : 
 1837  2 : argv[argc++] = "program";
 1838  2 : argv[argc++] = "donald";
 1839  2 : argv[argc++] = "-p";
 1840  2 : argv[argc++] = "billy";
 1841  2 : argv[argc++] = "duck";
 1842  2 : argv[argc++] = "-a";
 1843  2 : argv[argc++] = "bar";
 1844  2 : argv[argc] = NULL;
 1845  2 : optind = start;
 1846  2 : getopt_long_loop (argc, argv, "abp:q:", long_options_required,
 1847  : &p_value, &q_value,
 1848  : &non_options_count, non_options, &unrecognized);
 1849  2 : ASSERT (strcmp (argv[0], "program") == 0);
 1850  2 : ASSERT (strcmp (argv[1], "donald") == 0);
 1851  2 : ASSERT (strcmp (argv[2], "-p") == 0);
 1852  2 : ASSERT (strcmp (argv[3], "billy") == 0);
 1853  2 : ASSERT (strcmp (argv[4], "duck") == 0);
 1854  2 : ASSERT (strcmp (argv[5], "-a") == 0);
 1855  2 : ASSERT (strcmp (argv[6], "bar") == 0);
 1856  2 : ASSERT (argv[7] == NULL);
 1857  2 : ASSERT (a_seen == 0);
 1858  2 : ASSERT (b_seen == 0);
 1859  2 : ASSERT (p_value == NULL);
 1860  2 : ASSERT (q_value == NULL);
 1861  2 : ASSERT (non_options_count == 0);
 1862  2 : ASSERT (unrecognized == 0);
 1863  2 : ASSERT (optind == 1);
 1864  : }
 1865  : 
 1866  : /* Check that POSIXLY_CORRECT doesn't change optional arguments. */
 1867  3 : for (start = 0; start <= 1; start++)
 1868  : {
 1869  2 : const char *p_value = NULL;
 1870  2 : const char *q_value = NULL;
 1871  2 : int non_options_count = 0;
 1872  : const char *non_options[10];
 1873  2 : int unrecognized = 0;
 1874  2 : int argc = 0;
 1875  : const char *argv[10];
 1876  2 : a_seen = 0;
 1877  2 : b_seen = 0;
 1878  : 
 1879  2 : argv[argc++] = "program";
 1880  2 : argv[argc++] = "-p";
 1881  2 : argv[argc++] = "billy";
 1882  2 : argv[argc] = NULL;
 1883  2 : optind = start;
 1884  2 : getopt_long_loop (argc, argv, "p::", long_options_required,
 1885  : &p_value, &q_value,
 1886  : &non_options_count, non_options, &unrecognized);
 1887  2 : ASSERT (a_seen == 0);
 1888  2 : ASSERT (b_seen == 0);
 1889  2 : ASSERT (p_value == NULL);
 1890  2 : ASSERT (q_value == NULL);
 1891  2 : ASSERT (non_options_count == 0);
 1892  2 : ASSERT (unrecognized == 0);
 1893  2 : ASSERT (optind == 2);
 1894  : }
 1895  : 
 1896  : /* Check that leading - still sees options after non-options. */
 1897  3 : for (start = 0; start <= 1; start++)
 1898  : {
 1899  2 : const char *p_value = NULL;
 1900  2 : const char *q_value = NULL;
 1901  2 : int non_options_count = 0;
 1902  : const char *non_options[10];
 1903  2 : int unrecognized = 0;
 1904  2 : int argc = 0;
 1905  : const char *argv[10];
 1906  2 : a_seen = 0;
 1907  2 : b_seen = 0;
 1908  : 
 1909  2 : argv[argc++] = "program";
 1910  2 : argv[argc++] = "-a";
 1911  2 : argv[argc++] = "billy";
 1912  2 : argv[argc++] = "-b";
 1913  2 : argv[argc] = NULL;
 1914  2 : optind = start;
 1915  2 : getopt_long_loop (argc, argv, "-ab", long_options_required,
 1916  : &p_value, &q_value,
 1917  : &non_options_count, non_options, &unrecognized);
 1918  2 : ASSERT (a_seen == 1);
 1919  2 : ASSERT (b_seen == 1);
 1920  2 : ASSERT (p_value == NULL);
 1921  2 : ASSERT (q_value == NULL);
 1922  2 : ASSERT (non_options_count == 1);
 1923  2 : ASSERT (strcmp (non_options[0], "billy") == 0);
 1924  2 : ASSERT (unrecognized == 0);
 1925  2 : ASSERT (optind == 4);
 1926  : }
 1927  1 : }
 1928  : 
 1929  : /* Reduce casting, so we can use string literals elsewhere.
 1930  : getopt_long_only takes an array of char*, but luckily does not
 1931  : modify those elements, so we can pass const char*. */
 1932  : static int
 1933  12 : do_getopt_long_only (int argc, const char **argv, const char *shortopts,
 1934  : const struct option *longopts, int *longind)
 1935  : {
 1936  12 : return getopt_long_only (argc, (char **) argv, shortopts, longopts, longind);
 1937  : }
 1938  : 
 1939  : static void
 1940  1 : test_getopt_long_only (void)
 1941  : {
 1942  : /* Test disambiguation of options. */
 1943  : {
 1944  1 : int argc = 0;
 1945  : const char *argv[10];
 1946  : int option_index;
 1947  : int c;
 1948  : 
 1949  1 : argv[argc++] = "program";
 1950  1 : argv[argc++] = "-x";
 1951  1 : argv[argc] = NULL;
 1952  1 : optind = 1;
 1953  1 : opterr = 0;
 1954  1 : c = do_getopt_long_only (argc, argv, "ab", long_options_required,
 1955  : &option_index);
 1956  1 : ASSERT (c == '?');
 1957  1 : ASSERT (optopt == 0);
 1958  : }
 1959  : {
 1960  1 : int argc = 0;
 1961  : const char *argv[10];
 1962  : int option_index;
 1963  : int c;
 1964  : 
 1965  1 : argv[argc++] = "program";
 1966  1 : argv[argc++] = "-x";
 1967  1 : argv[argc] = NULL;
 1968  1 : optind = 1;
 1969  1 : opterr = 0;
 1970  1 : c = do_getopt_long_only (argc, argv, "abx", long_options_required,
 1971  : &option_index);
 1972  1 : ASSERT (c == 'x');
 1973  1 : ASSERT (optopt == 0);
 1974  : }
 1975  : {
 1976  1 : int argc = 0;
 1977  : const char *argv[10];
 1978  : int option_index;
 1979  : int c;
 1980  : 
 1981  1 : argv[argc++] = "program";
 1982  1 : argv[argc++] = "--x";
 1983  1 : argv[argc] = NULL;
 1984  1 : optind = 1;
 1985  1 : opterr = 0;
 1986  1 : c = do_getopt_long_only (argc, argv, "abx", long_options_required,
 1987  : &option_index);
 1988  1 : ASSERT (c == '?');
 1989  1 : ASSERT (optopt == 0);
 1990  : }
 1991  : {
 1992  1 : int argc = 0;
 1993  : const char *argv[10];
 1994  : int option_index;
 1995  : int c;
 1996  : 
 1997  1 : argv[argc++] = "program";
 1998  1 : argv[argc++] = "-b";
 1999  1 : argv[argc] = NULL;
 2000  1 : optind = 1;
 2001  1 : opterr = 0;
 2002  1 : b_seen = 0;
 2003  1 : c = do_getopt_long_only (argc, argv, "abx", long_options_required,
 2004  : &option_index);
 2005  1 : ASSERT (c == 'b');
 2006  1 : ASSERT (b_seen == 0);
 2007  : }
 2008  : {
 2009  1 : int argc = 0;
 2010  : const char *argv[10];
 2011  : int option_index;
 2012  : int c;
 2013  : 
 2014  1 : argv[argc++] = "program";
 2015  1 : argv[argc++] = "--b";
 2016  1 : argv[argc] = NULL;
 2017  1 : optind = 1;
 2018  1 : opterr = 0;
 2019  1 : b_seen = 0;
 2020  1 : c = do_getopt_long_only (argc, argv, "abx", long_options_required,
 2021  : &option_index);
 2022  1 : ASSERT (c == 0);
 2023  1 : ASSERT (b_seen == 1);
 2024  : }
 2025  : {
 2026  1 : int argc = 0;
 2027  : const char *argv[10];
 2028  : int option_index;
 2029  : int c;
 2030  : 
 2031  1 : argv[argc++] = "program";
 2032  1 : argv[argc++] = "-xt";
 2033  1 : argv[argc] = NULL;
 2034  1 : optind = 1;
 2035  1 : opterr = 0;
 2036  1 : c = do_getopt_long_only (argc, argv, "ab", long_options_required,
 2037  : &option_index);
 2038  1 : ASSERT (c == '?');
 2039  1 : ASSERT (optopt == 0);
 2040  : }
 2041  : {
 2042  1 : int argc = 0;
 2043  : const char *argv[10];
 2044  : int option_index;
 2045  : int c;
 2046  : 
 2047  1 : argv[argc++] = "program";
 2048  1 : argv[argc++] = "-xt";
 2049  1 : argv[argc] = NULL;
 2050  1 : optind = 1;
 2051  1 : opterr = 0;
 2052  1 : c = do_getopt_long_only (argc, argv, "abx", long_options_required,
 2053  : &option_index);
 2054  1 : ASSERT (c == '?');
 2055  1 : ASSERT (optopt == 0);
 2056  : }
 2057  : {
 2058  1 : int argc = 0;
 2059  : const char *argv[10];
 2060  : int option_index;
 2061  : int c;
 2062  : 
 2063  1 : argv[argc++] = "program";
 2064  1 : argv[argc++] = "-xtra";
 2065  1 : argv[argc] = NULL;
 2066  1 : optind = 1;
 2067  1 : opterr = 0;
 2068  1 : c = do_getopt_long_only (argc, argv, "ab", long_options_required,
 2069  : &option_index);
 2070  1 : ASSERT (c == 1001);
 2071  : }
 2072  : {
 2073  1 : int argc = 0;
 2074  : const char *argv[10];
 2075  : int option_index;
 2076  : int c;
 2077  : 
 2078  1 : argv[argc++] = "program";
 2079  1 : argv[argc++] = "-xtreme";
 2080  1 : argv[argc] = NULL;
 2081  1 : optind = 1;
 2082  1 : opterr = 0;
 2083  1 : c = do_getopt_long_only (argc, argv, "abx:", long_options_required,
 2084  : &option_index);
 2085  1 : ASSERT (c == 1002);
 2086  : }
 2087  : {
 2088  1 : int argc = 0;
 2089  : const char *argv[10];
 2090  : int option_index;
 2091  : int c;
 2092  : 
 2093  1 : argv[argc++] = "program";
 2094  1 : argv[argc++] = "-xtremel";
 2095  1 : argv[argc] = NULL;
 2096  1 : optind = 1;
 2097  1 : opterr = 0;
 2098  1 : c = do_getopt_long_only (argc, argv, "ab", long_options_required,
 2099  : &option_index);
 2100  : /* glibc getopt_long_only is intentionally different from
 2101  : getopt_long when handling a prefix that is common to two
 2102  : spellings, when both spellings have the same option directives.
 2103  : BSD getopt_long_only treats both cases the same. */
 2104  1 : ASSERT (c == 1003 || c == '?');
 2105  1 : ASSERT (optind == 2);
 2106  : }
 2107  : {
 2108  1 : int argc = 0;
 2109  : const char *argv[10];
 2110  : int option_index;
 2111  : int c;
 2112  : 
 2113  1 : argv[argc++] = "program";
 2114  1 : argv[argc++] = "-xtremel";
 2115  1 : argv[argc] = NULL;
 2116  1 : optind = 1;
 2117  1 : opterr = 0;
 2118  1 : c = do_getopt_long_only (argc, argv, "abx::", long_options_required,
 2119  : &option_index);
 2120  : /* glibc getopt_long_only is intentionally different from
 2121  : getopt_long when handling a prefix that is common to two
 2122  : spellings, when both spellings have the same option directives.
 2123  : BSD getopt_long_only treats both cases the same. */
 2124  1 : ASSERT (c == 1003 || c == '?');
 2125  1 : ASSERT (optind == 2);
 2126  1 : ASSERT (optarg == NULL);
 2127  : }
 2128  : {
 2129  1 : int argc = 0;
 2130  : const char *argv[10];
 2131  : int option_index;
 2132  : int c;
 2133  : 
 2134  1 : argv[argc++] = "program";
 2135  1 : argv[argc++] = "-xtras";
 2136  1 : argv[argc] = NULL;
 2137  1 : optind = 1;
 2138  1 : opterr = 0;
 2139  1 : c = do_getopt_long_only (argc, argv, "abx::", long_options_required,
 2140  : &option_index);
 2141  1 : ASSERT (c == 'x');
 2142  1 : ASSERT (strcmp (optarg, "tras") == 0);
 2143  : }
 2144  1 : }

Generated by: LCOV version 1.13

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