1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
|
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "misc.h"
#include "cli_arg.h"
#include "tk.h"
static void parse_args_set(cli_args *a, char *store, char *val) {
if (a->type == ARG_STR) {
*((char **) &store[a->offset]) = val;
} else if (a->type == ARG_ARR) {
strncpy((char *) &store[a->offset], val, a->value-1);
} else if (a->type == ARG_INT) {
*((int *) &store[a->offset]) = atoi(val);
} else if (a->type == ARG_FLOAT) {
*((float *) &store[a->offset]) = atof(val);
} else { /* ARG_DOUBLE */
*((double *) &store[a->offset]) = atof(val);
}
a->def = ""; /* mark as used */
}
/*
* Parses command line arguments.
* 'args' specifies an array cli_args. Each cli_arg contains a default. Each
* argument with a default of NULL are non optional. This function will return
* -1 if any of these arguments aren't specified, or if unknown arguments
* are specified. Returns 0 otherwise.
*/
int parse_args(cli_args *args, void *store, int argc, char **argv) {
int i, ret = 0;
cli_args *a;
/* Initialise defaults */
for (a = args; a->command; a++)
if (a->def)
parse_args_set(a, store, a->def);
else if (a->type == ARG_ARR)
memset((char *)&((char *)store)[a->offset], 0, a->value); /* YUK */
for (i = 1; i < argc; i++) {
for (a = args; a->command; a++) {
if (strcmp(a->command, argv[i])== 0) {
if (a->value) {
if (i == argc - 1) {
/*
verror(ERR_WARN, "parse_args",
"No argument given for option '%s'\n",
argv[i]);
*/
ret = -1;
break;
}
parse_args_set(a, store, argv[++i]);
} else
parse_args_set(a, store, "1");
break;
}
}
if (!a->command) {
/*
verror(ERR_WARN,"parse_args", "Unknown option '%s'\n", argv[i]);
*/
ret = -1;
}
}
/* Check all required options were set */
for (a = args; a->command; a++) {
if (!a->def)
return -1;
}
return ret;
}
|