options: Remove unnecessary commas from EBNF syntax
[media-ctl.git] / src / options.c
1 /*
2  * Media controller test application
3  *
4  * Copyright (C) 2010-2011 Ideas on board SPRL
5  *
6  * Contact: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
7  *
8  * This program is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU Lesser General Public License as published
10  * by the Free Software Foundation; either version 2.1 of the License, or
11  * (at your option) any later version.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  * GNU Lesser General Public License for more details.
17  *
18  * You should have received a copy of the GNU Lesser General Public License
19  * along with this program. If not, see <http://www.gnu.org/licenses/>.
20  */
21
22 #include <stdlib.h>
23 #include <getopt.h>
24 #include <stdio.h>
25 #include <unistd.h>
26
27 #include "options.h"
28
29 #define MEDIA_DEVNAME_DEFAULT           "/dev/media0"
30
31 struct media_options media_opts = {
32         .devname = MEDIA_DEVNAME_DEFAULT,
33 };
34
35 static void usage(const char *argv0, int verbose)
36 {
37         printf("%s [options] device\n", argv0);
38         printf("-d, --device dev        Media device name (default: %s)\n", MEDIA_DEVNAME_DEFAULT);
39         printf("-e, --entity name       Print the device name associated with the given entity\n");
40         printf("-f, --set-format        Comma-separated list of formats to setup\n");
41         printf("    --get-format pad    Print the active format on a given pad\n");
42         printf("-h, --help              Show verbose help and exit\n");
43         printf("-i, --interactive       Modify links interactively\n");
44         printf("-l, --links             Comma-separated list of links descriptors to setup\n");
45         printf("-p, --print-topology    Print the device topology (implies -v)\n");
46         printf("    --print-dot         Print the device topology as a dot graph (implies -v)\n");
47         printf("-r, --reset             Reset all links to inactive\n");
48         printf("-v, --verbose           Be verbose\n");
49
50         if (!verbose)
51                 return;
52
53         printf("\n");
54         printf("Links and formats are defined as\n");
55         printf("\tlink            = pad '->' pad '[' flags ']' ;\n");
56         printf("\tformat          = pad '[' fcc ' ' size [ ' ' crop ] [ ' ' '@' frame interval ] ']' ;\n");
57         printf("\tpad             = entity ':' pad number ;\n");
58         printf("\tentity          = entity number | ( '\"' entity name '\"' ) ;\n");
59         printf("\tsize            = width 'x' height ;\n");
60         printf("\tcrop            = '(' left ',' top ')' '/' size ;\n");
61         printf("\tframe interval  = numerator '/' denominator ;\n");
62         printf("where the fields are\n");
63         printf("\tentity number   Entity numeric identifier\n");
64         printf("\tentity name     Entity name (string) \n");
65         printf("\tpad number      Pad numeric identifier\n");
66         printf("\tflags           Link flags (0: inactive, 1: active)\n");
67         printf("\tfcc             Format FourCC\n");
68         printf("\twidth           Image width in pixels\n");
69         printf("\theight          Image height in pixels\n");
70         printf("\tnumerator       Frame interval numerator\n");
71         printf("\tdenominator     Frame interval denominator\n");
72 }
73
74 #define OPT_PRINT_DOT           256
75 #define OPT_GET_FORMAT          257
76
77 static struct option opts[] = {
78         {"device", 1, 0, 'd'},
79         {"entity", 1, 0, 'e'},
80         {"set-format", 1, 0, 'f'},
81         {"get-format", 1, 0, OPT_GET_FORMAT},
82         {"help", 0, 0, 'h'},
83         {"interactive", 0, 0, 'i'},
84         {"links", 1, 0, 'l'},
85         {"print-dot", 0, 0, OPT_PRINT_DOT},
86         {"print-topology", 0, 0, 'p'},
87         {"reset", 0, 0, 'r'},
88         {"verbose", 0, 0, 'v'},
89 };
90
91 int parse_cmdline(int argc, char **argv)
92 {
93         int opt;
94
95         if (argc == 1) {
96                 usage(argv[0], 0);
97                 return 1;
98         }
99
100         /* parse options */
101         while ((opt = getopt_long(argc, argv, "d:e:f:hil:prv", opts, NULL)) != -1) {
102                 switch (opt) {
103                 case 'd':
104                         media_opts.devname = optarg;
105                         break;
106
107                 case 'e':
108                         media_opts.entity = optarg;
109                         break;
110
111                 case 'f':
112                         media_opts.formats = optarg;
113                         break;
114
115                 case 'h':
116                         usage(argv[0], 1);
117                         exit(0);
118
119                 case 'i':
120                         media_opts.interactive = 1;
121                         break;
122
123                 case 'l':
124                         media_opts.links = optarg;
125                         break;
126
127                 case 'p':
128                         media_opts.print = 1;
129                         media_opts.verbose = 1;
130                         break;
131
132                 case 'r':
133                         media_opts.reset = 1;
134                         break;
135
136                 case 'v':
137                         media_opts.verbose = 1;
138                         break;
139
140                 case OPT_PRINT_DOT:
141                         media_opts.print_dot = 1;
142                         break;
143
144                 case OPT_GET_FORMAT:
145                         media_opts.pad = optarg;
146                         break;
147
148                 default:
149                         printf("Invalid option -%c\n", opt);
150                         printf("Run %s -h for help.\n", argv[0]);
151                         return 1;
152                 }
153         }
154
155         return 0;
156 }
157