tools lib traceevent: Factor out allocating and processing args
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>
This commit is contained in:
parent
e6d7c91c8c
commit
929a6bb71a
@ -2014,6 +2014,38 @@ process_entry(struct event_format *event __maybe_unused, struct print_arg *arg,
|
|||||||
return EVENT_ERROR;
|
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 char *arg_eval (struct print_arg *arg);
|
||||||
|
|
||||||
static unsigned long long
|
static unsigned long long
|
||||||
@ -2486,49 +2518,20 @@ out_free:
|
|||||||
static enum event_type
|
static enum event_type
|
||||||
process_hex(struct event_format *event, struct print_arg *arg, char **tok)
|
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));
|
memset(arg, 0, sizeof(*arg));
|
||||||
arg->type = PRINT_HEX;
|
arg->type = PRINT_HEX;
|
||||||
|
|
||||||
field = alloc_arg();
|
if (alloc_and_process_delim(event, ",", &arg->hex.field))
|
||||||
if (!field) {
|
goto out;
|
||||||
do_warning_event(event, "%s: not enough memory!", __func__);
|
|
||||||
goto out_free;
|
|
||||||
}
|
|
||||||
|
|
||||||
type = process_arg(event, field, &token);
|
if (alloc_and_process_delim(event, ")", &arg->hex.size))
|
||||||
|
goto free_field;
|
||||||
|
|
||||||
if (test_type_token(type, token, EVENT_DELIM, ","))
|
return read_token_item(tok);
|
||||||
goto out_free;
|
|
||||||
|
|
||||||
arg->hex.field = field;
|
free_field:
|
||||||
|
free_arg(arg->hex.field);
|
||||||
free_token(token);
|
out:
|
||||||
|
|
||||||
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;
|
|
||||||
|
|
||||||
arg->hex.size = field;
|
|
||||||
|
|
||||||
free_token(token);
|
|
||||||
type = read_token_item(tok);
|
|
||||||
return type;
|
|
||||||
|
|
||||||
out_free:
|
|
||||||
free_arg(field);
|
|
||||||
free_token(token);
|
|
||||||
*tok = NULL;
|
*tok = NULL;
|
||||||
return EVENT_ERROR;
|
return EVENT_ERROR;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user