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: argc, argv: argv, shortopts: "abc:" , longopts: 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 (format: "--required %s\n" , optarg); |
52 | result |= strcmp (optarg, "foobar" ) != 0; |
53 | break; |
54 | case 'o': |
55 | printf (format: "--optional %s\n" , optarg); |
56 | result |= optarg == NULL || strcmp (optarg, "bazbug" ) != 0; |
57 | break; |
58 | case 'n': |
59 | puts (s: "--none" ); |
60 | nflag = 1; |
61 | break; |
62 | } |
63 | |
64 | printf (format: "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 (format: "Non-option argument %s\n" , argv[index]); |
72 | |
73 | result |= optind + 1 != argc || strcmp (argv[optind], "random" ) != 0; |
74 | |
75 | return result; |
76 | } |
77 | |