static error_t parse_opt(int k, char *arg, struct argp_state *state) { switch (k) { case 'p': port = atoi(arg); break; case 'v': verbose ++; break; case '?': argp_state_help(state, state->out_stream, ARGP_HELP_SHORT_USAGE | ARGP_HELP_LONG | ARGP_HELP_DOC); fprintf(state->out_stream, _("\nReport bugs to %s.\n"), argp_program_bug_address); exit(0); case 'V': fprintf (state->out_stream, "%s\n", argp_program_version); exit(0); case -3: argp_state_help(state, state->out_stream, ARGP_HELP_USAGE); exit(0); default: return ARGP_ERR_UNKNOWN; } return 0; }
static error_t parse_opt(int k, char *optarg, struct argp_state *state) { struct arguments *args = state->input; switch (k) { case 'I': args->input_format = dvb_parse_format(optarg); break; case 'O': args->output_format = dvb_parse_format(optarg); break; case 's': args->delsys = dvb_parse_delsys(optarg); break; case '?': argp_state_help(state, state->out_stream, ARGP_HELP_SHORT_USAGE | ARGP_HELP_LONG | ARGP_HELP_DOC); fprintf(state->out_stream, _("\nReport bugs to %s.\n"), argp_program_bug_address); exit(0); case 'V': fprintf (state->out_stream, "%s\n", argp_program_version); exit(0); case -3: argp_state_help(state, state->out_stream, ARGP_HELP_USAGE); exit(0); default: return ARGP_ERR_UNKNOWN; }; return 0; }
static error_t argp_parser(int key, char* arg, struct argp_state* state) { struct options *opts = state->input; switch (key) { case 'd': opts->device = arg; return 0; case 'h': strncpy(opts->params.hostname, arg, sizeof(opts->params.hostname) - 1); return 0; case 's': strncpy(opts->params.service, arg, sizeof(opts->params.service) - 1); return 0; case ARGP_KEY_END: if (!opts->device) { fprintf(stderr, "Device MUST be specified!\n"); argp_state_help(state, stderr, ARGP_HELP_STD_HELP); return EINVAL; } if (strlen(opts->params.service) == 0) strcpy(opts->params.service, STR(TANG_PORT)); return 0; default: return ARGP_ERR_UNKNOWN; } }
static error_t parse_opt (int key, char *arg, struct argp_state *state) { switch (key) { case 'c': cat = 1; return 0; case 'g': global = 1; quiet = 1; return 0; case 'd': debug_level = 1; return 0; case 'q': quiet = 1; return 0; case 'C': user_config_file = arg; return 0; case 'm': alt_system = arg; return 0; case 'h': argp_state_help (state, state->out_stream, ARGP_HELP_STD_HELP); break; } return ARGP_ERR_UNKNOWN; }
/* PARSER. Field 2 in ARGP. Order of parameters: KEY, ARG, STATE. */ static error_t parse_opt (int key, char *arg, struct argp_state *state) { struct arguments *arguments = state->input; //int i; //for(i=0; i<state->argc; i++){ // LOG(("state->argv[%d]=%s\n",i,state->argv[i])); //} LOG(("-----------------------------------\n")); LOG(("key=%c\targ:%s\targ_num:%d\tstate->next=%d\n",key,arg,\ state->arg_num,state->next)); switch (key){ case 'v': arguments->verbose = 1; // 准备输出详细的内容 break; case 'a': arguments->string1 = arg; break; case 'b': arguments->string2 = arg; break; case 'o': arguments->outfile = arg; break; case ARGP_KEY_ARG: // 这里是无标识的输入参数,保存在state->args中 LOG(("ARGP_KEY_ARG,key=%c\n",key)); if (state->arg_num >= 2) { argp_usage(state); } arguments->args[state->arg_num] = arg; break; case ARGP_KEY_END: // 这里和ARGP_KEY_ARG配合,使无标识输入只能是两个 LOG(("ARGP_KEY_END,key=%c\n",key)); if (state->arg_num < 2){ argp_usage (state); } break; case ARGP_KEY_NO_ARGS: LOG(("ARGP_KEY_NO_ARGS\n")); argp_state_help(state, stdout, ARGP_HELP_STD_HELP); default: return ARGP_ERR_UNKNOWN; } return 0; // success }
static error_t parse_opt(int key, char *arg, struct argp_state *state) { arguments_t *arguments = (arguments_t *)state->input; switch (key) { case '?': fprintf(stderr, "\nGameIDS:\n"); for(size_t i = 0; i < sizeof(g_gameids) / sizeof(g_gameids[0]); i++) { fprintf(stderr, " %-6d - %s\n", g_gameids[i].id, g_gameids[i].name); } printf("\n"); argp_state_help(state, stderr, ARGP_HELP_LONG | ARGP_HELP_EXIT_OK); break; case -1: arguments->cmdline += " "; arguments->cmdline += state->argv[state->next - 1]; break; case 'i': arguments->gameid = arg; break; case 'f': arguments->vogl_tracefile = arg; break; case 'v': arguments->flags |= F_VERBOSE; break; case '6': arguments->flags |= F_AMD64; break; case 'y': g_dryrun = true; break; case 'd': g_debugspew = true; break; break; case -2: // --show-type-list: Whitespaced list of options for bash autocomplete. for (size_t i = 0; ; i++) { const char *name = state->root_argp->options[i].name; if (!name) break; printf("--%s ", name); } exit(0); } return 0; }
/* default parse_opt */ static error_t parse_opt(int key, char *arg, struct argp_state *state) { struct cmdctx *cmdctx = state->input; int rc = 0; switch (key) { case ARGP_KEY_INIT: state->child_inputs[0] = cmdctx; state->child_inputs[1] = NULL; break; case 'v': { if ((cmdctx->cmd->flags & COMMAND_HASVERBOSE) == 0) { argp_usage (state); cmdctx->rtflags |= CMDCTX_ERR; } else { poldek_set_verbose(poldek_VERBOSE + 1); } } break; case 'q': cmdctx->rtflags |= CMDCTX_NOCTRLMSGS; poldek_set_verbose(-1); break; case ARGP_KEY_ARG: DBGF("cli.arg %s, %d\n", arg, cmdctx->cmd->flags & COMMAND_SELFARGS); if (cmdctx->cmd->flags & COMMAND_SELFARGS) return ARGP_ERR_UNKNOWN; if (cmdctx->cmd->flags & COMMAND_NOARGS) { argp_usage (state); cmdctx->rtflags |= CMDCTX_ERR; return EINVAL; } poldek_ts_add_pkgmask(cmdctx->ts, arg); break; case 'h': argp_state_help(state, stdout, ARGP_HELP_LONG | ARGP_HELP_DOC | ARGP_HELP_USAGE); return EINVAL; break; case ARGP_KEY_NO_ARGS: DBGF("NOARGS %d\n", cmdctx->rtflags & (CMDCTX_ISHELP|CMDCTX_GOTARGS)); if (cmdctx->rtflags & (CMDCTX_ISHELP | CMDCTX_GOTARGS)) break; if ((cmdctx->cmd->flags & (COMMAND_NOARGS|COMMAND_EMPTYARGS)) == 0) { argp_usage (state); cmdctx->rtflags |= CMDCTX_ERR; return EINVAL; } break; case ARGP_KEY_ERROR: cmdctx->rtflags |= CMDCTX_ERR; return EINVAL; break; default: return ARGP_ERR_UNKNOWN; } //printf("key = %d, rc = %d\n", key, rc); return rc; }
static error_t parse_opt(int k, char *optarg, struct argp_state *state) { struct arguments *args = state->input; switch (k) { case 'a': args->adapter = strtoul(optarg, NULL, 0); args->n_adapter++; break; case 'f': args->frontend = strtoul(optarg, NULL, 0); args->adapter_fe = args->adapter; break; case 'd': args->demux = strtoul(optarg, NULL, 0); args->adapter_dmx = args->adapter; break; case 'w': if (!strcasecmp(optarg,"on")) { args->lna = 1; } else if (!strcasecmp(optarg,"off")) { args->lna = 0; } else if (!strcasecmp(optarg,"auto")) { args->lna = LNA_AUTO; } else { int val = strtoul(optarg, NULL, 0); if (!val) args->lna = 0; else if (val > 0) args->lna = 1; else args->lna = LNA_AUTO; } break; case 'l': args->lnb_name = optarg; break; case 'S': args->sat_number = strtoul(optarg, NULL, 0); break; case 'U': args->freq_bpf = strtoul(optarg, NULL, 0); break; case 'W': args->diseqc_wait = strtoul(optarg, NULL, 0); break; case 'N': args->get_nit++; break; case 'G': args->get_detected++; break; case 'F': args->dont_add_new_freqs++; break; case 'p': args->other_nit++; break; case 'v': verbose++; break; case 'T': args->timeout_multiply = strtoul(optarg, NULL, 0); break; case 'I': args->input_format = dvb_parse_format(optarg); break; case 'O': args->output_format = dvb_parse_format(optarg); break; case 'o': args->output = optarg; break; case '3': args->force_dvbv3 = 1; break; case 'C': args->cc = strndup(optarg, 2); break; case '?': argp_state_help(state, state->out_stream, ARGP_HELP_SHORT_USAGE | ARGP_HELP_LONG | ARGP_HELP_DOC); fprintf(state->out_stream, _("\nReport bugs to %s.\n"), argp_program_bug_address); exit(0); case 'V': fprintf (state->out_stream, "%s\n", argp_program_version); exit(0); case -3: argp_state_help(state, state->out_stream, ARGP_HELP_USAGE); exit(0); default: return ARGP_ERR_UNKNOWN; }; return 0; }
static error_t parse_opt (int key, char *arg, struct argp_state *state) { switch (key) { case 'd': debug_level = 1; return 0; case 'v': quiet = 0; return 0; case 'r': regex_opt = 1; return 0; case 'e': /* Only makes sense for apropos, but has * historically been accepted by whatis anyway. */ regex_opt = 0; exact = 1; return 0; case 'w': regex_opt = 0; wildcard = 1; return 0; case 'a': if (am_apropos) require_all = 1; else argp_usage (state); return 0; case 'l': long_output = 1; return 0; case 's': sections = split_sections (arg); return 0; case 'm': alt_systems = arg; return 0; case 'M': manp = xstrdup (arg); return 0; case 'L': locale = arg; return 0; case 'C': user_config_file = arg; return 0; case 'f': /* helpful override if program name detection fails */ am_apropos = 0; return 0; case 'k': /* helpful override if program name detection fails */ am_apropos = 1; return 0; case 'h': argp_state_help (state, state->out_stream, ARGP_HELP_STD_HELP & ~ARGP_HELP_PRE_DOC); break; case ARGP_KEY_ARGS: keywords = state->argv + state->next; num_keywords = state->argc - state->next; return 0; case ARGP_KEY_NO_ARGS: /* Make sure that we have a keyword! */ printf (_("%s what?\n"), program_name); exit (FAIL); case ARGP_KEY_SUCCESS: if (am_apropos && !exact && !wildcard) regex_opt = 1; return 0; } return ARGP_ERR_UNKNOWN; }
static error_t parse_opt(int k, char *arg, struct argp_state *state) { char *p; long key; int rc; switch (k) { case 'v': debug++; break; case 't': test++; break; case 'c': clear++; break; case 'D': delay = atoi(arg); break; case 'P': period = atoi(arg); break; case 'd': devicename = arg; break; case 's': devclass = arg; break; case 'r': readtable++; break; case 'w': { char *name = NULL; rc = parse_keyfile(arg, &name); if (rc) goto err_inval; if (name) fprintf(stderr, _("Read %s table\n"), name); break; } case 'a': { rc = parse_cfgfile(arg); if (rc) goto err_inval; break; } case 'k': p = strtok(arg, ":="); do { if (!p) goto err_inval; nextkey->codes[0] = strtoul(p, NULL, 0); if (errno) goto err_inval; p = strtok(NULL, ",;"); if (!p) goto err_inval; key = parse_code(p); if (key == -1) { key = strtol(p, NULL, 0); if (errno) goto err_inval; } nextkey->codes[1] = key; if (debug) fprintf(stderr, _("scancode 0x%04x=%u\n"), nextkey->codes[0], nextkey->codes[1]); nextkey->next = calloc(1, sizeof(keys)); if (!nextkey->next) { perror(_("No memory!\n")); return ENOMEM; } nextkey = nextkey->next; p = strtok(NULL, ":="); } while (p); break; case 'p': p = strtok(arg, ",;"); do { if (!p) goto err_inval; if (!strcasecmp(p,"rc5") || !strcasecmp(p,"rc-5")) ch_proto |= RC_5; else if (!strcasecmp(p,"rc6") || !strcasecmp(p,"rc-6")) ch_proto |= RC_6; else if (!strcasecmp(p,"nec")) ch_proto |= NEC; else if (!strcasecmp(p,"jvc")) ch_proto |= JVC; else if (!strcasecmp(p,"sony")) ch_proto |= SONY; else if (!strcasecmp(p,"sanyo")) ch_proto |= SANYO; else if (!strcasecmp(p,"lirc")) ch_proto |= LIRC; else if (!strcasecmp(p,"rc-5-sz")) ch_proto |= RC_5_SZ; else if (!strcasecmp(p,"sharp")) ch_proto |= RC_5_SZ; else if (!strcasecmp(p,"mce-kbd")) ch_proto |= RC_5_SZ; else if (!strcasecmp(p,"xmp")) ch_proto |= XMP; else if (!strcasecmp(p,"all")) ch_proto |= ~0; else goto err_inval; p = strtok(NULL, ",;"); } while (p); break; case '?': argp_state_help(state, state->out_stream, ARGP_HELP_SHORT_USAGE | ARGP_HELP_LONG | ARGP_HELP_DOC); fprintf(state->out_stream, _("\nReport bugs to %s.\n"), argp_program_bug_address); exit(0); case 'V': fprintf (state->out_stream, "%s\n", argp_program_version); exit(0); case -3: argp_state_help(state, state->out_stream, ARGP_HELP_USAGE); exit(0); default: return ARGP_ERR_UNKNOWN; } return 0; err_inval: fprintf(stderr, _("Invalid parameter(s)\n")); return ARGP_ERR_UNKNOWN; }
//---------------------------------------------------------------------------------------------------------------------- // parse_options //---------------------------------------------------------------------------------------------------------------------- static error_t parse_options(int key, char *arg, struct argp_state *state) { voglperf_data_t *arguments = (voglperf_data_t *)state->input; extern char *program_invocation_short_name; // Check g_options array for this key. for (size_t i = 0; i < sizeof(g_options) / sizeof(g_options[0]); i++) { if (g_options[i].key == key) { arguments->flags |= g_options[i].flag; return 0; } } switch (key) { case 0: if (arg && arg[0]) { if (arguments->gameid.size()) { // These are arguments to our program, e.g. if the user wants to run: // "voglperfrun -- glxgears -info", // we get "-info". arguments->game_args += std::string("\"") + state->argv[state->next - 1] + "\""; } else { arguments->gameid = arg; } } break; case '?': printf("\nUsage:\n"); printf(" %s [options] [SteamGameID | ExecutableName]\n", program_invocation_short_name); printf("\n"); argp_state_help(state, stdout, ARGP_HELP_LONG); printf("\nGameIDS (please see the appids.txt file to modify this list):\n"); for (size_t i = 0; i < arguments->installed_games.size(); i++) { printf(" %-6u - %s\n", arguments->installed_games[i].id, arguments->installed_games[i].name.c_str()); } printf("\n"); printf("To view frametime graph with gnpulot:\n"); printf(" gnuplot -p -e 'set terminal wxt size 1280,720;set ylabel \"milliseconds\";set yrange [0:100]; plot \"FILENAME\" with lines'\n"); printf("\n"); printf("Create frametime graph png file:\n"); printf(" gnuplot -p -e 'set output \"blah.png\";set terminal pngcairo size 1280,720 enhanced;set ylabel \"milliseconds\";set yrange [0:100]; plot \"FILENAME\" with lines'\n"); exit(0); case -2: // --show-type-list: Whitespaced list of options for bash autocomplete. for (size_t i = 0;; i++) { const char *name = state->root_argp->options[i].name; if (!name) break; printf("--%s ", name); } exit(0); } return 0; }
static error_t parse_opt(int k, char *arg, struct argp_state *state) { switch (k) { case 'a': adapter = atoi(arg); break; case 'f': frontend = atoi(arg); break; case 'd': delsys = dvb_parse_delsys(arg); if (delsys < 0) return ARGP_ERR_UNKNOWN; break; case 'm': femon++; break; case 'A': femon++; acoustical++; break; #if 0 case 's': set_params = arg; break; #endif case 'g': get++; break; case 'D': device_mon++; break; case 'H': server = arg; break; case 'T': port = atoi(arg); break; case 'v': verbose ++; break; case 'c': count = atoi(arg); break; case '?': argp_state_help(state, state->out_stream, ARGP_HELP_SHORT_USAGE | ARGP_HELP_LONG | ARGP_HELP_DOC); fprintf(state->out_stream, _("\nReport bugs to %s.\n"), argp_program_bug_address); exit(0); case 'V': fprintf (state->out_stream, "%s\n", argp_program_version); exit(0); case -3: argp_state_help(state, state->out_stream, ARGP_HELP_USAGE); exit(0); default: return ARGP_ERR_UNKNOWN; } return 0; }
static error_t parse_opt(int k, char *optarg, struct argp_state *state) { struct arguments *args = state->input; switch (k) { case 'a': args->adapter = strtoul(optarg, NULL, 0); break; case 'f': args->frontend = strtoul(optarg, NULL, 0); break; case 'd': args->demux = strtoul(optarg, NULL, 0); break; case 't': args->timeout = strtoul(optarg, NULL, 0); break; case 'I': args->input_format = dvb_parse_format(optarg); break; case 'o': args->filename = strdup(optarg); /* fall through */ case 'r': args->dvr = 1; break; case 'p': args->rec_psi = 1; break; case 'x': args->exit_after_tuning = 1; break; case 'c': args->confname = strdup(optarg); break; case 'w': if (!strcasecmp(optarg,"on")) { args->lna = 1; } else if (!strcasecmp(optarg,"off")) { args->lna = 0; } else if (!strcasecmp(optarg,"auto")) { args->lna = LNA_AUTO; } else { int val = strtoul(optarg, NULL, 0); if (!val) args->lna = 0; else if (val > 0) args->lna = 1; else args->lna = LNA_AUTO; } break; case 'l': args->lnb_name = strdup(optarg); break; case 'S': args->sat_number = strtoul(optarg, NULL, 0); break; case 'U': args->freq_bpf = strtoul(optarg, NULL, 0); break; case 'W': args->diseqc_wait = strtoul(optarg, NULL, 0); break; case 's': args->silent++; break; case 'v': args->verbose++; break; case 'A': args->n_apid = strtoul(optarg, NULL, 0); break; case 'V': args->n_vpid = strtoul(optarg, NULL, 0); break; case 'P': args->all_pids++; break; case '3': args->force_dvbv3 = 1; break; case 'm': args->traffic_monitor = 1; break; case 'X': args->low_traffic = 1; break; case 'L': args->search = strdup(optarg); break; case 'C': args->cc = strndup(optarg, 2); break; case '?': argp_state_help(state, state->out_stream, ARGP_HELP_SHORT_USAGE | ARGP_HELP_LONG | ARGP_HELP_DOC); fprintf(state->out_stream, _("\nReport bugs to %s.\n"), argp_program_bug_address); exit(0); case -4: fprintf (state->out_stream, "%s\n", argp_program_version); exit(0); case -3: argp_state_help(state, state->out_stream, ARGP_HELP_USAGE); exit(0); default: return ARGP_ERR_UNKNOWN; }; return 0; }