1*abb65b4bSAndroid Build Coastguard Worker /*
2*abb65b4bSAndroid Build Coastguard Worker * Copyright (c) 2022 Samsung Electronics Co., Ltd.
3*abb65b4bSAndroid Build Coastguard Worker * All Rights Reserved.
4*abb65b4bSAndroid Build Coastguard Worker *
5*abb65b4bSAndroid Build Coastguard Worker * Redistribution and use in source and binary forms, with or without
6*abb65b4bSAndroid Build Coastguard Worker * modification, are permitted provided that the following conditions are met:
7*abb65b4bSAndroid Build Coastguard Worker *
8*abb65b4bSAndroid Build Coastguard Worker * - Redistributions of source code must retain the above copyright notice,
9*abb65b4bSAndroid Build Coastguard Worker * this list of conditions and the following disclaimer.
10*abb65b4bSAndroid Build Coastguard Worker *
11*abb65b4bSAndroid Build Coastguard Worker * - Redistributions in binary form must reproduce the above copyright notice,
12*abb65b4bSAndroid Build Coastguard Worker * this list of conditions and the following disclaimer in the documentation
13*abb65b4bSAndroid Build Coastguard Worker * and/or other materials provided with the distribution.
14*abb65b4bSAndroid Build Coastguard Worker *
15*abb65b4bSAndroid Build Coastguard Worker * - Neither the name of the copyright owner, nor the names of its contributors
16*abb65b4bSAndroid Build Coastguard Worker * may be used to endorse or promote products derived from this software
17*abb65b4bSAndroid Build Coastguard Worker * without specific prior written permission.
18*abb65b4bSAndroid Build Coastguard Worker *
19*abb65b4bSAndroid Build Coastguard Worker * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20*abb65b4bSAndroid Build Coastguard Worker * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21*abb65b4bSAndroid Build Coastguard Worker * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22*abb65b4bSAndroid Build Coastguard Worker * ARE DISCLAIMED.IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
23*abb65b4bSAndroid Build Coastguard Worker * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24*abb65b4bSAndroid Build Coastguard Worker * CONSEQUENTIAL DAMAGES(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25*abb65b4bSAndroid Build Coastguard Worker * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26*abb65b4bSAndroid Build Coastguard Worker * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27*abb65b4bSAndroid Build Coastguard Worker * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28*abb65b4bSAndroid Build Coastguard Worker * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29*abb65b4bSAndroid Build Coastguard Worker * POSSIBILITY OF SUCH DAMAGE.
30*abb65b4bSAndroid Build Coastguard Worker */
31*abb65b4bSAndroid Build Coastguard Worker
32*abb65b4bSAndroid Build Coastguard Worker #ifndef _OAPV_APP_ARGS_H_
33*abb65b4bSAndroid Build Coastguard Worker #define _OAPV_APP_ARGS_H_
34*abb65b4bSAndroid Build Coastguard Worker
35*abb65b4bSAndroid Build Coastguard Worker #include <stdio.h>
36*abb65b4bSAndroid Build Coastguard Worker #include <stdlib.h>
37*abb65b4bSAndroid Build Coastguard Worker #include <string.h>
38*abb65b4bSAndroid Build Coastguard Worker #include "oapv.h"
39*abb65b4bSAndroid Build Coastguard Worker
40*abb65b4bSAndroid Build Coastguard Worker #define ARGS_VAL_TYPE_MANDATORY (1 << 0) /* mandatory or not */
41*abb65b4bSAndroid Build Coastguard Worker #define ARGS_VAL_TYPE_NONE (1 << 2) /* no value */
42*abb65b4bSAndroid Build Coastguard Worker #define ARGS_VAL_TYPE_INTEGER (2 << 2) /* integer type value */
43*abb65b4bSAndroid Build Coastguard Worker #define ARGS_VAL_TYPE_STRING (3 << 2) /* string type value */
44*abb65b4bSAndroid Build Coastguard Worker #define ARGS_GET_CMD_OPT_VAL_TYPE(x) ((x) & 0x0C)
45*abb65b4bSAndroid Build Coastguard Worker #define ARGS_GET_IS_OPT_TYPE_PPT(x) (((x) >> 1) & 0x01)
46*abb65b4bSAndroid Build Coastguard Worker
47*abb65b4bSAndroid Build Coastguard Worker #define ARGS_END_KEY (0)
48*abb65b4bSAndroid Build Coastguard Worker #define ARGS_NO_KEY (127)
49*abb65b4bSAndroid Build Coastguard Worker #define ARGS_KEY_LONG_CONFIG "config"
50*abb65b4bSAndroid Build Coastguard Worker #define ARGS_MAX_NUM_CONF_FILES (16)
51*abb65b4bSAndroid Build Coastguard Worker
52*abb65b4bSAndroid Build Coastguard Worker #define ARGS_MAX_KEY_LONG (32)
53*abb65b4bSAndroid Build Coastguard Worker
54*abb65b4bSAndroid Build Coastguard Worker typedef struct args_opt {
55*abb65b4bSAndroid Build Coastguard Worker char key; /* option keyword. ex) -f */
56*abb65b4bSAndroid Build Coastguard Worker char key_long[ARGS_MAX_KEY_LONG]; /* option long keyword, ex) --file */
57*abb65b4bSAndroid Build Coastguard Worker int val_type; /* value type */
58*abb65b4bSAndroid Build Coastguard Worker int flag; /* flag to setting or not */
59*abb65b4bSAndroid Build Coastguard Worker void *val; /* actual value */
60*abb65b4bSAndroid Build Coastguard Worker char desc[512]; /* description of option */
61*abb65b4bSAndroid Build Coastguard Worker } args_opt_t;
62*abb65b4bSAndroid Build Coastguard Worker
63*abb65b4bSAndroid Build Coastguard Worker typedef struct args_parser args_parser_t;
64*abb65b4bSAndroid Build Coastguard Worker struct args_parser {
65*abb65b4bSAndroid Build Coastguard Worker void (*release)(args_parser_t *args);
66*abb65b4bSAndroid Build Coastguard Worker int (*parse)(args_parser_t *args, int argc, const char *argv[], char **errstr);
67*abb65b4bSAndroid Build Coastguard Worker int (*get_help)(args_parser_t *args, int idx, char *help);
68*abb65b4bSAndroid Build Coastguard Worker int (*get_str)(args_parser_t *args, char *keyl, char *str, int *flag);
69*abb65b4bSAndroid Build Coastguard Worker int (*get_int)(args_parser_t *args, char *keyl, int *val, int *flag);
70*abb65b4bSAndroid Build Coastguard Worker int (*set_str)(args_parser_t *args, char *keyl, char *str);
71*abb65b4bSAndroid Build Coastguard Worker int (*set_int)(args_parser_t *args, char *keyl, int val);
72*abb65b4bSAndroid Build Coastguard Worker int (*set_flag)(args_parser_t *args, char *keyl, int flag);
73*abb65b4bSAndroid Build Coastguard Worker int (*check_mandatory)(args_parser_t *args, char **err_arg);
74*abb65b4bSAndroid Build Coastguard Worker
75*abb65b4bSAndroid Build Coastguard Worker args_opt_t *opts;
76*abb65b4bSAndroid Build Coastguard Worker int num_option;
77*abb65b4bSAndroid Build Coastguard Worker };
78*abb65b4bSAndroid Build Coastguard Worker
args_search_long_key(args_opt_t * opts,const char * key)79*abb65b4bSAndroid Build Coastguard Worker static int args_search_long_key(args_opt_t *opts, const char *key)
80*abb65b4bSAndroid Build Coastguard Worker {
81*abb65b4bSAndroid Build Coastguard Worker args_opt_t *o;
82*abb65b4bSAndroid Build Coastguard Worker int oidx = 0;
83*abb65b4bSAndroid Build Coastguard Worker
84*abb65b4bSAndroid Build Coastguard Worker o = opts;
85*abb65b4bSAndroid Build Coastguard Worker while(o->key != ARGS_END_KEY) {
86*abb65b4bSAndroid Build Coastguard Worker if(!strcmp(key, o->key_long)) {
87*abb65b4bSAndroid Build Coastguard Worker return oidx;
88*abb65b4bSAndroid Build Coastguard Worker }
89*abb65b4bSAndroid Build Coastguard Worker oidx++;
90*abb65b4bSAndroid Build Coastguard Worker o++;
91*abb65b4bSAndroid Build Coastguard Worker }
92*abb65b4bSAndroid Build Coastguard Worker return -1;
93*abb65b4bSAndroid Build Coastguard Worker }
94*abb65b4bSAndroid Build Coastguard Worker
args_search_short_arg(args_opt_t * ops,const char key)95*abb65b4bSAndroid Build Coastguard Worker static int args_search_short_arg(args_opt_t *ops, const char key)
96*abb65b4bSAndroid Build Coastguard Worker {
97*abb65b4bSAndroid Build Coastguard Worker args_opt_t *o;
98*abb65b4bSAndroid Build Coastguard Worker int oidx = 0;
99*abb65b4bSAndroid Build Coastguard Worker
100*abb65b4bSAndroid Build Coastguard Worker o = ops;
101*abb65b4bSAndroid Build Coastguard Worker
102*abb65b4bSAndroid Build Coastguard Worker while(o->key != ARGS_END_KEY) {
103*abb65b4bSAndroid Build Coastguard Worker if(o->key != ARGS_NO_KEY && o->key == key) {
104*abb65b4bSAndroid Build Coastguard Worker return oidx;
105*abb65b4bSAndroid Build Coastguard Worker }
106*abb65b4bSAndroid Build Coastguard Worker oidx++;
107*abb65b4bSAndroid Build Coastguard Worker o++;
108*abb65b4bSAndroid Build Coastguard Worker }
109*abb65b4bSAndroid Build Coastguard Worker return -1;
110*abb65b4bSAndroid Build Coastguard Worker }
111*abb65b4bSAndroid Build Coastguard Worker
args_read_value(args_opt_t * ops,const char * argv)112*abb65b4bSAndroid Build Coastguard Worker static int args_read_value(args_opt_t *ops, const char *argv)
113*abb65b4bSAndroid Build Coastguard Worker {
114*abb65b4bSAndroid Build Coastguard Worker if(argv == NULL || ops->val == NULL) {
115*abb65b4bSAndroid Build Coastguard Worker return -1;
116*abb65b4bSAndroid Build Coastguard Worker }
117*abb65b4bSAndroid Build Coastguard Worker if(argv[0] == '-' && (argv[1] < '0' || argv[1] > '9'))
118*abb65b4bSAndroid Build Coastguard Worker return -1;
119*abb65b4bSAndroid Build Coastguard Worker
120*abb65b4bSAndroid Build Coastguard Worker switch(ARGS_GET_CMD_OPT_VAL_TYPE(ops->val_type)) {
121*abb65b4bSAndroid Build Coastguard Worker case ARGS_VAL_TYPE_INTEGER:
122*abb65b4bSAndroid Build Coastguard Worker *((int *)ops->val) = atoi(argv);
123*abb65b4bSAndroid Build Coastguard Worker break;
124*abb65b4bSAndroid Build Coastguard Worker
125*abb65b4bSAndroid Build Coastguard Worker case ARGS_VAL_TYPE_STRING:
126*abb65b4bSAndroid Build Coastguard Worker strcpy((char *)ops->val, argv);
127*abb65b4bSAndroid Build Coastguard Worker break;
128*abb65b4bSAndroid Build Coastguard Worker
129*abb65b4bSAndroid Build Coastguard Worker default:
130*abb65b4bSAndroid Build Coastguard Worker return -1;
131*abb65b4bSAndroid Build Coastguard Worker }
132*abb65b4bSAndroid Build Coastguard Worker return 0;
133*abb65b4bSAndroid Build Coastguard Worker }
134*abb65b4bSAndroid Build Coastguard Worker
args_get_arg(args_opt_t * ops,int idx,char * result)135*abb65b4bSAndroid Build Coastguard Worker static int args_get_arg(args_opt_t *ops, int idx, char *result)
136*abb65b4bSAndroid Build Coastguard Worker {
137*abb65b4bSAndroid Build Coastguard Worker char vtype[32];
138*abb65b4bSAndroid Build Coastguard Worker char value[512];
139*abb65b4bSAndroid Build Coastguard Worker args_opt_t *o = ops + idx;
140*abb65b4bSAndroid Build Coastguard Worker
141*abb65b4bSAndroid Build Coastguard Worker switch(ARGS_GET_CMD_OPT_VAL_TYPE(o->val_type)) {
142*abb65b4bSAndroid Build Coastguard Worker case ARGS_VAL_TYPE_INTEGER:
143*abb65b4bSAndroid Build Coastguard Worker strncpy(vtype, "INTEGER", sizeof(vtype) - 1);
144*abb65b4bSAndroid Build Coastguard Worker sprintf(value, "%d", *((int *)o->val));
145*abb65b4bSAndroid Build Coastguard Worker break;
146*abb65b4bSAndroid Build Coastguard Worker
147*abb65b4bSAndroid Build Coastguard Worker case ARGS_VAL_TYPE_STRING:
148*abb65b4bSAndroid Build Coastguard Worker strncpy(vtype, "STRING", sizeof(vtype) - 1);
149*abb65b4bSAndroid Build Coastguard Worker sprintf(value, "%s", (char *)o->val);
150*abb65b4bSAndroid Build Coastguard Worker break;
151*abb65b4bSAndroid Build Coastguard Worker
152*abb65b4bSAndroid Build Coastguard Worker case ARGS_VAL_TYPE_NONE:
153*abb65b4bSAndroid Build Coastguard Worker default:
154*abb65b4bSAndroid Build Coastguard Worker strncpy(vtype, "FLAG", sizeof(vtype) - 1);
155*abb65b4bSAndroid Build Coastguard Worker sprintf(value, "%d", *((int *)o->val));
156*abb65b4bSAndroid Build Coastguard Worker break;
157*abb65b4bSAndroid Build Coastguard Worker }
158*abb65b4bSAndroid Build Coastguard Worker
159*abb65b4bSAndroid Build Coastguard Worker if(o->flag) {
160*abb65b4bSAndroid Build Coastguard Worker strcat(value, " (SET)");
161*abb65b4bSAndroid Build Coastguard Worker }
162*abb65b4bSAndroid Build Coastguard Worker else {
163*abb65b4bSAndroid Build Coastguard Worker strcat(value, " (DEFAULT)");
164*abb65b4bSAndroid Build Coastguard Worker }
165*abb65b4bSAndroid Build Coastguard Worker
166*abb65b4bSAndroid Build Coastguard Worker sprintf(result, " -%c(--%s) = %s\n : %s", o->key, o->key_long,
167*abb65b4bSAndroid Build Coastguard Worker value, o->desc);
168*abb65b4bSAndroid Build Coastguard Worker
169*abb65b4bSAndroid Build Coastguard Worker return 0;
170*abb65b4bSAndroid Build Coastguard Worker }
171*abb65b4bSAndroid Build Coastguard Worker
args_parse_int_x_int(char * str,int * num0,int * num1)172*abb65b4bSAndroid Build Coastguard Worker static int args_parse_int_x_int(char *str, int *num0, int *num1)
173*abb65b4bSAndroid Build Coastguard Worker {
174*abb65b4bSAndroid Build Coastguard Worker char str0_t[64];
175*abb65b4bSAndroid Build Coastguard Worker int i, cnt0 = 0, cnt1;
176*abb65b4bSAndroid Build Coastguard Worker char *str0, *str1 = NULL;
177*abb65b4bSAndroid Build Coastguard Worker
178*abb65b4bSAndroid Build Coastguard Worker str0 = str;
179*abb65b4bSAndroid Build Coastguard Worker cnt1 = (int)strlen(str);
180*abb65b4bSAndroid Build Coastguard Worker
181*abb65b4bSAndroid Build Coastguard Worker /* find 'x' */
182*abb65b4bSAndroid Build Coastguard Worker for(i = 0; i < (int)strlen(str); i++) {
183*abb65b4bSAndroid Build Coastguard Worker if(str[i] == 'x' || str[i] == 'X') {
184*abb65b4bSAndroid Build Coastguard Worker str1 = str + i + 1;
185*abb65b4bSAndroid Build Coastguard Worker cnt0 = i;
186*abb65b4bSAndroid Build Coastguard Worker cnt1 = cnt1 - cnt0 - 1;
187*abb65b4bSAndroid Build Coastguard Worker break;
188*abb65b4bSAndroid Build Coastguard Worker }
189*abb65b4bSAndroid Build Coastguard Worker }
190*abb65b4bSAndroid Build Coastguard Worker
191*abb65b4bSAndroid Build Coastguard Worker /* check malformed data */
192*abb65b4bSAndroid Build Coastguard Worker if(str1 == NULL || cnt0 == 0 || cnt1 == 0)
193*abb65b4bSAndroid Build Coastguard Worker return -1;
194*abb65b4bSAndroid Build Coastguard Worker
195*abb65b4bSAndroid Build Coastguard Worker for(i = 0; i < cnt0; i++) {
196*abb65b4bSAndroid Build Coastguard Worker if(str0[i] < 0x30 || str0[i] > 0x39)
197*abb65b4bSAndroid Build Coastguard Worker return -1; /* not a number */
198*abb65b4bSAndroid Build Coastguard Worker }
199*abb65b4bSAndroid Build Coastguard Worker for(i = 0; i < cnt1; i++) {
200*abb65b4bSAndroid Build Coastguard Worker if(str1[i] < 0x30 || str1[i] > 0x39)
201*abb65b4bSAndroid Build Coastguard Worker return -1; /* not a number */
202*abb65b4bSAndroid Build Coastguard Worker }
203*abb65b4bSAndroid Build Coastguard Worker
204*abb65b4bSAndroid Build Coastguard Worker strncpy(str0_t, str0, cnt0);
205*abb65b4bSAndroid Build Coastguard Worker str0_t[cnt0] = '\0';
206*abb65b4bSAndroid Build Coastguard Worker
207*abb65b4bSAndroid Build Coastguard Worker *num0 = atoi(str0_t);
208*abb65b4bSAndroid Build Coastguard Worker *num1 = atoi(str1);
209*abb65b4bSAndroid Build Coastguard Worker
210*abb65b4bSAndroid Build Coastguard Worker return 0;
211*abb65b4bSAndroid Build Coastguard Worker }
212*abb65b4bSAndroid Build Coastguard Worker
args_parse_cfg(FILE * fp,args_opt_t * ops,int is_type_ppt)213*abb65b4bSAndroid Build Coastguard Worker static int args_parse_cfg(FILE *fp, args_opt_t *ops, int is_type_ppt)
214*abb65b4bSAndroid Build Coastguard Worker {
215*abb65b4bSAndroid Build Coastguard Worker char *parser;
216*abb65b4bSAndroid Build Coastguard Worker char line[256] = "", tag[50] = "", val[256] = "";
217*abb65b4bSAndroid Build Coastguard Worker int oidx;
218*abb65b4bSAndroid Build Coastguard Worker
219*abb65b4bSAndroid Build Coastguard Worker while(fgets(line, sizeof(line), fp)) {
220*abb65b4bSAndroid Build Coastguard Worker parser = strchr(line, '#');
221*abb65b4bSAndroid Build Coastguard Worker if(parser != NULL)
222*abb65b4bSAndroid Build Coastguard Worker *parser = '\0';
223*abb65b4bSAndroid Build Coastguard Worker
224*abb65b4bSAndroid Build Coastguard Worker parser = strtok(line, "= \t");
225*abb65b4bSAndroid Build Coastguard Worker if(parser == NULL)
226*abb65b4bSAndroid Build Coastguard Worker continue;
227*abb65b4bSAndroid Build Coastguard Worker strncpy(tag, parser, sizeof(tag) - 1);
228*abb65b4bSAndroid Build Coastguard Worker
229*abb65b4bSAndroid Build Coastguard Worker parser = strtok(NULL, "=\n");
230*abb65b4bSAndroid Build Coastguard Worker if(parser == NULL)
231*abb65b4bSAndroid Build Coastguard Worker continue;
232*abb65b4bSAndroid Build Coastguard Worker strncpy(val, parser, sizeof(val) - 1);
233*abb65b4bSAndroid Build Coastguard Worker
234*abb65b4bSAndroid Build Coastguard Worker oidx = args_search_long_key(ops, tag);
235*abb65b4bSAndroid Build Coastguard Worker if(oidx < 0)
236*abb65b4bSAndroid Build Coastguard Worker continue;
237*abb65b4bSAndroid Build Coastguard Worker
238*abb65b4bSAndroid Build Coastguard Worker if(ops[oidx].val == NULL) {
239*abb65b4bSAndroid Build Coastguard Worker return -1;
240*abb65b4bSAndroid Build Coastguard Worker }
241*abb65b4bSAndroid Build Coastguard Worker
242*abb65b4bSAndroid Build Coastguard Worker if(ARGS_GET_IS_OPT_TYPE_PPT(ops[oidx].val_type) == is_type_ppt) {
243*abb65b4bSAndroid Build Coastguard Worker if(ARGS_GET_CMD_OPT_VAL_TYPE(ops[oidx].val_type) != ARGS_VAL_TYPE_NONE) {
244*abb65b4bSAndroid Build Coastguard Worker if(args_read_value(ops + oidx, val))
245*abb65b4bSAndroid Build Coastguard Worker continue;
246*abb65b4bSAndroid Build Coastguard Worker }
247*abb65b4bSAndroid Build Coastguard Worker else {
248*abb65b4bSAndroid Build Coastguard Worker *((int *)ops[oidx].val) = 1;
249*abb65b4bSAndroid Build Coastguard Worker }
250*abb65b4bSAndroid Build Coastguard Worker ops[oidx].flag = 1;
251*abb65b4bSAndroid Build Coastguard Worker }
252*abb65b4bSAndroid Build Coastguard Worker }
253*abb65b4bSAndroid Build Coastguard Worker return 0;
254*abb65b4bSAndroid Build Coastguard Worker }
255*abb65b4bSAndroid Build Coastguard Worker
args_parse_cmd(int argc,const char * argv[],args_opt_t * ops,int * idx,char ** errstr)256*abb65b4bSAndroid Build Coastguard Worker static int args_parse_cmd(int argc, const char *argv[], args_opt_t *ops,
257*abb65b4bSAndroid Build Coastguard Worker int *idx, char **errstr)
258*abb65b4bSAndroid Build Coastguard Worker {
259*abb65b4bSAndroid Build Coastguard Worker int aidx; /* arg index */
260*abb65b4bSAndroid Build Coastguard Worker int oidx; /* option index */
261*abb65b4bSAndroid Build Coastguard Worker
262*abb65b4bSAndroid Build Coastguard Worker aidx = *idx + 1;
263*abb65b4bSAndroid Build Coastguard Worker
264*abb65b4bSAndroid Build Coastguard Worker if(aidx >= argc || argv[aidx] == NULL)
265*abb65b4bSAndroid Build Coastguard Worker goto NO_MORE;
266*abb65b4bSAndroid Build Coastguard Worker if(argv[aidx][0] != '-')
267*abb65b4bSAndroid Build Coastguard Worker goto ERR;
268*abb65b4bSAndroid Build Coastguard Worker
269*abb65b4bSAndroid Build Coastguard Worker if(argv[aidx][1] == '-') {
270*abb65b4bSAndroid Build Coastguard Worker /* long option */
271*abb65b4bSAndroid Build Coastguard Worker oidx = args_search_long_key(ops, argv[aidx] + 2);
272*abb65b4bSAndroid Build Coastguard Worker if(oidx < 0) {
273*abb65b4bSAndroid Build Coastguard Worker *errstr = (char *)argv[aidx];
274*abb65b4bSAndroid Build Coastguard Worker goto ERR;
275*abb65b4bSAndroid Build Coastguard Worker }
276*abb65b4bSAndroid Build Coastguard Worker }
277*abb65b4bSAndroid Build Coastguard Worker else if(strlen(argv[aidx]) == 2) {
278*abb65b4bSAndroid Build Coastguard Worker /* short option */
279*abb65b4bSAndroid Build Coastguard Worker oidx = args_search_short_arg(ops, argv[aidx][1]);
280*abb65b4bSAndroid Build Coastguard Worker if(oidx < 0) {
281*abb65b4bSAndroid Build Coastguard Worker *errstr = (char *)argv[aidx];
282*abb65b4bSAndroid Build Coastguard Worker goto ERR;
283*abb65b4bSAndroid Build Coastguard Worker }
284*abb65b4bSAndroid Build Coastguard Worker }
285*abb65b4bSAndroid Build Coastguard Worker else {
286*abb65b4bSAndroid Build Coastguard Worker goto ERR;
287*abb65b4bSAndroid Build Coastguard Worker }
288*abb65b4bSAndroid Build Coastguard Worker
289*abb65b4bSAndroid Build Coastguard Worker if(ARGS_GET_CMD_OPT_VAL_TYPE(ops[oidx].val_type) !=
290*abb65b4bSAndroid Build Coastguard Worker ARGS_VAL_TYPE_NONE) {
291*abb65b4bSAndroid Build Coastguard Worker if(aidx + 1 >= argc) {
292*abb65b4bSAndroid Build Coastguard Worker *errstr = (char *)argv[aidx];
293*abb65b4bSAndroid Build Coastguard Worker goto ERR;
294*abb65b4bSAndroid Build Coastguard Worker }
295*abb65b4bSAndroid Build Coastguard Worker if(args_read_value(ops + oidx, argv[aidx + 1])) {
296*abb65b4bSAndroid Build Coastguard Worker *errstr = (char *)argv[aidx];
297*abb65b4bSAndroid Build Coastguard Worker goto ERR;
298*abb65b4bSAndroid Build Coastguard Worker }
299*abb65b4bSAndroid Build Coastguard Worker *idx = *idx + 1;
300*abb65b4bSAndroid Build Coastguard Worker }
301*abb65b4bSAndroid Build Coastguard Worker else {
302*abb65b4bSAndroid Build Coastguard Worker *((int *)ops[oidx].val) = 1;
303*abb65b4bSAndroid Build Coastguard Worker }
304*abb65b4bSAndroid Build Coastguard Worker ops[oidx].flag = 1;
305*abb65b4bSAndroid Build Coastguard Worker *idx = *idx + 1;
306*abb65b4bSAndroid Build Coastguard Worker
307*abb65b4bSAndroid Build Coastguard Worker return ops[oidx].key;
308*abb65b4bSAndroid Build Coastguard Worker
309*abb65b4bSAndroid Build Coastguard Worker NO_MORE:
310*abb65b4bSAndroid Build Coastguard Worker return 0;
311*abb65b4bSAndroid Build Coastguard Worker
312*abb65b4bSAndroid Build Coastguard Worker ERR:
313*abb65b4bSAndroid Build Coastguard Worker return -1;
314*abb65b4bSAndroid Build Coastguard Worker }
315*abb65b4bSAndroid Build Coastguard Worker
args_set_variable_by_key_long(args_opt_t * opts,char * key_long,void * var)316*abb65b4bSAndroid Build Coastguard Worker static int args_set_variable_by_key_long(args_opt_t *opts, char *key_long, void *var)
317*abb65b4bSAndroid Build Coastguard Worker {
318*abb65b4bSAndroid Build Coastguard Worker int idx;
319*abb65b4bSAndroid Build Coastguard Worker char buf[ARGS_MAX_KEY_LONG];
320*abb65b4bSAndroid Build Coastguard Worker char *ko = key_long;
321*abb65b4bSAndroid Build Coastguard Worker char *kt = buf;
322*abb65b4bSAndroid Build Coastguard Worker
323*abb65b4bSAndroid Build Coastguard Worker /* if long key has "_", convert to "-". */
324*abb65b4bSAndroid Build Coastguard Worker while(*ko != '\0') {
325*abb65b4bSAndroid Build Coastguard Worker if(*ko == '_')
326*abb65b4bSAndroid Build Coastguard Worker *kt = '-';
327*abb65b4bSAndroid Build Coastguard Worker else
328*abb65b4bSAndroid Build Coastguard Worker *kt = *ko;
329*abb65b4bSAndroid Build Coastguard Worker
330*abb65b4bSAndroid Build Coastguard Worker ko++;
331*abb65b4bSAndroid Build Coastguard Worker kt++;
332*abb65b4bSAndroid Build Coastguard Worker }
333*abb65b4bSAndroid Build Coastguard Worker *kt = '\0';
334*abb65b4bSAndroid Build Coastguard Worker
335*abb65b4bSAndroid Build Coastguard Worker idx = args_search_long_key(opts, buf);
336*abb65b4bSAndroid Build Coastguard Worker if(idx < 0)
337*abb65b4bSAndroid Build Coastguard Worker return -1;
338*abb65b4bSAndroid Build Coastguard Worker opts[idx].val = var;
339*abb65b4bSAndroid Build Coastguard Worker return 0;
340*abb65b4bSAndroid Build Coastguard Worker }
341*abb65b4bSAndroid Build Coastguard Worker
args_set_variable_by_key(args_opt_t * opts,char * key,void * var)342*abb65b4bSAndroid Build Coastguard Worker static int args_set_variable_by_key(args_opt_t *opts, char *key, void *var)
343*abb65b4bSAndroid Build Coastguard Worker {
344*abb65b4bSAndroid Build Coastguard Worker int idx;
345*abb65b4bSAndroid Build Coastguard Worker idx = args_search_short_arg(opts, key[0]);
346*abb65b4bSAndroid Build Coastguard Worker if(idx < 0)
347*abb65b4bSAndroid Build Coastguard Worker return -1;
348*abb65b4bSAndroid Build Coastguard Worker opts[idx].val = var;
349*abb65b4bSAndroid Build Coastguard Worker return 0;
350*abb65b4bSAndroid Build Coastguard Worker }
351*abb65b4bSAndroid Build Coastguard Worker
352*abb65b4bSAndroid Build Coastguard Worker #define ARGS_SET_PARAM_VAR_KEY_LONG(opts, param, key_long) \
353*abb65b4bSAndroid Build Coastguard Worker args_set_variable_by_key_long(opts, #key_long, (void *)&((param)->key_long))
354*abb65b4bSAndroid Build Coastguard Worker
355*abb65b4bSAndroid Build Coastguard Worker #define ARGS_SET_PARAM_VAR_KEY(opts, param, key) \
356*abb65b4bSAndroid Build Coastguard Worker args_set_variable_by_key(opts, #key, (void *)&((param)->key))
357*abb65b4bSAndroid Build Coastguard Worker
args_get(args_parser_t * args,char * keyl,void ** val,int * flag)358*abb65b4bSAndroid Build Coastguard Worker static int args_get(args_parser_t *args, char *keyl, void **val, int *flag)
359*abb65b4bSAndroid Build Coastguard Worker {
360*abb65b4bSAndroid Build Coastguard Worker int idx;
361*abb65b4bSAndroid Build Coastguard Worker
362*abb65b4bSAndroid Build Coastguard Worker idx = args_search_long_key(args->opts, keyl);
363*abb65b4bSAndroid Build Coastguard Worker if(idx >= 0) {
364*abb65b4bSAndroid Build Coastguard Worker if(val)
365*abb65b4bSAndroid Build Coastguard Worker *val = args->opts[idx].val;
366*abb65b4bSAndroid Build Coastguard Worker if(flag)
367*abb65b4bSAndroid Build Coastguard Worker *flag = args->opts[idx].flag;
368*abb65b4bSAndroid Build Coastguard Worker return 0;
369*abb65b4bSAndroid Build Coastguard Worker }
370*abb65b4bSAndroid Build Coastguard Worker else {
371*abb65b4bSAndroid Build Coastguard Worker if(val)
372*abb65b4bSAndroid Build Coastguard Worker *val = NULL; /* no value */
373*abb65b4bSAndroid Build Coastguard Worker if(flag)
374*abb65b4bSAndroid Build Coastguard Worker *flag = 0; /* no set */
375*abb65b4bSAndroid Build Coastguard Worker return -1;
376*abb65b4bSAndroid Build Coastguard Worker }
377*abb65b4bSAndroid Build Coastguard Worker }
378*abb65b4bSAndroid Build Coastguard Worker
args_set_str(args_parser_t * args,char * keyl,char * str)379*abb65b4bSAndroid Build Coastguard Worker static int args_set_str(args_parser_t *args, char *keyl, char *str)
380*abb65b4bSAndroid Build Coastguard Worker {
381*abb65b4bSAndroid Build Coastguard Worker int idx;
382*abb65b4bSAndroid Build Coastguard Worker
383*abb65b4bSAndroid Build Coastguard Worker idx = args_search_long_key(args->opts, keyl);
384*abb65b4bSAndroid Build Coastguard Worker if(idx >= 0) {
385*abb65b4bSAndroid Build Coastguard Worker sprintf((char *)(args->opts[idx].val), "%s", str);
386*abb65b4bSAndroid Build Coastguard Worker args->opts[idx].flag = 1;
387*abb65b4bSAndroid Build Coastguard Worker return 0;
388*abb65b4bSAndroid Build Coastguard Worker }
389*abb65b4bSAndroid Build Coastguard Worker else {
390*abb65b4bSAndroid Build Coastguard Worker return -1;
391*abb65b4bSAndroid Build Coastguard Worker }
392*abb65b4bSAndroid Build Coastguard Worker }
393*abb65b4bSAndroid Build Coastguard Worker
args_set_int(args_parser_t * args,char * keyl,int val)394*abb65b4bSAndroid Build Coastguard Worker static int args_set_int(args_parser_t *args, char *keyl, int val)
395*abb65b4bSAndroid Build Coastguard Worker {
396*abb65b4bSAndroid Build Coastguard Worker int idx;
397*abb65b4bSAndroid Build Coastguard Worker
398*abb65b4bSAndroid Build Coastguard Worker idx = args_search_long_key(args->opts, keyl);
399*abb65b4bSAndroid Build Coastguard Worker if(idx >= 0) {
400*abb65b4bSAndroid Build Coastguard Worker *((int *)(args->opts[idx].val)) = val;
401*abb65b4bSAndroid Build Coastguard Worker args->opts[idx].flag = 1;
402*abb65b4bSAndroid Build Coastguard Worker return 0;
403*abb65b4bSAndroid Build Coastguard Worker }
404*abb65b4bSAndroid Build Coastguard Worker else {
405*abb65b4bSAndroid Build Coastguard Worker return -1;
406*abb65b4bSAndroid Build Coastguard Worker }
407*abb65b4bSAndroid Build Coastguard Worker }
408*abb65b4bSAndroid Build Coastguard Worker
args_set_flag(args_parser_t * args,char * keyl,int flag)409*abb65b4bSAndroid Build Coastguard Worker static int args_set_flag(args_parser_t *args, char *keyl, int flag)
410*abb65b4bSAndroid Build Coastguard Worker {
411*abb65b4bSAndroid Build Coastguard Worker int idx;
412*abb65b4bSAndroid Build Coastguard Worker
413*abb65b4bSAndroid Build Coastguard Worker idx = args_search_long_key(args->opts, keyl);
414*abb65b4bSAndroid Build Coastguard Worker if(idx >= 0) {
415*abb65b4bSAndroid Build Coastguard Worker args->opts[idx].flag = flag;
416*abb65b4bSAndroid Build Coastguard Worker return 0;
417*abb65b4bSAndroid Build Coastguard Worker }
418*abb65b4bSAndroid Build Coastguard Worker return -1;
419*abb65b4bSAndroid Build Coastguard Worker }
420*abb65b4bSAndroid Build Coastguard Worker
args_get_str(args_parser_t * args,char * keyl,char * str,int * flag)421*abb65b4bSAndroid Build Coastguard Worker static int args_get_str(args_parser_t *args, char *keyl, char *str, int *flag)
422*abb65b4bSAndroid Build Coastguard Worker {
423*abb65b4bSAndroid Build Coastguard Worker char *p = NULL;
424*abb65b4bSAndroid Build Coastguard Worker if(args_get(args, keyl, (void **)&p, flag))
425*abb65b4bSAndroid Build Coastguard Worker return -1;
426*abb65b4bSAndroid Build Coastguard Worker if(p) {
427*abb65b4bSAndroid Build Coastguard Worker if(str)
428*abb65b4bSAndroid Build Coastguard Worker strcpy(str, p);
429*abb65b4bSAndroid Build Coastguard Worker }
430*abb65b4bSAndroid Build Coastguard Worker return 0;
431*abb65b4bSAndroid Build Coastguard Worker }
432*abb65b4bSAndroid Build Coastguard Worker
args_get_int(args_parser_t * args,char * keyl,int * val,int * flag)433*abb65b4bSAndroid Build Coastguard Worker static int args_get_int(args_parser_t *args, char *keyl, int *val, int *flag)
434*abb65b4bSAndroid Build Coastguard Worker {
435*abb65b4bSAndroid Build Coastguard Worker int *p = NULL;
436*abb65b4bSAndroid Build Coastguard Worker if(args_get(args, keyl, (void **)&p, flag))
437*abb65b4bSAndroid Build Coastguard Worker return -1;
438*abb65b4bSAndroid Build Coastguard Worker if(p) {
439*abb65b4bSAndroid Build Coastguard Worker *val = *p;
440*abb65b4bSAndroid Build Coastguard Worker }
441*abb65b4bSAndroid Build Coastguard Worker return 0;
442*abb65b4bSAndroid Build Coastguard Worker }
443*abb65b4bSAndroid Build Coastguard Worker
args_parse(args_parser_t * args,int argc,const char * argv[],char ** errstr)444*abb65b4bSAndroid Build Coastguard Worker static int args_parse(args_parser_t *args, int argc, const char *argv[],
445*abb65b4bSAndroid Build Coastguard Worker char **errstr)
446*abb65b4bSAndroid Build Coastguard Worker {
447*abb65b4bSAndroid Build Coastguard Worker int i, ret = 0, idx = 0;
448*abb65b4bSAndroid Build Coastguard Worker const char *fname_cfg = NULL;
449*abb65b4bSAndroid Build Coastguard Worker FILE *fp;
450*abb65b4bSAndroid Build Coastguard Worker
451*abb65b4bSAndroid Build Coastguard Worker int num_configs = 0;
452*abb65b4bSAndroid Build Coastguard Worker int pos_conf_files[ARGS_MAX_NUM_CONF_FILES];
453*abb65b4bSAndroid Build Coastguard Worker memset(&pos_conf_files, -1, sizeof(int) * ARGS_MAX_NUM_CONF_FILES);
454*abb65b4bSAndroid Build Coastguard Worker
455*abb65b4bSAndroid Build Coastguard Worker /* config file parsing */
456*abb65b4bSAndroid Build Coastguard Worker for(i = 1; i < argc; i++) {
457*abb65b4bSAndroid Build Coastguard Worker if(!strcmp(argv[i], "--" ARGS_KEY_LONG_CONFIG)) {
458*abb65b4bSAndroid Build Coastguard Worker if(i + 1 < argc) {
459*abb65b4bSAndroid Build Coastguard Worker num_configs++;
460*abb65b4bSAndroid Build Coastguard Worker pos_conf_files[num_configs - 1] = i + 1;
461*abb65b4bSAndroid Build Coastguard Worker }
462*abb65b4bSAndroid Build Coastguard Worker }
463*abb65b4bSAndroid Build Coastguard Worker }
464*abb65b4bSAndroid Build Coastguard Worker for(int i = 0; i < num_configs; i++) {
465*abb65b4bSAndroid Build Coastguard Worker fname_cfg = argv[pos_conf_files[i]];
466*abb65b4bSAndroid Build Coastguard Worker if(fname_cfg) {
467*abb65b4bSAndroid Build Coastguard Worker fp = fopen(fname_cfg, "r");
468*abb65b4bSAndroid Build Coastguard Worker if(fp == NULL)
469*abb65b4bSAndroid Build Coastguard Worker return -1; /* config file error */
470*abb65b4bSAndroid Build Coastguard Worker
471*abb65b4bSAndroid Build Coastguard Worker if(args_parse_cfg(fp, args->opts, 1)) {
472*abb65b4bSAndroid Build Coastguard Worker fclose(fp);
473*abb65b4bSAndroid Build Coastguard Worker return -1; /* config file error */
474*abb65b4bSAndroid Build Coastguard Worker }
475*abb65b4bSAndroid Build Coastguard Worker fclose(fp);
476*abb65b4bSAndroid Build Coastguard Worker }
477*abb65b4bSAndroid Build Coastguard Worker }
478*abb65b4bSAndroid Build Coastguard Worker /* command line parsing */
479*abb65b4bSAndroid Build Coastguard Worker while(1) {
480*abb65b4bSAndroid Build Coastguard Worker ret = args_parse_cmd(argc, argv, args->opts, &idx, errstr);
481*abb65b4bSAndroid Build Coastguard Worker if(ret <= 0)
482*abb65b4bSAndroid Build Coastguard Worker break;
483*abb65b4bSAndroid Build Coastguard Worker }
484*abb65b4bSAndroid Build Coastguard Worker return ret;
485*abb65b4bSAndroid Build Coastguard Worker }
486*abb65b4bSAndroid Build Coastguard Worker
args_get_help(args_parser_t * args,int idx,char * help)487*abb65b4bSAndroid Build Coastguard Worker static int args_get_help(args_parser_t *args, int idx, char *help)
488*abb65b4bSAndroid Build Coastguard Worker {
489*abb65b4bSAndroid Build Coastguard Worker int optional;
490*abb65b4bSAndroid Build Coastguard Worker char vtype[32];
491*abb65b4bSAndroid Build Coastguard Worker args_opt_t *o = args->opts + idx;
492*abb65b4bSAndroid Build Coastguard Worker char default_value[256] = { 0 };
493*abb65b4bSAndroid Build Coastguard Worker
494*abb65b4bSAndroid Build Coastguard Worker switch(ARGS_GET_CMD_OPT_VAL_TYPE(o->val_type)) {
495*abb65b4bSAndroid Build Coastguard Worker case ARGS_VAL_TYPE_INTEGER:
496*abb65b4bSAndroid Build Coastguard Worker strncpy(vtype, "INTEGER", sizeof(vtype) - 1);
497*abb65b4bSAndroid Build Coastguard Worker if(o->val != NULL)
498*abb65b4bSAndroid Build Coastguard Worker sprintf(default_value, " [%d]", *(int *)(o->val));
499*abb65b4bSAndroid Build Coastguard Worker break;
500*abb65b4bSAndroid Build Coastguard Worker case ARGS_VAL_TYPE_STRING:
501*abb65b4bSAndroid Build Coastguard Worker strncpy(vtype, "STRING", sizeof(vtype) - 1);
502*abb65b4bSAndroid Build Coastguard Worker if(o->val != NULL)
503*abb65b4bSAndroid Build Coastguard Worker sprintf(default_value, " [%s]", strlen((char *)(o->val)) == 0 ? "None" : (char *)(o->val));
504*abb65b4bSAndroid Build Coastguard Worker break;
505*abb65b4bSAndroid Build Coastguard Worker case ARGS_VAL_TYPE_NONE:
506*abb65b4bSAndroid Build Coastguard Worker default:
507*abb65b4bSAndroid Build Coastguard Worker strncpy(vtype, "FLAG", sizeof(vtype) - 1);
508*abb65b4bSAndroid Build Coastguard Worker if(o->val != NULL)
509*abb65b4bSAndroid Build Coastguard Worker sprintf(default_value, " [%s]", *(int *)(o->val) ? "On" : "Off");
510*abb65b4bSAndroid Build Coastguard Worker break;
511*abb65b4bSAndroid Build Coastguard Worker }
512*abb65b4bSAndroid Build Coastguard Worker optional = !(o->val_type & ARGS_VAL_TYPE_MANDATORY);
513*abb65b4bSAndroid Build Coastguard Worker
514*abb65b4bSAndroid Build Coastguard Worker if(o->key != ARGS_NO_KEY) {
515*abb65b4bSAndroid Build Coastguard Worker sprintf(help, " -%c, --%s [%s]%s%s\n : %s", o->key, o->key_long,
516*abb65b4bSAndroid Build Coastguard Worker vtype, (optional) ? " (optional)" : "", (optional) ? default_value : "", o->desc);
517*abb65b4bSAndroid Build Coastguard Worker }
518*abb65b4bSAndroid Build Coastguard Worker else {
519*abb65b4bSAndroid Build Coastguard Worker sprintf(help, " --%s [%s]%s%s\n : %s", o->key_long,
520*abb65b4bSAndroid Build Coastguard Worker vtype, (optional) ? " (optional)" : "", (optional) ? default_value : "", o->desc);
521*abb65b4bSAndroid Build Coastguard Worker }
522*abb65b4bSAndroid Build Coastguard Worker
523*abb65b4bSAndroid Build Coastguard Worker return 0;
524*abb65b4bSAndroid Build Coastguard Worker }
525*abb65b4bSAndroid Build Coastguard Worker
args_check_mandatory(args_parser_t * args,char ** err_arg)526*abb65b4bSAndroid Build Coastguard Worker static int args_check_mandatory(args_parser_t *args, char **err_arg)
527*abb65b4bSAndroid Build Coastguard Worker {
528*abb65b4bSAndroid Build Coastguard Worker args_opt_t *o = args->opts;
529*abb65b4bSAndroid Build Coastguard Worker
530*abb65b4bSAndroid Build Coastguard Worker while(o->key != 0) {
531*abb65b4bSAndroid Build Coastguard Worker if(o->val_type & ARGS_VAL_TYPE_MANDATORY) {
532*abb65b4bSAndroid Build Coastguard Worker if(o->flag == 0) {
533*abb65b4bSAndroid Build Coastguard Worker /* not filled all mandatory argument */
534*abb65b4bSAndroid Build Coastguard Worker *err_arg = o->key_long;
535*abb65b4bSAndroid Build Coastguard Worker return -1;
536*abb65b4bSAndroid Build Coastguard Worker }
537*abb65b4bSAndroid Build Coastguard Worker }
538*abb65b4bSAndroid Build Coastguard Worker o++;
539*abb65b4bSAndroid Build Coastguard Worker }
540*abb65b4bSAndroid Build Coastguard Worker return 0;
541*abb65b4bSAndroid Build Coastguard Worker }
542*abb65b4bSAndroid Build Coastguard Worker
args_release(args_parser_t * args)543*abb65b4bSAndroid Build Coastguard Worker static void args_release(args_parser_t *args)
544*abb65b4bSAndroid Build Coastguard Worker {
545*abb65b4bSAndroid Build Coastguard Worker if(args != NULL) {
546*abb65b4bSAndroid Build Coastguard Worker if(args->opts != NULL)
547*abb65b4bSAndroid Build Coastguard Worker free(args->opts);
548*abb65b4bSAndroid Build Coastguard Worker free(args);
549*abb65b4bSAndroid Build Coastguard Worker }
550*abb65b4bSAndroid Build Coastguard Worker }
551*abb65b4bSAndroid Build Coastguard Worker
args_create(const args_opt_t * opt_table,int num_opt)552*abb65b4bSAndroid Build Coastguard Worker static args_parser_t *args_create(const args_opt_t *opt_table, int num_opt)
553*abb65b4bSAndroid Build Coastguard Worker {
554*abb65b4bSAndroid Build Coastguard Worker args_parser_t *args = NULL;
555*abb65b4bSAndroid Build Coastguard Worker args_opt_t *opts = NULL;
556*abb65b4bSAndroid Build Coastguard Worker
557*abb65b4bSAndroid Build Coastguard Worker args = (args_parser_t *)malloc(sizeof(args_parser_t));
558*abb65b4bSAndroid Build Coastguard Worker if(args == NULL)
559*abb65b4bSAndroid Build Coastguard Worker goto ERR;
560*abb65b4bSAndroid Build Coastguard Worker memset(args, 0, sizeof(args_parser_t));
561*abb65b4bSAndroid Build Coastguard Worker
562*abb65b4bSAndroid Build Coastguard Worker opts = (args_opt_t *)malloc(num_opt * sizeof(args_opt_t));
563*abb65b4bSAndroid Build Coastguard Worker if(opts == NULL)
564*abb65b4bSAndroid Build Coastguard Worker goto ERR;
565*abb65b4bSAndroid Build Coastguard Worker memcpy(opts, opt_table, num_opt * sizeof(args_opt_t));
566*abb65b4bSAndroid Build Coastguard Worker args->opts = opts;
567*abb65b4bSAndroid Build Coastguard Worker
568*abb65b4bSAndroid Build Coastguard Worker args->release = args_release;
569*abb65b4bSAndroid Build Coastguard Worker args->parse = args_parse;
570*abb65b4bSAndroid Build Coastguard Worker args->get_help = args_get_help;
571*abb65b4bSAndroid Build Coastguard Worker args->get_str = args_get_str;
572*abb65b4bSAndroid Build Coastguard Worker args->get_int = args_get_int;
573*abb65b4bSAndroid Build Coastguard Worker args->set_str = args_set_str;
574*abb65b4bSAndroid Build Coastguard Worker args->set_int = args_set_int;
575*abb65b4bSAndroid Build Coastguard Worker args->set_flag = args_set_flag;
576*abb65b4bSAndroid Build Coastguard Worker args->check_mandatory = args_check_mandatory;
577*abb65b4bSAndroid Build Coastguard Worker
578*abb65b4bSAndroid Build Coastguard Worker /* find actual number of options */
579*abb65b4bSAndroid Build Coastguard Worker args->num_option = 0;
580*abb65b4bSAndroid Build Coastguard Worker while(opt_table[args->num_option].key != ARGS_END_KEY)
581*abb65b4bSAndroid Build Coastguard Worker args->num_option++;
582*abb65b4bSAndroid Build Coastguard Worker
583*abb65b4bSAndroid Build Coastguard Worker return args;
584*abb65b4bSAndroid Build Coastguard Worker
585*abb65b4bSAndroid Build Coastguard Worker ERR:
586*abb65b4bSAndroid Build Coastguard Worker free(opts);
587*abb65b4bSAndroid Build Coastguard Worker free(args);
588*abb65b4bSAndroid Build Coastguard Worker return NULL;
589*abb65b4bSAndroid Build Coastguard Worker }
590*abb65b4bSAndroid Build Coastguard Worker
591*abb65b4bSAndroid Build Coastguard Worker #endif /*_OAPV_APP_ARGS_H_ */
592