/** * parse_events - parse a perf style string with events * @el: List of events allocated earlier * @events: Comma separated lists of events. {} style groups are legal. * * JSON events are supported, if the event lists are downloaded first. */ int parse_events(struct eventlist *el, char *events) { char *s, *tmp; events = strdup(events); if (! events) return -1; for (s = strtok_r(events, ",", &tmp); s; s = strtok_r(NULL, ",", &tmp)) { bool group_leader = false, end_group = false; int len; if (s[0] == '{') { s++; group_leader = true; } else if (len = strlen(s), len > 0 && s[len - 1] == '}') { s[len - 1] = 0; end_group = true; } struct event *e = new_event(el, s); e->group_leader = group_leader; e->end_group = end_group; if (resolve_event(s, &e->attr) < 0) { fprintf(stderr, "Cannot resolve %s\n", e->event); return -1; } } free(events); return 0; }
int main(int ac, char **av) { int test = 0; int ret = 0; while (*++av) { if (!strcmp(*av, "--test")) { test = 1; continue; } struct perf_event_attr attr; if (resolve_event(*av, &attr) < 0) { fprintf(stderr, "Cannot resolve %s\n", *av); ret = 1; continue; } char *ev = format_raw_event(&attr, *av); printf("%s\n", ev); free(ev); if (test) { if (syscall(__NR_perf_event_open, &attr, 0, -1, -1, 0) < 0) perror("perf_event_open"); } } return ret; }