/**
 * @file op_parse_event.c
 * event parsing
 *
 * You can have silliness here.
 *
 * @remark Copyright 2002 OProfile authors
 * @remark Read the file COPYING
 *
 * @author John Levon
 * @author Philippe Elie
 */

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

#include "op_parse_event.h"
#include "op_string.h"
#include "op_events.h"

static char * next_part(char const ** str)
{
	char const * c;
	char * ret;

	if ((*str)[0] == '\0')
		return NULL;

	if ((*str)[0] == ':')
		++(*str);

	c = *str;

	while (*c != '\0' && *c != ':')
		++c;

	if (c == *str)
		return NULL;

	ret = op_xstrndup(*str, c - *str);
	*str += c - *str;
	return ret;
}


static int parse_ulong(char const * str)
{
	unsigned long value;
	char * end;
	value = strtoul(str, &end, 0);
	if (end && *end) {
		fprintf(stderr, "Invalid event part %s\n", str);
		exit(EXIT_FAILURE);
	}

	return value;
}


size_t parse_events(struct parsed_event * parsed_events, size_t max_events,
                  char const * const * events, int check_count)
{
	size_t i = 0;
	int timer_event_found_p = 0;

	while (events[i]) {
		char const * cp = events[i];
		char * part = next_part(&cp);

		if (i >= max_events) {
			fprintf(stderr, "Too many events specified: CPU "
			        "only has %lu counters.\n",
				(unsigned long) max_events);
			exit(EXIT_FAILURE);
		}

		if (!part) {
			fprintf(stderr, "Invalid event %s\n", cp);
			exit(EXIT_FAILURE);
		}

		if (strcmp(part, TIMER_EVENT_NAME) == 0)
			timer_event_found_p = 1;

		parsed_events[i].name = part;

		if (check_count) {
			part = next_part(&cp);
			if (!part) {
				fprintf(stderr, "Invalid count for event %s\n", events[i]);
				exit(EXIT_FAILURE);
			}

			parsed_events[i].count = parse_ulong(part);
			free(part);
		}

		parsed_events[i].unit_mask = 0;
		part = next_part(&cp);

		if (part) {
			parsed_events[i].unit_mask_valid = 1;
			if (!isdigit(*part))
				parsed_events[i].unit_mask_name = part;
			else {
				parsed_events[i].unit_mask = parse_ulong(part);
				free(part);
			}
		}

		parsed_events[i].kernel = 1;
		part = next_part(&cp);

		if (part) {
			parsed_events[i].kernel = parse_ulong(part);
			free(part);
		}

		parsed_events[i].user = 1;
		part = next_part(&cp);

		if (part) {
			parsed_events[i].user = parse_ulong(part);
			free(part);
		}
	
		++i;
	}

	if (i > 1 && timer_event_found_p) {
		fprintf(stderr, "TIMER event cannot be used in combination with"
			" hardware counters.\n");
		exit(EXIT_FAILURE);
	}

	return i;
}
