PARSER. Field 2 in ARGP. Order of parameters: KEY, ARG, STATE. */
| 75 | Order of parameters: KEY, ARG, STATE. |
| 76 | */ |
| 77 | static error_t parse_opt(int key, char *arg, struct argp_state *state) { |
| 78 | struct arguments *arguments = |
| 79 | reinterpret_cast<struct arguments *>(state->input); |
| 80 | |
| 81 | switch (key) { |
| 82 | case OPTION_TRACE_TYPE_PARAMS: |
| 83 | arguments->trace_type_params = arg; |
| 84 | break; |
| 85 | case OPTION_OUTPUT_PATH: |
| 86 | strncpy(arguments->ofilepath, arg, OFILEPATH_LEN - 1); |
| 87 | arguments->ofilepath[OFILEPATH_LEN - 1] = '\0'; |
| 88 | break; |
| 89 | case OPTION_NUM_REQ: |
| 90 | arguments->n_req = atoll(arg); |
| 91 | break; |
| 92 | case OPTION_CACHE_ALGORITHM: |
| 93 | arguments->cache_algorithm_str = arg; |
| 94 | break; |
| 95 | case OPTION_MRC_SIZE: |
| 96 | arguments->mrc_size_str = arg; |
| 97 | break; |
| 98 | case OPTION_PROFILER: |
| 99 | arguments->mrc_profiler_str = arg; |
| 100 | break; |
| 101 | case OPTION_PROFILER_PARAMS: |
| 102 | arguments->mrc_profiler_params_str = arg; |
| 103 | break; |
| 104 | case OPTION_IGNORE_OBJ_SIZE: |
| 105 | arguments->ignore_obj_size = true; |
| 106 | break; |
| 107 | case OPTION_VERBOSE: |
| 108 | arguments->verbose = is_true(arg) ? true : false; |
| 109 | break; |
| 110 | case ARGP_KEY_ARG: |
| 111 | if (state->arg_num >= N_ARGS) { |
| 112 | ERROR("found too many arguments, current %s\n", arg); |
| 113 | argp_usage(state); |
| 114 | exit(1); |
| 115 | } |
| 116 | arguments->args[state->arg_num] = arg; |
| 117 | break; |
| 118 | case ARGP_KEY_END: |
| 119 | if (state->arg_num < N_ARGS) { |
| 120 | ERROR("not enough arguments found\n"); |
| 121 | argp_usage(state); |
| 122 | exit(1); |
| 123 | } |
| 124 | break; |
| 125 | default: |
| 126 | return ARGP_ERR_UNKNOWN; |
| 127 | } |
| 128 | return 0; |
| 129 | } |
| 130 | |
| 131 | /* |
| 132 | ARGS_DOC. Field 3 in ARGP. |