diff options
Diffstat (limited to 'tools/perf/util/trace-event-parse.c')
| -rw-r--r-- | tools/perf/util/trace-event-parse.c | 50 | 
1 files changed, 22 insertions, 28 deletions
diff --git a/tools/perf/util/trace-event-parse.c b/tools/perf/util/trace-event-parse.c index 7aeedb09ea7..f73ee55b51e 100644 --- a/tools/perf/util/trace-event-parse.c +++ b/tools/perf/util/trace-event-parse.c @@ -1217,7 +1217,24 @@ process_op(struct event *event, struct print_arg *arg, char **tok)  		right = malloc_or_die(sizeof(*right)); -		type = process_arg(event, right, tok); +		type = read_token_item(&token); +		*tok = token; + +		/* could just be a type pointer */ +		if ((strcmp(arg->op.op, "*") == 0) && +		    type == EVENT_DELIM && (strcmp(token, ")") == 0)) { +			if (left->type != PRINT_ATOM) +				die("bad pointer type"); +			left->atom.atom = realloc(left->atom.atom, +					    sizeof(left->atom.atom) + 3); +			strcat(left->atom.atom, " *"); +			*arg = *left; +			free(arg); + +			return type; +		} + +		type = process_arg_token(event, right, tok, type);  		arg->op.right = right; @@ -1548,7 +1565,6 @@ process_paren(struct event *event, struct print_arg *arg, char **tok)  {  	struct print_arg *item_arg;  	enum event_type type; -	int ptr_cast = 0;  	char *token;  	type = process_arg(event, arg, &token); @@ -1556,26 +1572,11 @@ process_paren(struct event *event, struct print_arg *arg, char **tok)  	if (type == EVENT_ERROR)  		return EVENT_ERROR; -	if (type == EVENT_OP) { -		/* handle the ptr casts */ -		if (!strcmp(token, "*")) { -			/* -			 * FIXME: should we zapp whitespaces before ')' ? -			 * (may require a peek_token_item()) -			 */ -			if (__peek_char() == ')') { -				ptr_cast = 1; -				free_token(token); -				type = read_token_item(&token); -			} -		} -		if (!ptr_cast) { -			type = process_op(event, arg, &token); +	if (type == EVENT_OP) +		type = process_op(event, arg, &token); -			if (type == EVENT_ERROR) -				return EVENT_ERROR; -		} -	} +	if (type == EVENT_ERROR) +		return EVENT_ERROR;  	if (test_type_token(type, token, EVENT_DELIM, (char *)")")) {  		free_token(token); @@ -1601,13 +1602,6 @@ process_paren(struct event *event, struct print_arg *arg, char **tok)  		item_arg = malloc_or_die(sizeof(*item_arg));  		arg->type = PRINT_TYPE; -		if (ptr_cast) { -			char *old = arg->atom.atom; - -			arg->atom.atom = malloc_or_die(strlen(old + 3)); -			sprintf(arg->atom.atom, "%s *", old); -			free(old); -		}  		arg->typecast.type = arg->atom.atom;  		arg->typecast.item = item_arg;  		type = process_arg_token(event, item_arg, &token, type);  |