tools lib subcmd: Introduce OPTION_ULONG
authorArnaldo Carvalho de Melo <acme@redhat.com>
Thu, 18 Oct 2018 18:24:07 +0000 (15:24 -0300)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Fri, 19 Oct 2018 14:56:58 +0000 (11:56 -0300)
For completeness, will be used in 'perf trace --max-events'.

Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Andi Kleen <ak@linux.intel.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Josh Poimboeuf <jpoimboe@redhat.com>
Cc: Kim Phillips <kim.phillips@arm.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Wang Nan <wangnan0@huawei.com>
Link: https://lkml.kernel.org/n/tip-glaj3pwespxfj2fdjs9a20b6@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/lib/subcmd/parse-options.c
tools/lib/subcmd/parse-options.h

index cb7154eccbdc1e6a825060b137155ce4560df2a4..dbb9efbf718a065d4d6e9998fa4d147b1cc691fc 100644 (file)
@@ -116,6 +116,7 @@ static int get_value(struct parse_opt_ctx_t *p,
                case OPTION_INTEGER:
                case OPTION_UINTEGER:
                case OPTION_LONG:
+               case OPTION_ULONG:
                case OPTION_U64:
                default:
                        break;
@@ -166,6 +167,7 @@ static int get_value(struct parse_opt_ctx_t *p,
                case OPTION_INTEGER:
                case OPTION_UINTEGER:
                case OPTION_LONG:
+               case OPTION_ULONG:
                case OPTION_U64:
                default:
                        break;
@@ -295,6 +297,22 @@ static int get_value(struct parse_opt_ctx_t *p,
                        return opterror(opt, "expects a numerical value", flags);
                return 0;
 
+       case OPTION_ULONG:
+               if (unset) {
+                       *(unsigned long *)opt->value = 0;
+                       return 0;
+               }
+               if (opt->flags & PARSE_OPT_OPTARG && !p->opt) {
+                       *(unsigned long *)opt->value = opt->defval;
+                       return 0;
+               }
+               if (get_arg(p, opt, flags, &arg))
+                       return -1;
+               *(unsigned long *)opt->value = strtoul(arg, (char **)&s, 10);
+               if (*s)
+                       return opterror(opt, "expects a numerical value", flags);
+               return 0;
+
        case OPTION_U64:
                if (unset) {
                        *(u64 *)opt->value = 0;
@@ -703,6 +721,7 @@ static void print_option_help(const struct option *opts, int full)
        case OPTION_ARGUMENT:
                break;
        case OPTION_LONG:
+       case OPTION_ULONG:
        case OPTION_U64:
        case OPTION_INTEGER:
        case OPTION_UINTEGER:
index 92fdbe1519f6d8f2aebfd8cf05a119bea7be344a..6ca2a8bfe716b1c658f693b29c64b2dd0b79642e 100644 (file)
@@ -25,6 +25,7 @@ enum parse_opt_type {
        OPTION_STRING,
        OPTION_INTEGER,
        OPTION_LONG,
+       OPTION_ULONG,
        OPTION_CALLBACK,
        OPTION_U64,
        OPTION_UINTEGER,
@@ -133,6 +134,7 @@ struct option {
 #define OPT_INTEGER(s, l, v, h)     { .type = OPTION_INTEGER, .short_name = (s), .long_name = (l), .value = check_vtype(v, int *), .help = (h) }
 #define OPT_UINTEGER(s, l, v, h)    { .type = OPTION_UINTEGER, .short_name = (s), .long_name = (l), .value = check_vtype(v, unsigned int *), .help = (h) }
 #define OPT_LONG(s, l, v, h)        { .type = OPTION_LONG, .short_name = (s), .long_name = (l), .value = check_vtype(v, long *), .help = (h) }
+#define OPT_ULONG(s, l, v, h)        { .type = OPTION_ULONG, .short_name = (s), .long_name = (l), .value = check_vtype(v, unsigned long *), .help = (h) }
 #define OPT_U64(s, l, v, h)         { .type = OPTION_U64, .short_name = (s), .long_name = (l), .value = check_vtype(v, u64 *), .help = (h) }
 #define OPT_STRING(s, l, v, a, h)   { .type = OPTION_STRING,  .short_name = (s), .long_name = (l), .value = check_vtype(v, const char **), .argh = (a), .help = (h) }
 #define OPT_STRING_OPTARG(s, l, v, a, h, d) \