Skip to content

Commit

Permalink
tools lib traceevent: Factor out allocating and processing args
Browse files Browse the repository at this point in the history
The sequence of allocating the print_arg field, calling process_arg()
and verifying that the next event delimiter is repeated twice in
process_hex() and will also be used for process_int_array().

Factor it out to a function to avoid writing the same code again and
again.

Signed-off-by: Javi Merino <javi.merino@arm.com>
Acked-by: Namhyung Kim <namhyung@kernel.org>
Acked-by: Steven Rostedt <rostedt@goodmis.org>
Cc: Jiri Olsa <jolsa@redhat.com>
Link: http://lkml.kernel.org/r/1426875176-30244-2-git-send-email-javi.merino@arm.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
  • Loading branch information
Javi Merino authored and Arnaldo Carvalho de Melo committed Mar 24, 2015
1 parent e6d7c91 commit 929a6bb
Showing 1 changed file with 40 additions and 37 deletions.
77 changes: 40 additions & 37 deletions tools/lib/traceevent/event-parse.c
Original file line number Diff line number Diff line change
Expand Up @@ -2014,6 +2014,38 @@ process_entry(struct event_format *event __maybe_unused, struct print_arg *arg,
return EVENT_ERROR;
}

static int alloc_and_process_delim(struct event_format *event, char *next_token,
struct print_arg **print_arg)
{
struct print_arg *field;
enum event_type type;
char *token;
int ret = 0;

field = alloc_arg();
if (!field) {
do_warning_event(event, "%s: not enough memory!", __func__);
errno = ENOMEM;
return -1;
}

type = process_arg(event, field, &token);

if (test_type_token(type, token, EVENT_DELIM, next_token)) {
errno = EINVAL;
ret = -1;
free_arg(field);
goto out_free_token;
}

*print_arg = field;

out_free_token:
free_token(token);

return ret;
}

static char *arg_eval (struct print_arg *arg);

static unsigned long long
Expand Down Expand Up @@ -2486,49 +2518,20 @@ process_symbols(struct event_format *event, struct print_arg *arg, char **tok)
static enum event_type
process_hex(struct event_format *event, struct print_arg *arg, char **tok)
{
struct print_arg *field;
enum event_type type;
char *token = NULL;

memset(arg, 0, sizeof(*arg));
arg->type = PRINT_HEX;

field = alloc_arg();
if (!field) {
do_warning_event(event, "%s: not enough memory!", __func__);
goto out_free;
}

type = process_arg(event, field, &token);

if (test_type_token(type, token, EVENT_DELIM, ","))
goto out_free;

arg->hex.field = field;

free_token(token);

field = alloc_arg();
if (!field) {
do_warning_event(event, "%s: not enough memory!", __func__);
*tok = NULL;
return EVENT_ERROR;
}

type = process_arg(event, field, &token);

if (test_type_token(type, token, EVENT_DELIM, ")"))
goto out_free;
if (alloc_and_process_delim(event, ",", &arg->hex.field))
goto out;

arg->hex.size = field;
if (alloc_and_process_delim(event, ")", &arg->hex.size))
goto free_field;

free_token(token);
type = read_token_item(tok);
return type;
return read_token_item(tok);

out_free:
free_arg(field);
free_token(token);
free_field:
free_arg(arg->hex.field);
out:
*tok = NULL;
return EVENT_ERROR;
}
Expand Down

0 comments on commit 929a6bb

Please sign in to comment.