• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /**
2  * @file op_parse_event.c
3  * event parsing
4  *
5  * You can have silliness here.
6  *
7  * @remark Copyright 2002 OProfile authors
8  * @remark Read the file COPYING
9  *
10  * @author John Levon
11  * @author Philippe Elie
12  */
13 
14 #include <stdio.h>
15 #include <stdlib.h>
16 
17 #include "op_parse_event.h"
18 #include "op_string.h"
19 
next_part(char const ** str)20 static char * next_part(char const ** str)
21 {
22 	char const * c;
23 	char * ret;
24 
25 	if ((*str)[0] == '\0')
26 		return NULL;
27 
28 	if ((*str)[0] == ':')
29 		++(*str);
30 
31 	c = *str;
32 
33 	while (*c != '\0' && *c != ':')
34 		++c;
35 
36 	if (c == *str)
37 		return NULL;
38 
39 	ret = op_xstrndup(*str, c - *str);
40 	*str += c - *str;
41 	return ret;
42 }
43 
44 
parse_ulong(char const * str)45 static int parse_ulong(char const * str)
46 {
47 	unsigned long value;
48 	char * end;
49 	value = strtoul(str, &end, 0);
50 	if (end && *end) {
51 		fprintf(stderr, "Invalid event part %s\n", str);
52 		exit(EXIT_FAILURE);
53 	}
54 
55 	return value;
56 }
57 
58 
parse_events(struct parsed_event * parsed_events,size_t max_events,char const * const * events)59 size_t parse_events(struct parsed_event * parsed_events, size_t max_events,
60                   char const * const * events)
61 {
62 	size_t i = 0;
63 
64 	while (events[i]) {
65 		char const * cp = events[i];
66 		char * part = next_part(&cp);
67 
68 		if (i >= max_events) {
69 			fprintf(stderr, "Too many events specified: CPU "
70 			        "only has %lu counters.\n",
71 				(unsigned long) max_events);
72 			exit(EXIT_FAILURE);
73 		}
74 
75 		if (!part) {
76 			fprintf(stderr, "Invalid event %s\n", cp);
77 			exit(EXIT_FAILURE);
78 		}
79 
80 		parsed_events[i].name = part;
81 
82 		part = next_part(&cp);
83 
84 		if (!part) {
85 			fprintf(stderr, "Invalid count for event %s\n", events[i]);
86 			exit(EXIT_FAILURE);
87 		}
88 
89 		parsed_events[i].count = parse_ulong(part);
90 		free(part);
91 
92 		parsed_events[i].unit_mask = 0;
93 		part = next_part(&cp);
94 
95 		if (part) {
96 			parsed_events[i].unit_mask_valid = 1;
97 			parsed_events[i].unit_mask = parse_ulong(part);
98 			free(part);
99 		}
100 
101 		parsed_events[i].kernel = 1;
102 		part = next_part(&cp);
103 
104 		if (part) {
105 			parsed_events[i].kernel = parse_ulong(part);
106 			free(part);
107 		}
108 
109 		parsed_events[i].user = 1;
110 		part = next_part(&cp);
111 
112 		if (part) {
113 			parsed_events[i].user = parse_ulong(part);
114 			free(part);
115 		}
116 
117 		++i;
118 	}
119 
120 	return i;
121 }
122