Revert "Remove leading underscores from identifiers directly in lexer"
[babeltrace.git] / formats / ctf / metadata / ctf-visitor-parent-links.c
CommitLineData
67905e42
MD
1/*
2 * ctf-visitor-parent-links.c
3 *
4 * Common Trace Format Metadata Parent Link Creator.
5 *
6 * Copyright 2010 - Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
7 *
8 * Permission is hereby granted, free of charge, to any person obtaining a copy
9 * of this software and associated documentation files (the "Software"), to deal
10 * in the Software without restriction, including without limitation the rights
11 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12 * copies of the Software, and to permit persons to whom the Software is
13 * furnished to do so, subject to the following conditions:
14 *
15 * The above copyright notice and this permission notice shall be included in
16 * all copies or substantial portions of the Software.
17 */
18
19#include <stdio.h>
20#include <unistd.h>
21#include <string.h>
22#include <stdlib.h>
23#include <assert.h>
24#include <glib.h>
25#include <inttypes.h>
26#include <errno.h>
70bd0a12 27#include <babeltrace/babeltrace-internal.h>
67905e42
MD
28#include <babeltrace/list.h>
29#include "ctf-scanner.h"
30#include "ctf-parser.h"
31#include "ctf-ast.h"
32
34f7b02c 33#define fprintf_dbg(fd, fmt, args...) fprintf(fd, "%s: " fmt, __func__, ## args)
67905e42
MD
34
35static
36int ctf_visitor_unary_expression(FILE *fd, int depth, struct ctf_node *node)
37{
38 int ret = 0;
39
40 switch (node->u.unary_expression.link) {
41 case UNARY_LINK_UNKNOWN:
42 case UNARY_DOTLINK:
43 case UNARY_ARROWLINK:
44 case UNARY_DOTDOTDOT:
45 break;
46 default:
47 fprintf(fd, "[error] %s: unknown expression link type %d\n", __func__,
48 (int) node->u.unary_expression.link);
49 return -EINVAL;
50 }
51
52 switch (node->u.unary_expression.type) {
53 case UNARY_STRING:
54 case UNARY_SIGNED_CONSTANT:
55 case UNARY_UNSIGNED_CONSTANT:
56 break;
57 case UNARY_SBRAC:
58 node->u.unary_expression.u.sbrac_exp->parent = node;
59 ret = ctf_visitor_unary_expression(fd, depth + 1,
60 node->u.unary_expression.u.sbrac_exp);
61 if (ret)
62 return ret;
63 break;
64 case UNARY_NESTED:
65 node->u.unary_expression.u.nested_exp->parent = node;
66 ret = ctf_visitor_unary_expression(fd, depth + 1,
67 node->u.unary_expression.u.nested_exp);
68 if (ret)
69 return ret;
70 break;
71
72 case UNARY_UNKNOWN:
73 default:
74 fprintf(fd, "[error] %s: unknown expression type %d\n", __func__,
75 (int) node->u.unary_expression.type);
76 return -EINVAL;
77 }
78 return 0;
79}
80
81static
82int ctf_visitor_type_specifier(FILE *fd, int depth, struct ctf_node *node)
83{
3e11b713
MD
84 int ret;
85
67905e42
MD
86 switch (node->u.type_specifier.type) {
87 case TYPESPEC_VOID:
88 case TYPESPEC_CHAR:
89 case TYPESPEC_SHORT:
90 case TYPESPEC_INT:
91 case TYPESPEC_LONG:
92 case TYPESPEC_FLOAT:
93 case TYPESPEC_DOUBLE:
94 case TYPESPEC_SIGNED:
95 case TYPESPEC_UNSIGNED:
96 case TYPESPEC_BOOL:
97 case TYPESPEC_COMPLEX:
3888a159 98 case TYPESPEC_IMAGINARY:
67905e42
MD
99 case TYPESPEC_CONST:
100 case TYPESPEC_ID_TYPE:
101 break;
3e11b713
MD
102 case TYPESPEC_FLOATING_POINT:
103 case TYPESPEC_INTEGER:
104 case TYPESPEC_STRING:
105 case TYPESPEC_STRUCT:
106 case TYPESPEC_VARIANT:
107 case TYPESPEC_ENUM:
108 node->u.type_specifier.node->parent = node;
109 ret = ctf_visitor_parent_links(fd, depth + 1, node->u.type_specifier.node);
110 if (ret)
111 return ret;
112 break;
67905e42
MD
113
114 case TYPESPEC_UNKNOWN:
115 default:
116 fprintf(fd, "[error] %s: unknown type specifier %d\n", __func__,
117 (int) node->u.type_specifier.type);
118 return -EINVAL;
119 }
120 return 0;
121}
122
123static
124int ctf_visitor_type_declarator(FILE *fd, int depth, struct ctf_node *node)
125{
126 int ret = 0;
127 struct ctf_node *iter;
128
129 depth++;
130
98df1c9f
MD
131 cds_list_for_each_entry(iter, &node->u.type_declarator.pointers,
132 siblings) {
133 iter->parent = node;
134 ret = ctf_visitor_parent_links(fd, depth + 1, iter);
135 if (ret)
136 return ret;
67905e42
MD
137 }
138
139 switch (node->u.type_declarator.type) {
140 case TYPEDEC_ID:
141 break;
142 case TYPEDEC_NESTED:
143 if (node->u.type_declarator.u.nested.type_declarator) {
144 node->u.type_declarator.u.nested.type_declarator->parent = node;
145 ret = ctf_visitor_parent_links(fd, depth + 1,
146 node->u.type_declarator.u.nested.type_declarator);
147 if (ret)
148 return ret;
149 }
7c7835b0
MD
150 if (!node->u.type_declarator.u.nested.abstract_array) {
151 cds_list_for_each_entry(iter, &node->u.type_declarator.u.nested.length,
152 siblings) {
153 iter->parent = node;
154 ret = ctf_visitor_parent_links(fd, depth + 1, iter);
155 if (ret)
156 return ret;
157 }
67905e42
MD
158 }
159 if (node->u.type_declarator.bitfield_len) {
160 node->u.type_declarator.bitfield_len = node;
161 ret = ctf_visitor_parent_links(fd, depth + 1,
162 node->u.type_declarator.bitfield_len);
163 if (ret)
164 return ret;
165 }
166 break;
167 case TYPEDEC_UNKNOWN:
168 default:
169 fprintf(fd, "[error] %s: unknown type declarator %d\n", __func__,
170 (int) node->u.type_declarator.type);
171 return -EINVAL;
172 }
173 depth--;
174 return 0;
175}
176
177int ctf_visitor_parent_links(FILE *fd, int depth, struct ctf_node *node)
178{
179 int ret = 0;
180 struct ctf_node *iter;
181
182 switch (node->type) {
183 case NODE_ROOT:
3e11b713 184 cds_list_for_each_entry(iter, &node->u.root.declaration_list, siblings) {
67905e42
MD
185 iter->parent = node;
186 ret = ctf_visitor_parent_links(fd, depth + 1, iter);
187 if (ret)
188 return ret;
189 }
190 cds_list_for_each_entry(iter, &node->u.root.trace, siblings) {
191 iter->parent = node;
192 ret = ctf_visitor_parent_links(fd, depth + 1, iter);
193 if (ret)
194 return ret;
195 }
196 cds_list_for_each_entry(iter, &node->u.root.stream, siblings) {
197 iter->parent = node;
198 ret = ctf_visitor_parent_links(fd, depth + 1, iter);
199 if (ret)
200 return ret;
201 }
202 cds_list_for_each_entry(iter, &node->u.root.event, siblings) {
203 iter->parent = node;
204 ret = ctf_visitor_parent_links(fd, depth + 1, iter);
205 if (ret)
206 return ret;
207 }
73d15916
MD
208 cds_list_for_each_entry(iter, &node->u.root.clock, siblings) {
209 iter->parent = node;
210 ret = ctf_visitor_parent_links(fd, depth + 1, iter);
211 if (ret)
212 return ret;
213 }
67905e42
MD
214 break;
215
216 case NODE_EVENT:
217 cds_list_for_each_entry(iter, &node->u.event.declaration_list, siblings) {
218 iter->parent = node;
219 ret = ctf_visitor_parent_links(fd, depth + 1, iter);
220 if (ret)
221 return ret;
222 }
223 break;
224 case NODE_STREAM:
225 cds_list_for_each_entry(iter, &node->u.stream.declaration_list, siblings) {
226 iter->parent = node;
227 ret = ctf_visitor_parent_links(fd, depth + 1, iter);
228 if (ret)
229 return ret;
230 }
231 break;
232 case NODE_TRACE:
233 cds_list_for_each_entry(iter, &node->u.trace.declaration_list, siblings) {
234 iter->parent = node;
235 ret = ctf_visitor_parent_links(fd, depth + 1, iter);
236 if (ret)
237 return ret;
238 }
239 break;
73d15916
MD
240 case NODE_CLOCK:
241 cds_list_for_each_entry(iter, &node->u.clock.declaration_list, siblings) {
242 iter->parent = node;
243 ret = ctf_visitor_parent_links(fd, depth + 1, iter);
244 if (ret)
245 return ret;
246 }
247 break;
67905e42
MD
248
249 case NODE_CTF_EXPRESSION:
250 depth++;
251 cds_list_for_each_entry(iter, &node->u.ctf_expression.left, siblings) {
252 iter->parent = node;
253 ret = ctf_visitor_parent_links(fd, depth + 1, iter);
254 if (ret)
255 return ret;
256 }
257 cds_list_for_each_entry(iter, &node->u.ctf_expression.right, siblings) {
258 iter->parent = node;
259 ret = ctf_visitor_parent_links(fd, depth + 1, iter);
260 if (ret)
261 return ret;
262 }
263 depth--;
264 break;
265 case NODE_UNARY_EXPRESSION:
266 return ctf_visitor_unary_expression(fd, depth, node);
267
268 case NODE_TYPEDEF:
269 depth++;
3e11b713
MD
270 node->u._typedef.type_specifier_list->parent = node;
271 ret = ctf_visitor_parent_links(fd, depth + 1, node->u._typedef.type_specifier_list);
272 if (ret)
273 return ret;
67905e42
MD
274 cds_list_for_each_entry(iter, &node->u._typedef.type_declarators, siblings) {
275 iter->parent = node;
276 ret = ctf_visitor_parent_links(fd, depth + 1, iter);
277 if (ret)
278 return ret;
279 }
280 depth--;
281 break;
282 case NODE_TYPEALIAS_TARGET:
283 depth++;
3e11b713
MD
284 node->u.typealias_target.type_specifier_list->parent = node;
285 ret = ctf_visitor_parent_links(fd, depth + 1, node->u.typealias_target.type_specifier_list);
286 if (ret)
287 return ret;
67905e42
MD
288 cds_list_for_each_entry(iter, &node->u.typealias_target.type_declarators, siblings) {
289 iter->parent = node;
290 ret = ctf_visitor_parent_links(fd, depth + 1, iter);
291 if (ret)
292 return ret;
293 }
294 depth--;
295 break;
296 case NODE_TYPEALIAS_ALIAS:
297 depth++;
3e11b713
MD
298 node->u.typealias_alias.type_specifier_list->parent = node;
299 ret = ctf_visitor_parent_links(fd, depth + 1, node->u.typealias_alias.type_specifier_list);
300 if (ret)
301 return ret;
67905e42
MD
302 cds_list_for_each_entry(iter, &node->u.typealias_alias.type_declarators, siblings) {
303 iter->parent = node;
304 ret = ctf_visitor_parent_links(fd, depth + 1, iter);
305 if (ret)
306 return ret;
307 }
308 depth--;
309 break;
310 case NODE_TYPEALIAS:
311 node->u.typealias.target->parent = node;
312 ret = ctf_visitor_parent_links(fd, depth + 1, node->u.typealias.target);
313 if (ret)
314 return ret;
315 node->u.typealias.alias->parent = node;
316 ret = ctf_visitor_parent_links(fd, depth + 1, node->u.typealias.alias);
317 if (ret)
318 return ret;
319 break;
320
3e11b713
MD
321 case NODE_TYPE_SPECIFIER_LIST:
322 cds_list_for_each_entry(iter, &node->u.type_specifier_list.head, siblings) {
323 iter->parent = node;
324 ret = ctf_visitor_parent_links(fd, depth + 1, iter);
325 if (ret)
326 return ret;
327 }
328 break;
329
67905e42
MD
330 case NODE_TYPE_SPECIFIER:
331 ret = ctf_visitor_type_specifier(fd, depth, node);
332 if (ret)
333 return ret;
334 break;
335 case NODE_POINTER:
336 break;
337 case NODE_TYPE_DECLARATOR:
338 ret = ctf_visitor_type_declarator(fd, depth, node);
339 if (ret)
340 return ret;
341 break;
342
343 case NODE_FLOATING_POINT:
344 cds_list_for_each_entry(iter, &node->u.floating_point.expressions, siblings) {
345 iter->parent = node;
346 ret = ctf_visitor_parent_links(fd, depth + 1, iter);
347 if (ret)
348 return ret;
349 }
350 break;
351 case NODE_INTEGER:
352 cds_list_for_each_entry(iter, &node->u.integer.expressions, siblings) {
353 iter->parent = node;
354 ret = ctf_visitor_parent_links(fd, depth + 1, iter);
355 if (ret)
356 return ret;
357 }
358 break;
359 case NODE_STRING:
360 cds_list_for_each_entry(iter, &node->u.string.expressions, siblings) {
361 iter->parent = node;
362 ret = ctf_visitor_parent_links(fd, depth + 1, iter);
363 if (ret)
364 return ret;
365 }
366 break;
367 case NODE_ENUMERATOR:
67905e42
MD
368 cds_list_for_each_entry(iter, &node->u.enumerator.values, siblings) {
369 iter->parent = node;
370 ret = ctf_visitor_parent_links(fd, depth + 1, iter);
371 if (ret)
372 return ret;
373 }
374 break;
375 case NODE_ENUM:
67905e42 376 depth++;
6743829a
MD
377 if (node->u._enum.container_type) {
378 ret = ctf_visitor_parent_links(fd, depth + 1, node->u._enum.container_type);
379 if (ret)
380 return ret;
381 }
67905e42
MD
382
383 cds_list_for_each_entry(iter, &node->u._enum.enumerator_list, siblings) {
384 iter->parent = node;
385 ret = ctf_visitor_parent_links(fd, depth + 1, iter);
386 if (ret)
387 return ret;
388 }
389 depth--;
390 break;
391 case NODE_STRUCT_OR_VARIANT_DECLARATION:
3e11b713
MD
392 node->u.struct_or_variant_declaration.type_specifier_list->parent = node;
393 ret = ctf_visitor_parent_links(fd, depth + 1,
394 node->u.struct_or_variant_declaration.type_specifier_list);
395 if (ret)
396 return ret;
67905e42
MD
397 cds_list_for_each_entry(iter, &node->u.struct_or_variant_declaration.type_declarators, siblings) {
398 iter->parent = node;
399 ret = ctf_visitor_parent_links(fd, depth + 1, iter);
400 if (ret)
401 return ret;
402 }
403 break;
404 case NODE_VARIANT:
67905e42
MD
405 cds_list_for_each_entry(iter, &node->u.variant.declaration_list, siblings) {
406 iter->parent = node;
407 ret = ctf_visitor_parent_links(fd, depth + 1, iter);
408 if (ret)
409 return ret;
410 }
411 break;
412 case NODE_STRUCT:
413 cds_list_for_each_entry(iter, &node->u._struct.declaration_list, siblings) {
414 iter->parent = node;
415 ret = ctf_visitor_parent_links(fd, depth + 1, iter);
416 if (ret)
417 return ret;
418 }
b7e35bad
MD
419 cds_list_for_each_entry(iter, &node->u._struct.min_align,
420 siblings) {
421 iter->parent = node;
422 ret = ctf_visitor_parent_links(fd, depth + 1, iter);
423 if (ret)
424 return ret;
425 }
67905e42
MD
426 break;
427
428 case NODE_UNKNOWN:
429 default:
430 fprintf(fd, "[error] %s: unknown node type %d\n", __func__,
431 (int) node->type);
432 return -EINVAL;
433 }
434 return ret;
435}
This page took 0.041838 seconds and 4 git commands to generate.