Reorganize tree
[libside.git] / src / tracer.c
CommitLineData
f611d0c3
MD
1// SPDX-License-Identifier: MIT
2/*
3 * Copyright 2022 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
4 */
5
6#include <stdint.h>
7#include <inttypes.h>
8#include <stdlib.h>
9#include <stdio.h>
10
11#include <side/trace.h>
12
13static
14void tracer_print_struct(const struct side_type_description *type_desc, const struct side_arg_vec_description *sav_desc);
15static
16void tracer_print_array(const struct side_type_description *type_desc, const struct side_arg_vec_description *sav_desc);
17static
18void tracer_print_vla(const struct side_type_description *type_desc, const struct side_arg_vec_description *sav_desc);
19static
20void tracer_print_vla_visitor(const struct side_type_description *type_desc, void *ctx);
21
22static
23void tracer_print_type(const struct side_type_description *type_desc, const struct side_arg_vec *item)
24{
25 if (type_desc->type != SIDE_TYPE_DYNAMIC && type_desc->type != item->type) {
26 printf("ERROR: type mismatch between description and arguments\n");
27 abort();
28 }
29
30 switch (item->type) {
31 case SIDE_TYPE_U8:
32 printf("%" PRIu8, item->u.side_u8);
33 break;
34 case SIDE_TYPE_U16:
35 printf("%" PRIu16, item->u.side_u16);
36 break;
37 case SIDE_TYPE_U32:
38 printf("%" PRIu32, item->u.side_u32);
39 break;
40 case SIDE_TYPE_U64:
41 printf("%" PRIu64, item->u.side_u64);
42 break;
43 case SIDE_TYPE_S8:
44 printf("%" PRId8, item->u.side_s8);
45 break;
46 case SIDE_TYPE_S16:
47 printf("%" PRId16, item->u.side_s16);
48 break;
49 case SIDE_TYPE_S32:
50 printf("%" PRId32, item->u.side_s32);
51 break;
52 case SIDE_TYPE_S64:
53 printf("%" PRId64, item->u.side_s64);
54 break;
55 case SIDE_TYPE_STRING:
56 printf("%s", item->u.string);
57 break;
58 case SIDE_TYPE_STRUCT:
59 tracer_print_struct(type_desc, item->u.side_struct);
60 break;
61 case SIDE_TYPE_ARRAY:
62 tracer_print_array(type_desc, item->u.side_array);
63 break;
64 case SIDE_TYPE_VLA:
65 tracer_print_vla(type_desc, item->u.side_vla);
66 break;
67 case SIDE_TYPE_VLA_VISITOR:
68 tracer_print_vla_visitor(type_desc, item->u.side_vla_visitor_ctx);
69 break;
70 default:
71 printf("<UNKNOWN TYPE>");
72 abort();
73 }
74}
75
76static
77void tracer_print_field(const struct side_event_field *item_desc, const struct side_arg_vec *item)
78{
79 printf("(\"%s\", ", item_desc->field_name);
80 tracer_print_type(&item_desc->side_type, item);
81 printf(")");
82}
83
84static
85void tracer_print_struct(const struct side_type_description *type_desc, const struct side_arg_vec_description *sav_desc)
86{
87 const struct side_arg_vec *sav = sav_desc->sav;
88 uint32_t side_sav_len = sav_desc->len;
89 int i;
90
91 if (type_desc->u.side_struct.nr_fields != side_sav_len) {
92 printf("ERROR: number of fields mismatch between description and arguments of structure\n");
93 abort();
94 }
95 printf("{ ");
96 for (i = 0; i < side_sav_len; i++) {
97 printf("%s", i ? ", " : "");
98 tracer_print_field(&type_desc->u.side_struct.fields[i], &sav[i]);
99 }
100 printf(" }");
101}
102
103static
104void tracer_print_array(const struct side_type_description *type_desc, const struct side_arg_vec_description *sav_desc)
105{
106 const struct side_arg_vec *sav = sav_desc->sav;
107 uint32_t side_sav_len = sav_desc->len;
108 int i;
109
110 if (type_desc->u.side_array.length != side_sav_len) {
111 printf("ERROR: length mismatch between description and arguments of array\n");
112 abort();
113 }
114 printf("[ ");
115 for (i = 0; i < side_sav_len; i++) {
116 printf("%s", i ? ", " : "");
117 tracer_print_type(type_desc->u.side_array.elem_type, &sav[i]);
118 }
119 printf(" ]");
120}
121
122static
123void tracer_print_vla(const struct side_type_description *type_desc, const struct side_arg_vec_description *sav_desc)
124{
125 const struct side_arg_vec *sav = sav_desc->sav;
126 uint32_t side_sav_len = sav_desc->len;
127 int i;
128
129 printf("[ ");
130 for (i = 0; i < side_sav_len; i++) {
131 printf("%s", i ? ", " : "");
132 tracer_print_type(type_desc->u.side_vla.elem_type, &sav[i]);
133 }
134 printf(" ]");
135}
136
137static
138void tracer_print_vla_visitor(const struct side_type_description *type_desc, void *ctx)
139{
140 enum side_visitor_status status;
141 int i;
142
143 status = type_desc->u.side_vla_visitor.begin(ctx);
144 if (status != SIDE_VISITOR_STATUS_OK) {
145 printf("ERROR: Visitor error\n");
146 abort();
147 }
148
149 printf("[ ");
150 status = SIDE_VISITOR_STATUS_OK;
151 for (i = 0; status == SIDE_VISITOR_STATUS_OK; i++) {
152 struct side_arg_vec sav_elem;
153
154 status = type_desc->u.side_vla_visitor.get_next(ctx, &sav_elem);
155 switch (status) {
156 case SIDE_VISITOR_STATUS_OK:
157 break;
158 case SIDE_VISITOR_STATUS_ERROR:
159 printf("ERROR: Visitor error\n");
160 abort();
161 case SIDE_VISITOR_STATUS_END:
162 continue;
163 }
164 printf("%s", i ? ", " : "");
165 tracer_print_type(type_desc->u.side_vla_visitor.elem_type, &sav_elem);
166 }
167 printf(" ]");
168 if (type_desc->u.side_vla_visitor.end) {
169 status = type_desc->u.side_vla_visitor.end(ctx);
170 if (status != SIDE_VISITOR_STATUS_OK) {
171 printf("ERROR: Visitor error\n");
172 abort();
173 }
174 }
175}
176
177void tracer_call(const struct side_event_description *desc, const struct side_arg_vec_description *sav_desc)
178{
179 const struct side_arg_vec *sav = sav_desc->sav;
180 uint32_t side_sav_len = sav_desc->len;
181 int i;
182
183 printf("provider: %s, event: %s, ", desc->provider_name, desc->event_name);
184 if (desc->nr_fields != side_sav_len) {
185 printf("ERROR: number of fields mismatch between description and arguments\n");
186 abort();
187 }
188 for (i = 0; i < side_sav_len; i++) {
189 printf("%s", i ? ", " : "");
190 tracer_print_field(&desc->fields[i], &sav[i]);
191 }
192 printf("\n");
193}
This page took 0.128395 seconds and 4 git commands to generate.