1 #include <getopt.h>
2 #include <stdio.h>
3 #include <string.h>
4 #include <unistd.h>
5 
6 int
main(int argc,char ** argv)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 }
77