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