17 int count = count_a + 1;
23 memcpy(h + count_a, b,
sizeof(
option_help) * (count - count_a));
36 rc = sscanf(size_str,
" %lld %c ", (
long long*) & size, &range);
77 pos += printf(
"=STRING");
81 pos += printf(
"=%.14f ", *(
double*) o->
variable);
85 pos += printf(
"=%.6f ", (
double) *(
float*) o->
variable);
89 pos += printf(
"=%d ", *(
int*) o->
variable);
95 pos += printf(
"=%s", *(
char**) o->
variable);
97 pos += printf(
"=STRING");
102 pos += printf(
"=%c", *(
char*) o->
variable);
106 pos += printf(
"=%lld", *(
long long*) o->
variable);
110 pos += printf(
"=%lu", *(uint64_t*) o->
variable);
116 pos += printf(
" (%d)", (*(
int*)o->
variable));
130 printf(
"%s\n", o->
help);
134 printf(
"\n%s\n", name);
144 pos += printf(
"--%s", o->
longVar);
149 for(
int i = 0 ; i < (30 - pos); i++){
152 printf(
"%s", o->
help);
173 pos += printf(
"=%.14f ", *(
double*) o->
variable);
177 pos += printf(
"=%.6f ", (
double) *(
float*) o->
variable);
181 pos += printf(
"=%d ", *(
int*) o->
variable);
185 pos += printf(
"=HIDDEN");
190 pos += printf(
"=%s", *(
char**) o->
variable);
197 pos += printf(
"=%c", *(
char*) o->
variable);
201 pos += printf(
"=%lld", *(
long long*) o->
variable);
205 pos += printf(
"=%lu", *(uint64_t*) o->
variable);
228 pos += printf(
"%s", o->
longVar);
232 pos += printf(
"%s", o->
longVar);
249 char * txt = argv[0];
250 char * arg = strstr(txt,
"=");
252 int replaced_equal = 0;
259 arg = (arg[1] == 0) ?
NULL : arg + 1;
261 *flag_parsed_next = 0;
273 for(
int flag_index = 0; flag_index < strlen(txt); ++flag_index){
275 if(txt[flag_index] ==
'=' || (txt[0] ==
'-' && flag_index > 0))
280 if(args ==
NULL)
continue;
283 if(
o->shortVar == 0 &&
o->longVar == 0 ){
287 if ( (
o->shortVar == txt[flag_index]) || (strlen(txt) > 2 && txt[0] ==
'-' &&
o->longVar !=
NULL && strcmp(txt + 1,
o->longVar) == 0)){
292 assert(
o->type ==
'd');
295 (*(
int*)
o->variable) = (val < 0) ? 0 : val;
297 (*(
int*)
o->variable)++;
304 if(arg ==
NULL && replaced_equal != 1){
305 if(
o->shortVar == txt[0] && txt[1] != 0){
311 *flag_parsed_next = 1;
316 const char str[] = {
o->shortVar, 0};
317 printf(
"Error, argument missing for option %s\n", (
o->longVar !=
NULL) ?
o->longVar : str);
324 void(*fp)() =
o->variable;
329 *(
double*)
o->variable = atof(arg);
333 *(
float*)
o->variable = atof(arg);
338 if (val > INT_MAX || val < INT_MIN){
339 printf(
"WARNING: parsing the number %s to integer, this produced an overflow!\n", arg);
341 *(
int*)
o->variable = val;
346 (*(
char **)
o->variable) = strdup(arg);
350 (*(
char *)
o->variable) = arg[0];
352 printf(
"Error, ignoring remainder of string for option %c (%s).\n",
o->shortVar,
o->longVar);
365 printf(
"ERROR: Unknown option type %c\n",
o->type);
375 (*requiredArgsSeen)++;
385 if(strcmp(txt,
"h") == 0 || strcmp(txt,
"-help") == 0){
393 int flag_parsed_next;
395 int requiredArgsSeen = 0;
397 char * argv[2] = {val,
NULL};
398 option_parse_token(argv, & flag_parsed_next, & requiredArgsSeen, opt_all, & error, & print_help);
403 int flag_parsed_next;
405 int requiredArgsSeen = 0;
408 sprintf(value,
"%s=%s", key, val);
409 char * argv[2] = {value,
NULL};
410 option_parse_token(argv, & flag_parsed_next, & requiredArgsSeen, opt_all, & error, & print_help);
416 int requiredArgsSeen = 0;
417 int requiredArgsNeeded = 0;
423 if(args ==
NULL)
continue;
424 for(
option_help *
o = args;
o->shortVar != 0 ||
o->longVar != 0 ;
o++ ){
426 requiredArgsNeeded++;
431 for(i=1; i < argc; i++){
432 int flag_parsed_next;
433 option_parse_token(& argv[i], & flag_parsed_next, & requiredArgsSeen, opt_all, & error, & printhelp);
434 if (flag_parsed_next){
438 printf(
"Error invalid argument: %s\n", argv[i]);
442 if( requiredArgsSeen != requiredArgsNeeded ){
443 printf(
"Error: Missing some required arguments\n\n");
448 printf(
"Invalid options\n");
453 printf(
"Synopsis %s\n", argv[0]);
456 if(args ==
NULL)
continue;
459 printf(
"\n\nModule %s\n", prefix);
int option_parse(int argc, char **argv, options_all_t *opt_all)
struct benchmark_options o
void option_print_help(option_help *args)
static void print_current_option_section(option_help *args, option_value_type type)
static void option_parse_token(char **argv, int *flag_parsed_next, int *requiredArgsSeen, options_all_t *opt_all, int *error, int *print_help)
void option_print_current(option_help *args)
static int print_option_value(option_help *o)
int option_parse_key_value(char *key, char *val, options_all_t *opt_all)
int option_parse_str(char *val, options_all_t *opt_all)
static int print_value(option_help *o)
int64_t string_to_bytes(char *size_str)
static void print_help_section(option_help *args, option_value_type type, char *name)
option_help * option_merge(option_help *a, option_help *b)