in profiler/profile.cpp [101:216]
static error_t parse_arg(int key, char *arg, struct argp_state *state)
{
static int pos_args;
switch (key)
{
case 'h':
argp_state_help(state, stderr, ARGP_HELP_STD_HELP);
break;
case 'v':
env.verbose = true;
break;
case 'p':
errno = 0;
env.pid = strtol(arg, NULL, 10);
if (errno)
{
fprintf(stderr, "invalid PID: %s\n", arg);
argp_usage(state);
}
break;
case 'L':
errno = 0;
env.tid = strtol(arg, NULL, 10);
if (errno || env.tid <= 0)
{
fprintf(stderr, "Invalid TID: %s\n", arg);
argp_usage(state);
}
break;
case 'U':
env.user_stacks_only = true;
break;
case 'K':
env.kernel_stacks_only = true;
break;
case 'F':
errno = 0;
env.sample_freq = strtol(arg, NULL, 10);
if (errno || env.sample_freq <= 0)
{
fprintf(stderr, "invalid FREQUENCY: %s\n", arg);
argp_usage(state);
}
break;
case 'D':
errno = 0;
env.frame_depth = strtol(arg, NULL, 10);
if (errno || env.frame_depth <= 0)
{
fprintf(stderr, "invalid FREQUENCY: %s\n", arg);
argp_usage(state);
}
break;
case 'd':
env.delimiter = true;
break;
case 'I':
env.include_idle = true;
break;
case 'f':
env.folded = true;
break;
case 'C':
errno = 0;
env.cpu = strtol(arg, NULL, 10);
if (errno)
{
fprintf(stderr, "invalid CPU: %s\n", arg);
argp_usage(state);
}
break;
case OPT_PERF_MAX_STACK_DEPTH:
errno = 0;
env.perf_max_stack_depth = strtol(arg, NULL, 10);
if (errno)
{
fprintf(stderr, "invalid perf max stack depth: %s\n", arg);
argp_usage(state);
}
break;
case OPT_STACK_STORAGE_SIZE:
errno = 0;
env.stack_storage_size = strtol(arg, NULL, 10);
if (errno)
{
fprintf(stderr, "invalid stack storage size: %s\n", arg);
argp_usage(state);
}
break;
case OPT_LUA_USER_STACK_ONLY:
env.lua_user_stacks_only = true;
break;
case OPT_DISABLE_LUA_USER_TRACE:
env.disable_lua_user_trace = true;
break;
case ARGP_KEY_ARG:
if (pos_args++)
{
fprintf(stderr,
"Unrecognized positional argument: %s\n", arg);
argp_usage(state);
}
errno = 0;
env.duration = strtol(arg, NULL, 10);
if (errno || env.duration <= 0)
{
fprintf(stderr, "Invalid duration (in s): %s\n", arg);
argp_usage(state);
}
break;
default:
return ARGP_ERR_UNKNOWN;
}
return 0;
}