aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorYordan Karadzhov (VMware) <y.karadz@gmail.com>2021-08-23 12:56:15 +0300
committerSteven Rostedt (VMware) <rostedt@goodmis.org>2021-09-08 12:28:46 -0400
commit09f02890358a2de2a0bec2b666413b5dce4dd6b2 (patch)
treece5ae9950a5e3a3c472d5054d9c3920fbe9c1e11
parent159f118588739f43f58e7c15f70192cf8d7b9ace (diff)
downloadlibtraceevent-09f02890358a2de2a0bec2b666413b5dce4dd6b2.tar.gz
libtraceevent: Improve tep_print_field()
The existing method tep_print_fields() gets upgraded to use the printing formats provided by the tokens. Link: https://lore.kernel.org/linux-trace-devel/20210823095618.138887-2-y.karadz@gmail.com Suggested-by: Steven Rostedt <rostedt@goodmis.org> Signed-off-by: Yordan Karadzhov (VMware) <y.karadz@gmail.com> Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
-rw-r--r--src/event-parse.c115
1 files changed, 87 insertions, 28 deletions
diff --git a/src/event-parse.c b/src/event-parse.c
index 02ec677..6129a0c 100644
--- a/src/event-parse.c
+++ b/src/event-parse.c
@@ -3913,7 +3913,6 @@ eval_num_arg(void *data, int size, struct tep_event *event, struct tep_print_arg
arg->field.field = tep_find_any_field(event, arg->field.name);
if (!arg->field.field)
goto out_warning_field;
-
}
/* must be a number */
val = tep_read_number(tep, data + arg->field.field->offset,
@@ -5326,8 +5325,8 @@ static int is_printable_array(char *p, unsigned int len)
return 1;
}
-void tep_print_field(struct trace_seq *s, void *data,
- struct tep_format_field *field)
+static void print_field_raw(struct trace_seq *s, void *data,
+ struct tep_format_field *field)
{
struct tep_handle *tep = field->event->tep;
unsigned int offset, len, i;
@@ -5389,6 +5388,56 @@ void tep_print_field(struct trace_seq *s, void *data,
}
}
+static int print_parse_data(struct tep_print_parse *parse, struct trace_seq *s,
+ void *data, int size, struct tep_event *event);
+
+void tep_print_field(struct trace_seq *s, void *data,
+ struct tep_format_field *field)
+{
+ struct tep_event *event = field->event;
+ struct tep_print_parse *parse;
+ bool has_0x;
+
+ parse = event->print_fmt.print_cache;
+
+ if (event->flags & TEP_EVENT_FL_FAILED)
+ goto out;
+
+ if (field->flags & (TEP_FIELD_IS_ARRAY || TEP_FIELD_IS_STRING))
+ goto out;
+
+ for (;parse; parse = parse->next) {
+ if (parse->type == PRINT_FMT_STRING) {
+ int len = strlen(parse->format);
+
+ if (len > 1 &&
+ strcmp(parse->format + (len -2), "0x") == 0)
+ has_0x = true;
+ else
+ has_0x = false;
+
+ continue;
+ }
+
+ if (!parse->arg ||
+ parse->arg->type != TEP_PRINT_FIELD ||
+ parse->arg->field.field != field) {
+ has_0x = false;
+ continue;
+ }
+
+ if (has_0x)
+ trace_seq_puts(s, "0x");
+
+ print_parse_data(parse, s, data, field->size, event);
+ return;
+ }
+
+ out:
+ /* Not found. */
+ print_field_raw(s, data, field);
+}
+
void tep_print_fields(struct trace_seq *s, void *data,
int size __maybe_unused, struct tep_event *event)
{
@@ -5908,35 +5957,45 @@ parse_args(struct tep_event *event, const char *format, struct tep_print_arg *ar
return parse_ret;
}
-static void print_event_cache(struct tep_print_parse *parse, struct trace_seq *s,
- void *data, int size, struct tep_event *event)
+static int print_parse_data(struct tep_print_parse *parse, struct trace_seq *s,
+ void *data, int size, struct tep_event *event)
{
int len_arg;
+ if (parse->len_as_arg)
+ len_arg = eval_num_arg(data, size, event, parse->len_as_arg);
+
+ switch (parse->type) {
+ case PRINT_FMT_ARG_DIGIT:
+ print_arg_number(s, parse->format,
+ parse->len_as_arg ? len_arg : -1, data,
+ size, parse->ls, event, parse->arg);
+ break;
+ case PRINT_FMT_ARG_POINTER:
+ print_arg_pointer(s, parse->format,
+ parse->len_as_arg ? len_arg : 1,
+ data, size, event, parse->arg);
+ break;
+ case PRINT_FMT_ARG_STRING:
+ print_arg_string(s, parse->format,
+ parse->len_as_arg ? len_arg : -1,
+ data, size, event, parse->arg);
+ break;
+ case PRINT_FMT_STRING:
+ default:
+ trace_seq_printf(s, "%s", parse->format);
+ /* Return 1 on non field. */
+ return 1;
+ }
+ /* Return 0 on field being processed. */
+ return 0;
+}
+
+static void print_event_cache(struct tep_print_parse *parse, struct trace_seq *s,
+ void *data, int size, struct tep_event *event)
+{
while (parse) {
- if (parse->len_as_arg)
- len_arg = eval_num_arg(data, size, event, parse->len_as_arg);
- switch (parse->type) {
- case PRINT_FMT_ARG_DIGIT:
- print_arg_number(s, parse->format,
- parse->len_as_arg ? len_arg : -1, data,
- size, parse->ls, event, parse->arg);
- break;
- case PRINT_FMT_ARG_POINTER:
- print_arg_pointer(s, parse->format,
- parse->len_as_arg ? len_arg : 1,
- data, size, event, parse->arg);
- break;
- case PRINT_FMT_ARG_STRING:
- print_arg_string(s, parse->format,
- parse->len_as_arg ? len_arg : -1,
- data, size, event, parse->arg);
- break;
- case PRINT_FMT_STRING:
- default:
- trace_seq_printf(s, "%s", parse->format);
- break;
- }
+ print_parse_data(parse, s, data, size, event);
parse = parse->next;
}
}