Remove enum before/after for description visitor
[libside.git] / src / visit-description.c
1 // SPDX-License-Identifier: MIT
2 /*
3 * Copyright 2022-2024 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
4 */
5
6 #include <string.h>
7
8 #include "visit-description.h"
9
10 static
11 void side_visit_type(const struct side_description_visitor *description_visitor,
12 const struct side_type *type_desc, void *priv);
13
14 static
15 void visit_gather_type(const struct side_description_visitor *description_visitor,
16 const struct side_type *type_desc, void *priv);
17
18 static
19 void visit_gather_elem(const struct side_description_visitor *description_visitor,
20 const struct side_type *type_desc, void *priv);
21
22 static
23 void description_visitor_gather_enum(const struct side_description_visitor *description_visitor,
24 const struct side_type_gather *type_gather, void *priv);
25
26 static
27 void side_visit_elem(const struct side_description_visitor *description_visitor, const struct side_type *type_desc, void *priv)
28 {
29 if (description_visitor->before_elem_func)
30 description_visitor->before_elem_func(type_desc, priv);
31 side_visit_type(description_visitor, type_desc, priv);
32 if (description_visitor->after_elem_func)
33 description_visitor->after_elem_func(type_desc, priv);
34 }
35
36 static
37 void side_visit_field(const struct side_description_visitor *description_visitor, const struct side_event_field *item_desc, void *priv)
38 {
39 if (description_visitor->before_field_func)
40 description_visitor->before_field_func(item_desc, priv);
41 side_visit_type(description_visitor, &item_desc->side_type, priv);
42 if (description_visitor->after_field_func)
43 description_visitor->after_field_func(item_desc, priv);
44 }
45
46 static
47 void side_visit_option(const struct side_description_visitor *description_visitor, const struct side_variant_option *option_desc, void *priv)
48 {
49 if (description_visitor->before_option_func)
50 description_visitor->before_option_func(option_desc, priv);
51 side_visit_type(description_visitor, &option_desc->side_type, priv);
52 if (description_visitor->after_option_func)
53 description_visitor->after_option_func(option_desc, priv);
54 }
55
56 static
57 void description_visitor_enum(const struct side_description_visitor *description_visitor, const struct side_type *type_desc, void *priv)
58 {
59 const struct side_type *elem_type = side_ptr_get(type_desc->u.side_enum.elem_type);
60
61 if (description_visitor->before_enum_type_func)
62 description_visitor->before_enum_type_func(type_desc, priv);
63 side_visit_elem(description_visitor, elem_type, priv);
64 if (description_visitor->after_enum_type_func)
65 description_visitor->after_enum_type_func(type_desc, priv);
66 }
67
68 static
69 void description_visitor_enum_bitmap(const struct side_description_visitor *description_visitor, const struct side_type *type_desc, void *priv)
70 {
71 const struct side_type *elem_type = side_ptr_get(type_desc->u.side_enum_bitmap.elem_type);
72
73 if (description_visitor->before_enum_bitmap_type_func)
74 description_visitor->before_enum_bitmap_type_func(type_desc, priv);
75 side_visit_elem(description_visitor, elem_type, priv);
76 if (description_visitor->after_enum_bitmap_type_func)
77 description_visitor->after_enum_bitmap_type_func(type_desc, priv);
78 }
79
80 static
81 void description_visitor_struct(const struct side_description_visitor *description_visitor, const struct side_type *type_desc, void *priv)
82 {
83 const struct side_type_struct *side_struct = side_ptr_get(type_desc->u.side_struct);
84 uint32_t i, len = side_struct->nr_fields;
85
86 if (description_visitor->before_struct_type_func)
87 description_visitor->before_struct_type_func(side_struct, priv);
88 for (i = 0; i < len; i++)
89 side_visit_field(description_visitor, &side_ptr_get(side_struct->fields)[i], priv);
90 if (description_visitor->after_struct_type_func)
91 description_visitor->after_struct_type_func(side_struct, priv);
92 }
93
94 static
95 void description_visitor_variant(const struct side_description_visitor *description_visitor, const struct side_type *type_desc, void *priv)
96 {
97 const struct side_type_variant *side_type_variant = side_ptr_get(type_desc->u.side_variant);
98 const struct side_type *selector_type = &side_type_variant->selector;
99 uint32_t i, len = side_type_variant->nr_options;
100
101 switch (side_enum_get(selector_type->type)) {
102 case SIDE_TYPE_U8:
103 case SIDE_TYPE_U16:
104 case SIDE_TYPE_U32:
105 case SIDE_TYPE_U64:
106 case SIDE_TYPE_U128:
107 case SIDE_TYPE_S8:
108 case SIDE_TYPE_S16:
109 case SIDE_TYPE_S32:
110 case SIDE_TYPE_S64:
111 case SIDE_TYPE_S128:
112 break;
113 default:
114 fprintf(stderr, "ERROR: Expecting integer variant selector type\n");
115 abort();
116 }
117 if (description_visitor->before_variant_type_func)
118 description_visitor->before_variant_type_func(side_type_variant, priv);
119 for (i = 0; i < len; i++)
120 side_visit_option(description_visitor, &side_ptr_get(side_type_variant->options)[i], priv);
121 if (description_visitor->after_variant_type_func)
122 description_visitor->after_variant_type_func(side_type_variant, priv);
123 }
124
125 static
126 void description_visitor_array(const struct side_description_visitor *description_visitor, const struct side_type *type_desc, void *priv)
127 {
128 if (description_visitor->before_array_type_func)
129 description_visitor->before_array_type_func(&type_desc->u.side_array, priv);
130 side_visit_elem(description_visitor, side_ptr_get(type_desc->u.side_array.elem_type), priv);
131 if (description_visitor->after_array_type_func)
132 description_visitor->after_array_type_func(&type_desc->u.side_array, priv);
133 }
134
135 static
136 void description_visitor_vla(const struct side_description_visitor *description_visitor, const struct side_type *type_desc, void *priv)
137 {
138 if (description_visitor->before_vla_type_func)
139 description_visitor->before_vla_type_func(&type_desc->u.side_vla, priv);
140 side_visit_elem(description_visitor, side_ptr_get(type_desc->u.side_vla.length_type), priv);
141 if (description_visitor->after_length_vla_type_func)
142 description_visitor->after_length_vla_type_func(&type_desc->u.side_vla, priv);
143 side_visit_elem(description_visitor, side_ptr_get(type_desc->u.side_vla.elem_type), priv);
144 if (description_visitor->after_element_vla_type_func)
145 description_visitor->after_element_vla_type_func(&type_desc->u.side_vla, priv);
146 }
147
148 static
149 void description_visitor_vla_visitor(const struct side_description_visitor *description_visitor, const struct side_type *type_desc, void *priv)
150 {
151 if (description_visitor->before_vla_visitor_type_func)
152 description_visitor->before_vla_visitor_type_func(side_ptr_get(type_desc->u.side_vla_visitor), priv);
153 side_visit_elem(description_visitor, side_ptr_get(side_ptr_get(type_desc->u.side_vla_visitor)->length_type), priv);
154 if (description_visitor->after_length_vla_visitor_type_func)
155 description_visitor->after_length_vla_visitor_type_func(side_ptr_get(type_desc->u.side_vla_visitor), priv);
156 side_visit_elem(description_visitor, side_ptr_get(side_ptr_get(type_desc->u.side_vla_visitor)->elem_type), priv);
157 if (description_visitor->after_element_vla_visitor_type_func)
158 description_visitor->after_element_vla_visitor_type_func(side_ptr_get(type_desc->u.side_vla_visitor), priv);
159 }
160
161 static
162 void visit_gather_field(const struct side_description_visitor *description_visitor, const struct side_event_field *field, void *priv)
163 {
164 if (description_visitor->before_field_func)
165 description_visitor->before_field_func(field, priv);
166 (void) visit_gather_type(description_visitor, &field->side_type, priv);
167 if (description_visitor->after_field_func)
168 description_visitor->after_field_func(field, priv);
169 }
170
171 static
172 void description_visitor_gather_struct(const struct side_description_visitor *description_visitor, const struct side_type_gather *type_gather, void *priv)
173 {
174 const struct side_type_gather_struct *side_gather_struct = &type_gather->u.side_struct;
175 const struct side_type_struct *side_struct = side_ptr_get(side_gather_struct->type);
176 uint32_t i;
177
178 if (description_visitor->before_gather_struct_type_func)
179 description_visitor->before_gather_struct_type_func(side_gather_struct, priv);
180 for (i = 0; i < side_struct->nr_fields; i++)
181 visit_gather_field(description_visitor, &side_ptr_get(side_struct->fields)[i], priv);
182 if (description_visitor->after_gather_struct_type_func)
183 description_visitor->after_gather_struct_type_func(side_gather_struct, priv);
184 }
185
186 static
187 void description_visitor_gather_array(const struct side_description_visitor *description_visitor, const struct side_type_gather *type_gather, void *priv)
188 {
189 const struct side_type_gather_array *side_gather_array = &type_gather->u.side_array;
190 const struct side_type_array *side_array = &side_gather_array->type;
191 const struct side_type *elem_type = side_ptr_get(side_array->elem_type);
192
193 if (description_visitor->before_gather_array_type_func)
194 description_visitor->before_gather_array_type_func(side_gather_array, priv);
195 switch (side_enum_get(elem_type->type)) {
196 case SIDE_TYPE_GATHER_VLA:
197 fprintf(stderr, "<gather VLA only supported within gather structures>\n");
198 abort();
199 default:
200 break;
201 }
202 visit_gather_elem(description_visitor, elem_type, priv);
203 if (description_visitor->after_gather_array_type_func)
204 description_visitor->after_gather_array_type_func(side_gather_array, priv);
205 }
206
207 static
208 void description_visitor_gather_vla(const struct side_description_visitor *description_visitor, const struct side_type_gather *type_gather, void *priv)
209 {
210 const struct side_type_gather_vla *side_gather_vla = &type_gather->u.side_vla;
211 const struct side_type_vla *side_vla = &side_gather_vla->type;
212 const struct side_type *length_type = side_ptr_get(side_gather_vla->type.length_type);
213 const struct side_type *elem_type = side_ptr_get(side_vla->elem_type);
214
215 /* Access length */
216 switch (side_enum_get(length_type->type)) {
217 case SIDE_TYPE_GATHER_INTEGER:
218 break;
219 default:
220 fprintf(stderr, "<gather VLA expects integer gather length type>\n");
221 abort();
222 }
223 switch (side_enum_get(elem_type->type)) {
224 case SIDE_TYPE_GATHER_VLA:
225 fprintf(stderr, "<gather VLA only supported within gather structures>\n");
226 abort();
227 default:
228 break;
229 }
230 if (description_visitor->before_gather_vla_type_func)
231 description_visitor->before_gather_vla_type_func(side_gather_vla, priv);
232 visit_gather_elem(description_visitor, length_type, priv);
233 if (description_visitor->after_length_gather_vla_type_func)
234 description_visitor->after_length_gather_vla_type_func(side_gather_vla, priv);
235 visit_gather_elem(description_visitor, elem_type, priv);
236 if (description_visitor->after_element_gather_vla_type_func)
237 description_visitor->after_element_gather_vla_type_func(side_gather_vla, priv);
238 }
239
240 static
241 void description_visitor_gather_bool(const struct side_description_visitor *description_visitor, const struct side_type_gather *type_gather, void *priv)
242 {
243 if (description_visitor->gather_bool_type_func)
244 description_visitor->gather_bool_type_func(&type_gather->u.side_bool, priv);
245 }
246
247 static
248 void description_visitor_gather_byte(const struct side_description_visitor *description_visitor, const struct side_type_gather *type_gather, void *priv)
249 {
250 if (description_visitor->gather_byte_type_func)
251 description_visitor->gather_byte_type_func(&type_gather->u.side_byte, priv);
252 }
253
254 static
255 void description_visitor_gather_integer(const struct side_description_visitor *description_visitor, const struct side_type_gather *type_gather,
256 enum side_type_label integer_type, void *priv)
257 {
258 switch (integer_type) {
259 case SIDE_TYPE_GATHER_INTEGER:
260 if (description_visitor->gather_integer_type_func)
261 description_visitor->gather_integer_type_func(&type_gather->u.side_integer, priv);
262 break;
263 case SIDE_TYPE_GATHER_POINTER:
264 if (description_visitor->gather_pointer_type_func)
265 description_visitor->gather_pointer_type_func(&type_gather->u.side_integer, priv);
266 break;
267 default:
268 fprintf(stderr, "Unexpected integer type\n");
269 abort();
270 }
271 }
272
273 static
274 void description_visitor_gather_float(const struct side_description_visitor *description_visitor, const struct side_type_gather *type_gather, void *priv)
275 {
276 if (description_visitor->gather_float_type_func)
277 description_visitor->gather_float_type_func(&type_gather->u.side_float, priv);
278 }
279
280 static
281 void description_visitor_gather_string(const struct side_description_visitor *description_visitor, const struct side_type_gather *type_gather, void *priv)
282 {
283
284 if (description_visitor->gather_string_type_func)
285 description_visitor->gather_string_type_func(&type_gather->u.side_string, priv);
286 }
287
288 static
289 void visit_gather_type(const struct side_description_visitor *description_visitor, const struct side_type *type_desc, void *priv)
290 {
291 switch (side_enum_get(type_desc->type)) {
292 /* Gather basic types */
293 case SIDE_TYPE_GATHER_BOOL:
294 description_visitor_gather_bool(description_visitor, &type_desc->u.side_gather, priv);
295 break;
296 case SIDE_TYPE_GATHER_INTEGER:
297 description_visitor_gather_integer(description_visitor, &type_desc->u.side_gather, SIDE_TYPE_GATHER_INTEGER, priv);
298 break;
299 case SIDE_TYPE_GATHER_BYTE:
300 description_visitor_gather_byte(description_visitor, &type_desc->u.side_gather, priv);
301 break;
302 case SIDE_TYPE_GATHER_POINTER:
303 description_visitor_gather_integer(description_visitor, &type_desc->u.side_gather, SIDE_TYPE_GATHER_POINTER, priv);
304 break;
305 case SIDE_TYPE_GATHER_FLOAT:
306 description_visitor_gather_float(description_visitor, &type_desc->u.side_gather, priv);
307 break;
308 case SIDE_TYPE_GATHER_STRING:
309 description_visitor_gather_string(description_visitor, &type_desc->u.side_gather, priv);
310 break;
311
312 /* Gather enumeration types */
313 case SIDE_TYPE_GATHER_ENUM:
314 description_visitor_gather_enum(description_visitor, &type_desc->u.side_gather, priv);
315 break;
316
317 /* Gather compound types */
318 case SIDE_TYPE_GATHER_STRUCT:
319 description_visitor_gather_struct(description_visitor, &type_desc->u.side_gather, priv);
320 break;
321 case SIDE_TYPE_GATHER_ARRAY:
322 description_visitor_gather_array(description_visitor, &type_desc->u.side_gather, priv);
323 break;
324 case SIDE_TYPE_GATHER_VLA:
325 description_visitor_gather_vla(description_visitor, &type_desc->u.side_gather, priv);
326 break;
327 default:
328 fprintf(stderr, "<UNKNOWN GATHER TYPE>");
329 abort();
330 }
331 }
332
333 static
334 void visit_gather_elem(const struct side_description_visitor *description_visitor, const struct side_type *type_desc, void *priv)
335 {
336 if (description_visitor->before_elem_func)
337 description_visitor->before_elem_func(type_desc, priv);
338 visit_gather_type(description_visitor, type_desc, priv);
339 if (description_visitor->after_elem_func)
340 description_visitor->after_elem_func(type_desc, priv);
341 }
342
343 static
344 void description_visitor_gather_enum(const struct side_description_visitor *description_visitor, const struct side_type_gather *type_gather, void *priv)
345 {
346 const struct side_type *elem_type = side_ptr_get(type_gather->u.side_enum.elem_type);
347
348 if (description_visitor->before_gather_enum_type_func)
349 description_visitor->before_gather_enum_type_func(&type_gather->u.side_enum, priv);
350 side_visit_elem(description_visitor, elem_type, priv);
351 if (description_visitor->after_gather_enum_type_func)
352 description_visitor->after_gather_enum_type_func(&type_gather->u.side_enum, priv);
353 }
354
355 static
356 void side_visit_type(const struct side_description_visitor *description_visitor,
357 const struct side_type *type_desc, void *priv)
358 {
359 enum side_type_label type = side_enum_get(type_desc->type);
360
361 switch (type) {
362 /* Stack-copy basic types */
363 case SIDE_TYPE_NULL:
364 if (description_visitor->null_type_func)
365 description_visitor->null_type_func(type_desc, priv);
366 break;
367 case SIDE_TYPE_BOOL:
368 if (description_visitor->bool_type_func)
369 description_visitor->bool_type_func(type_desc, priv);
370 break;
371 case SIDE_TYPE_U8: /* Fallthrough */
372 case SIDE_TYPE_U16: /* Fallthrough */
373 case SIDE_TYPE_U32: /* Fallthrough */
374 case SIDE_TYPE_U64: /* Fallthrough */
375 case SIDE_TYPE_U128: /* Fallthrough */
376 case SIDE_TYPE_S8: /* Fallthrough */
377 case SIDE_TYPE_S16: /* Fallthrough */
378 case SIDE_TYPE_S32: /* Fallthrough */
379 case SIDE_TYPE_S64: /* Fallthrough */
380 case SIDE_TYPE_S128:
381 if (description_visitor->integer_type_func)
382 description_visitor->integer_type_func(type_desc, priv);
383 break;
384 case SIDE_TYPE_BYTE:
385 if (description_visitor->byte_type_func)
386 description_visitor->byte_type_func(type_desc, priv);
387 break;
388 case SIDE_TYPE_POINTER:
389 if (description_visitor->pointer_type_func)
390 description_visitor->pointer_type_func(type_desc, priv);
391 break;
392 case SIDE_TYPE_FLOAT_BINARY16: /* Fallthrough */
393 case SIDE_TYPE_FLOAT_BINARY32: /* Fallthrough */
394 case SIDE_TYPE_FLOAT_BINARY64: /* Fallthrough */
395 case SIDE_TYPE_FLOAT_BINARY128:
396 if (description_visitor->float_type_func)
397 description_visitor->float_type_func(type_desc, priv);
398 break;
399 case SIDE_TYPE_STRING_UTF8: /* Fallthrough */
400 case SIDE_TYPE_STRING_UTF16: /* Fallthrough */
401 case SIDE_TYPE_STRING_UTF32:
402 if (description_visitor->string_type_func)
403 description_visitor->string_type_func(type_desc, priv);
404 break;
405 case SIDE_TYPE_ENUM:
406 description_visitor_enum(description_visitor, type_desc, priv);
407 break;
408 case SIDE_TYPE_ENUM_BITMAP:
409 description_visitor_enum_bitmap(description_visitor, type_desc, priv);
410 break;
411
412 /* Stack-copy compound types */
413 case SIDE_TYPE_STRUCT:
414 description_visitor_struct(description_visitor, type_desc, priv);
415 break;
416 case SIDE_TYPE_VARIANT:
417 description_visitor_variant(description_visitor, type_desc, priv);
418 break;
419 case SIDE_TYPE_ARRAY:
420 description_visitor_array(description_visitor, type_desc, priv);
421 break;
422 case SIDE_TYPE_VLA:
423 description_visitor_vla(description_visitor, type_desc, priv);
424 break;
425 case SIDE_TYPE_VLA_VISITOR:
426 description_visitor_vla_visitor(description_visitor, type_desc, priv);
427 break;
428
429 /* Gather basic types */
430 case SIDE_TYPE_GATHER_BOOL:
431 description_visitor_gather_bool(description_visitor, &type_desc->u.side_gather, priv);
432 break;
433 case SIDE_TYPE_GATHER_INTEGER:
434 description_visitor_gather_integer(description_visitor, &type_desc->u.side_gather, SIDE_TYPE_GATHER_INTEGER, priv);
435 break;
436 case SIDE_TYPE_GATHER_BYTE:
437 description_visitor_gather_byte(description_visitor, &type_desc->u.side_gather, priv);
438 break;
439 case SIDE_TYPE_GATHER_POINTER:
440 description_visitor_gather_integer(description_visitor, &type_desc->u.side_gather, SIDE_TYPE_GATHER_POINTER, priv);
441 break;
442 case SIDE_TYPE_GATHER_FLOAT:
443 description_visitor_gather_float(description_visitor, &type_desc->u.side_gather, priv);
444 break;
445 case SIDE_TYPE_GATHER_STRING:
446 description_visitor_gather_string(description_visitor, &type_desc->u.side_gather, priv);
447 break;
448
449 /* Gather compound type */
450 case SIDE_TYPE_GATHER_STRUCT:
451 description_visitor_gather_struct(description_visitor, &type_desc->u.side_gather, priv);
452 break;
453 case SIDE_TYPE_GATHER_ARRAY:
454 description_visitor_gather_array(description_visitor, &type_desc->u.side_gather, priv);
455 break;
456 case SIDE_TYPE_GATHER_VLA:
457 description_visitor_gather_vla(description_visitor, &type_desc->u.side_gather, priv);
458 break;
459
460 /* Gather enumeration types */
461 case SIDE_TYPE_GATHER_ENUM:
462 description_visitor_gather_enum(description_visitor, &type_desc->u.side_gather, priv);
463 break;
464
465 /* Dynamic type */
466 case SIDE_TYPE_DYNAMIC:
467 if (description_visitor->dynamic_type_func)
468 description_visitor->dynamic_type_func(type_desc, priv);
469 break;
470
471 default:
472 fprintf(stderr, "<UNKNOWN TYPE>\n");
473 abort();
474 }
475 }
476
477 void description_visitor_event(const struct side_description_visitor *description_visitor,
478 const struct side_event_description *desc, void *priv)
479 {
480 uint32_t i, len = desc->nr_fields;
481
482 if (description_visitor->before_event_func)
483 description_visitor->before_event_func(desc, priv);
484 if (len) {
485 if (description_visitor->before_static_fields_func)
486 description_visitor->before_static_fields_func(desc, priv);
487 for (i = 0; i < len; i++)
488 side_visit_field(description_visitor, &side_ptr_get(desc->fields)[i], priv);
489 if (description_visitor->after_static_fields_func)
490 description_visitor->after_static_fields_func(desc, priv);
491 }
492 if (description_visitor->after_event_func)
493 description_visitor->after_event_func(desc, priv);
494 }
This page took 0.039385 seconds and 5 git commands to generate.