| 1 | #include <getopt.h>
|
|---|
| 2 | #include <stdio.h>
|
|---|
| 3 | #include <string.h>
|
|---|
| 4 | #include <unistd.h>
|
|---|
| 5 |
|
|---|
| 6 | int
|
|---|
| 7 | main (int argc, char **argv)
|
|---|
| 8 | {
|
|---|
| 9 | static const struct option options[] =
|
|---|
| 10 | {
|
|---|
| 11 | {"required", required_argument, NULL, 'r'},
|
|---|
| 12 | {"optional", optional_argument, NULL, 'o'},
|
|---|
| 13 | {"none", no_argument, NULL, 'n'},
|
|---|
| 14 | {"color", no_argument, NULL, 'C'},
|
|---|
| 15 | {"colour", no_argument, NULL, 'C'},
|
|---|
| 16 | {NULL, 0, NULL, 0 }
|
|---|
| 17 | };
|
|---|
| 18 |
|
|---|
| 19 | int aflag = 0;
|
|---|
| 20 | int bflag = 0;
|
|---|
| 21 | char *cvalue = NULL;
|
|---|
| 22 | int Cflag = 0;
|
|---|
| 23 | int nflag = 0;
|
|---|
| 24 | int index;
|
|---|
| 25 | int c;
|
|---|
| 26 | int result = 0;
|
|---|
| 27 |
|
|---|
| 28 | while ((c = getopt_long (argc, argv, "abc:", options, NULL)) >= 0)
|
|---|
| 29 | switch (c)
|
|---|
| 30 | {
|
|---|
| 31 | case 'a':
|
|---|
| 32 | aflag = 1;
|
|---|
| 33 | break;
|
|---|
| 34 | case 'b':
|
|---|
| 35 | bflag = 1;
|
|---|
| 36 | break;
|
|---|
| 37 | case 'c':
|
|---|
| 38 | cvalue = optarg;
|
|---|
| 39 | break;
|
|---|
| 40 | case 'C':
|
|---|
| 41 | ++Cflag;
|
|---|
| 42 | break;
|
|---|
| 43 | case '?':
|
|---|
| 44 | fputs ("Unknown option.\n", stderr);
|
|---|
| 45 | return 1;
|
|---|
| 46 | default:
|
|---|
| 47 | fprintf (stderr, "This should never happen!\n");
|
|---|
| 48 | return 1;
|
|---|
| 49 |
|
|---|
| 50 | case 'r':
|
|---|
| 51 | printf ("--required %s\n", optarg);
|
|---|
| 52 | result |= strcmp (optarg, "foobar") != 0;
|
|---|
| 53 | break;
|
|---|
| 54 | case 'o':
|
|---|
| 55 | printf ("--optional %s\n", optarg);
|
|---|
| 56 | result |= optarg == NULL || strcmp (optarg, "bazbug") != 0;
|
|---|
| 57 | break;
|
|---|
| 58 | case 'n':
|
|---|
| 59 | puts ("--none");
|
|---|
| 60 | nflag = 1;
|
|---|
| 61 | break;
|
|---|
| 62 | }
|
|---|
| 63 |
|
|---|
| 64 | printf ("aflag = %d, bflag = %d, cvalue = %s, Cflags = %d, nflag = %d\n",
|
|---|
| 65 | aflag, bflag, cvalue, Cflag, nflag);
|
|---|
| 66 |
|
|---|
| 67 | result |= (aflag != 1 || bflag != 1 || cvalue == NULL
|
|---|
| 68 | || strcmp (cvalue, "foobar") != 0 || Cflag != 3 || nflag != 1);
|
|---|
| 69 |
|
|---|
| 70 | for (index = optind; index < argc; index++)
|
|---|
| 71 | printf ("Non-option argument %s\n", argv[index]);
|
|---|
| 72 |
|
|---|
| 73 | result |= optind + 1 != argc || strcmp (argv[optind], "random") != 0;
|
|---|
| 74 |
|
|---|
| 75 | return result;
|
|---|
| 76 | }
|
|---|