void CLI::start(int option) { if (option >= 0) { apply_option(option); } else { while (option != QUIT) { show_options(); option = get_user_option(); apply_option(option); } } }
void parse_options(zx_handle_t log, struct options *o, char** strings) { initialize_options(o); for (char** sp = strings; *sp != NULL; ++sp) { const char* arg = *sp; printl(log, "option \"%s\"", arg); apply_option(o, arg); } }
/** * Apply all parsed command line options: set binary flags, store strings, * and do complex options handling by calling callbacks. * * @param cmd_line the parsed options information */ static void apply_cmdline_options(struct parsed_cmd_line_t *cmd_line) { int count = cmd_line->options.size; int i; for(i = 0; i < count; i++) { parsed_option_t* o = (parsed_option_t*)rsh_blocks_vector_get_ptr( &cmd_line->options, i, 16, sizeof(parsed_option_t)); /* process the option, if it was not applied early */ if(!is_output_modifier(o->o->type)) { apply_option(&opt, o); } } /* copy formating options from config if not specified at command line */ if(!opt.printf_str && !opt.template_file && !opt.sum_flags && !opt.fmt) { opt.printf_str = conf_opt.printf_str; opt.template_file = conf_opt.template_file; } if(!opt.printf_str && !opt.template_file) { if(!opt.fmt) opt.fmt = conf_opt.fmt; if(!opt.sum_flags) opt.sum_flags = conf_opt.sum_flags; } if(!opt.mode) opt.mode = conf_opt.mode; opt.flags |= conf_opt.flags; /* copy all non-sum options */ if(opt.files_accept == 0) opt.files_accept = conf_opt.files_accept; if(opt.crc_accept == 0) opt.crc_accept = conf_opt.crc_accept; if(opt.embed_crc_delimiter == 0) opt.embed_crc_delimiter = conf_opt.embed_crc_delimiter; if(!opt.path_separator) opt.path_separator = conf_opt.path_separator; if(opt.find_max_depth < 0) opt.find_max_depth = conf_opt.find_max_depth; if(opt.flags & OPT_EMBED_CRC) opt.sum_flags |= RHASH_CRC32; if(opt.openssl_mask == 0) opt.openssl_mask = conf_opt.openssl_mask; /* set defaults */ if(opt.embed_crc_delimiter == 0) opt.embed_crc_delimiter = " "; }
/** * Parse command line arguments. * * @param cmd_line structure to store parsed options data */ static void parse_cmdline_options(struct parsed_cmd_line_t* cmd_line) { int argc; int n_files = 0, b_opt_end = 0; rsh_tchar** files; rsh_tchar **parg, **end_arg; parsed_option_t *next_opt; #ifdef _WIN32 parg = cmd_line->warg = CommandLineToArgvW(GetCommandLineW(), &argc); if( NULL == parg || argc < 1) { die(_("CommandLineToArgvW failed\n")); } #else argc = cmd_line->argc; parg = cmd_line->argv; #endif /* allocate array for files */ files = (rsh_tchar**)rsh_malloc(argc * sizeof(rsh_tchar*)); end_arg = parg + argc; /* loop by program arguments */ for(parg++; parg < end_arg; parg++) { /* if argument is not an option */ if((*parg)[0] != RSH_T('-') || (*parg)[1] == 0 || b_opt_end) { /* it's a file, note that '-' is interpreted as stdin */ files[n_files++] = *parg; continue; } assert((*parg)[0] == RSH_T('-') && (*parg)[1] != 0); if((*parg)[1] == L'-' && (*parg)[2] == 0) { b_opt_end = 1; /* string "--" means end of options */ continue; } /* check for "--" */ if((*parg)[1] == RSH_T('-')) { cmdline_opt_t *t; /* allocate parsed_option */ rsh_blocks_vector_add_empty(&cmd_line->options, 16, sizeof(parsed_option_t)); next_opt = rsh_blocks_vector_get_item(&cmd_line->options, cmd_line->options.size - 1, 16, parsed_option_t); /* find the long option */ parse_long_option(next_opt, &parg); t = next_opt->o; /* process encoding and -o/-l options early */ if(is_output_modifier(t->type)) { apply_option(&opt, next_opt); } } else if((*parg)[1] != 0) { /* found '-'<some string> */ rsh_tchar* ptr; /* parse short options. A string of several characters is interpreted * as separate short options */ for(ptr = *parg + 1; *ptr; ptr++) { cmdline_opt_t *t; char ch = (char)*ptr; #ifdef _WIN32 if(((unsigned)*ptr) >= 128) { ptr[1] = 0; fail_on_unknow_option(w2c(ptr)); } #endif /* allocate parsed_option */ rsh_blocks_vector_add_empty(&cmd_line->options, 16, sizeof(parsed_option_t)); next_opt = rsh_blocks_vector_get_item(&cmd_line->options, cmd_line->options.size - 1, 16, parsed_option_t); next_opt->buf[0] = '-', next_opt->buf[1] = ch, next_opt->buf[2] = '\0'; next_opt->name = next_opt->buf; next_opt->parameter = NULL; /* search for the short option */ for(t = cmdline_opt; t->type && ch != t->short1 && ch != t->short2; t++); if(!t->type) fail_on_unknow_option(next_opt->buf); next_opt->o = t; if(is_param_required(t->type)) { next_opt->parameter = (ptr[1] ? ptr + 1 : *(++parg)); if(!next_opt->parameter) { /* note: need to check for parameter here, for early -o/-l options processing */ log_error(_("argument is required for option %s\n"), next_opt->name); rsh_exit(2); } } /* process encoding and -o/-l options early */ if(is_output_modifier(t->type)) { apply_option(&opt, next_opt); } if(next_opt->parameter) break; /* a parameter ends the short options string */ } } } /* for */ cmd_line->n_files = n_files; cmd_line->files = files; }
/** * Parse config file of the program. * * @return 0 on success, -1 on fail */ static int read_config(void) { #define LINE_BUF_SIZE 2048 char buf[LINE_BUF_SIZE]; FILE* fd; parsed_option_t option; int res; /* initialize conf_opt and opt structures */ memset(&conf_opt, 0, sizeof(opt)); conf_opt.find_max_depth = -1; if(!find_conf_file()) return 0; fd = fopen(conf_opt.config_file, "r"); if(!fd) return -1; while(fgets(buf, LINE_BUF_SIZE, fd)) { size_t index; cmdline_opt_t* t; char* line = str_trim(buf); char *name, *value; if(*line == 0 || IS_COMMENT(*line)) continue; /* search for '=' */ index = strcspn(line, "="); if(line[index] == 0) { log_warning(_("%s: can't parse line \"%s\"\n"), conf_opt.config_file, line); continue; } line[index] = 0; name = str_trim(line); for(t = cmdline_opt; t->type; t++) { if(strcmp(name, t->long_name) == 0) { break; } } if(!t->type) { log_warning(_("%s: unknown option \"%s\"\n"), conf_opt.config_file, line); continue; } value = str_trim(line + index + 1); /* process a long option */ if(is_param_required(t->type)) { rsh_vector_add_ptr(opt.mem, (value = rsh_strdup(value)));; } else { /* possible boolean values for a config file variable */ static const char* strings[] = {"1", "on", "yes", 0}; const char** cmp; for(cmp = strings; *cmp && strcmp(value, *cmp); cmp++); if(*cmp == 0) continue; } option.name = name; option.parameter = value; option.o = t; apply_option(&conf_opt, &option); } res = fclose(fd); #ifdef _WIN32 if( (opt.flags & OPT_ENCODING) == 0 ) opt.flags |= (conf_opt.flags & OPT_ENCODING); #endif return (res == 0 ? 0 : -1); }