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.

Cc: Namhyung Kim <namhy...@kernel.org>
Cc: Arnaldo Carvalho de Melo <a...@redhat.com>
Cc: Steven Rostedt <srost...@redhat.com>
Cc: Jiri Olsa <jo...@redhat.com>
Signed-off-by: Javi Merino <javi.mer...@arm.com>
---

This patch wasn't part of v2.  It avoids repeating code in patch 3.

 tools/lib/traceevent/event-parse.c | 77 ++++++++++++++++++++------------------
 1 file changed, 40 insertions(+), 37 deletions(-)

diff --git a/tools/lib/traceevent/event-parse.c 
b/tools/lib/traceevent/event-parse.c
index cf3a44bf1ec3..9d063b829907 100644
--- a/tools/lib/traceevent/event-parse.c
+++ b/tools/lib/traceevent/event-parse.c
@@ -2013,6 +2013,38 @@ process_entry(struct event_format *event __maybe_unused, 
struct print_arg *arg,
        return EVENT_ERROR;
 }
 
+static int alloc_and_process_arg(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
@@ -2485,49 +2517,20 @@ out_free:
 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_arg(event, ",", &arg->hex.field))
+               goto out;
 
-       arg->hex.size = field;
+        if (alloc_and_process_arg(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;
 }
-- 
1.9.1

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to