110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project/**
210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * @file op_parse_event.c
310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * event parsing
410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project *
510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * You can have silliness here.
610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project *
710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * @remark Copyright 2002 OProfile authors
810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * @remark Read the file COPYING
910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project *
1010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * @author John Levon
1110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * @author Philippe Elie
1210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project */
1310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
1410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project#include <stdio.h>
1510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project#include <stdlib.h>
1610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
1710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project#include "op_parse_event.h"
1810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project#include "op_string.h"
1910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
2010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectstatic char * next_part(char const ** str)
2110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project{
2210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	char const * c;
2310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	char * ret;
2410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
2510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	if ((*str)[0] == '\0')
2610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project		return NULL;
2710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
2810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	if ((*str)[0] == ':')
2910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project		++(*str);
3010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
3110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	c = *str;
3210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
3310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	while (*c != '\0' && *c != ':')
3410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project		++c;
3510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
3610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	if (c == *str)
3710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project		return NULL;
3810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
3910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	ret = op_xstrndup(*str, c - *str);
4010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	*str += c - *str;
4110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	return ret;
4210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project}
4310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
4410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
4510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectstatic int parse_ulong(char const * str)
4610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project{
4710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	unsigned long value;
4810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	char * end;
4910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	value = strtoul(str, &end, 0);
5010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	if (end && *end) {
5110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project		fprintf(stderr, "Invalid event part %s\n", str);
5210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project		exit(EXIT_FAILURE);
5310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	}
5410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
5510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	return value;
5610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project}
5710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
5810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
5910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectsize_t parse_events(struct parsed_event * parsed_events, size_t max_events,
6010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project                  char const * const * events)
6110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project{
6210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	size_t i = 0;
6310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
6410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	while (events[i]) {
6510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project		char const * cp = events[i];
6610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project		char * part = next_part(&cp);
6710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
6810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project		if (i >= max_events) {
6910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project			fprintf(stderr, "Too many events specified: CPU "
7010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project			        "only has %lu counters.\n",
7110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project				(unsigned long) max_events);
7210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project			exit(EXIT_FAILURE);
7310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project		}
7410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
7510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project		if (!part) {
7610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project			fprintf(stderr, "Invalid event %s\n", cp);
7710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project			exit(EXIT_FAILURE);
7810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project		}
7910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
8010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project		parsed_events[i].name = part;
8110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
8210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project		part = next_part(&cp);
8310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
8410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project		if (!part) {
8510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project			fprintf(stderr, "Invalid count for event %s\n", events[i]);
8610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project			exit(EXIT_FAILURE);
8710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project		}
8810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
8910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project		parsed_events[i].count = parse_ulong(part);
9010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project		free(part);
9110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
9210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project		parsed_events[i].unit_mask = 0;
9310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project		part = next_part(&cp);
9410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
9510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project		if (part) {
965a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng			parsed_events[i].unit_mask_valid = 1;
9710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project			parsed_events[i].unit_mask = parse_ulong(part);
9810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project			free(part);
9910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project		}
10010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
10110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project		parsed_events[i].kernel = 1;
10210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project		part = next_part(&cp);
10310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
10410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project		if (part) {
10510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project			parsed_events[i].kernel = parse_ulong(part);
10610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project			free(part);
10710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project		}
10810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
10910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project		parsed_events[i].user = 1;
11010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project		part = next_part(&cp);
11110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
11210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project		if (part) {
11310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project			parsed_events[i].user = parse_ulong(part);
11410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project			free(part);
11510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project		}
11610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
11710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project		++i;
11810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	}
11910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
12010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	return i;
12110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project}
122