Merge branch 'x86-trace-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git...
[cascardo/linux.git] / tools / perf / builtin-list.c
index e79f423..011195e 100644 (file)
 #include "util/parse-events.h"
 #include "util/cache.h"
 #include "util/pmu.h"
+#include "util/parse-options.h"
 
 int cmd_list(int argc, const char **argv, const char *prefix __maybe_unused)
 {
+       int i;
+       const struct option list_options[] = {
+               OPT_END()
+       };
+       const char * const list_usage[] = {
+               "perf list [hw|sw|cache|tracepoint|pmu|event_glob]",
+               NULL
+       };
+
+       argc = parse_options(argc, argv, list_options, list_usage,
+                            PARSE_OPT_STOP_AT_NON_OPTION);
+
        setup_pager();
 
-       if (argc == 1)
+       if (argc == 0) {
                print_events(NULL, false);
-       else {
-               int i;
-
-               for (i = 1; i < argc; ++i) {
-                       if (i > 2)
-                               putchar('\n');
-                       if (strncmp(argv[i], "tracepoint", 10) == 0)
-                               print_tracepoint_events(NULL, NULL, false);
-                       else if (strcmp(argv[i], "hw") == 0 ||
-                                strcmp(argv[i], "hardware") == 0)
-                               print_events_type(PERF_TYPE_HARDWARE);
-                       else if (strcmp(argv[i], "sw") == 0 ||
-                                strcmp(argv[i], "software") == 0)
-                               print_events_type(PERF_TYPE_SOFTWARE);
-                       else if (strcmp(argv[i], "cache") == 0 ||
-                                strcmp(argv[i], "hwcache") == 0)
-                               print_hwcache_events(NULL, false);
-                       else if (strcmp(argv[i], "pmu") == 0)
-                               print_pmu_events(NULL, false);
-                       else if (strcmp(argv[i], "--raw-dump") == 0)
-                               print_events(NULL, true);
-                       else {
-                               char *sep = strchr(argv[i], ':'), *s;
-                               int sep_idx;
+               return 0;
+       }
 
-                               if (sep == NULL) {
-                                       print_events(argv[i], false);
-                                       continue;
-                               }
-                               sep_idx = sep - argv[i];
-                               s = strdup(argv[i]);
-                               if (s == NULL)
-                                       return -1;
+       for (i = 0; i < argc; ++i) {
+               if (i)
+                       putchar('\n');
+               if (strncmp(argv[i], "tracepoint", 10) == 0)
+                       print_tracepoint_events(NULL, NULL, false);
+               else if (strcmp(argv[i], "hw") == 0 ||
+                        strcmp(argv[i], "hardware") == 0)
+                       print_events_type(PERF_TYPE_HARDWARE);
+               else if (strcmp(argv[i], "sw") == 0 ||
+                        strcmp(argv[i], "software") == 0)
+                       print_events_type(PERF_TYPE_SOFTWARE);
+               else if (strcmp(argv[i], "cache") == 0 ||
+                        strcmp(argv[i], "hwcache") == 0)
+                       print_hwcache_events(NULL, false);
+               else if (strcmp(argv[i], "pmu") == 0)
+                       print_pmu_events(NULL, false);
+               else if (strcmp(argv[i], "--raw-dump") == 0)
+                       print_events(NULL, true);
+               else {
+                       char *sep = strchr(argv[i], ':'), *s;
+                       int sep_idx;
 
-                               s[sep_idx] = '\0';
-                               print_tracepoint_events(s, s + sep_idx + 1, false);
-                               free(s);
+                       if (sep == NULL) {
+                               print_events(argv[i], false);
+                               continue;
                        }
+                       sep_idx = sep - argv[i];
+                       s = strdup(argv[i]);
+                       if (s == NULL)
+                               return -1;
+
+                       s[sep_idx] = '\0';
+                       print_tracepoint_events(s, s + sep_idx + 1, false);
+                       free(s);
                }
        }
        return 0;