9d1de5016d60741f5fa5ebc53c1dd7b06739d721
[babeltrace.git] / src / plugins / ctf / common / metadata / ctf-meta-update-text-array-sequence.c
1 /*
2 * Copyright 2018 - Philippe Proulx <pproulx@efficios.com>
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a copy
5 * of this software and associated documentation files (the "Software"), to deal
6 * in the Software without restriction, including without limitation the rights
7 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8 * copies of the Software, and to permit persons to whom the Software is
9 * furnished to do so, subject to the following conditions:
10 *
11 * The above copyright notice and this permission notice shall be included in
12 * all copies or substantial portions of the Software.
13 */
14
15 #include <babeltrace2/babeltrace.h>
16 #include "common/macros.h"
17 #include "common/assert.h"
18 #include <glib.h>
19 #include <stdint.h>
20 #include <string.h>
21 #include <inttypes.h>
22
23 #include "ctf-meta-visitors.h"
24
25 static inline
26 int set_text_array_sequence_field_class(struct ctf_field_class *fc)
27 {
28 int ret = 0;
29 uint64_t i;
30
31 if (!fc) {
32 goto end;
33 }
34
35 switch (fc->type) {
36 case CTF_FIELD_CLASS_TYPE_STRUCT:
37 {
38 struct ctf_field_class_struct *struct_fc = (void *) fc;
39
40 for (i = 0; i < struct_fc->members->len; i++) {
41 struct ctf_named_field_class *named_fc =
42 ctf_field_class_struct_borrow_member_by_index(
43 struct_fc, i);
44
45 ret = set_text_array_sequence_field_class(named_fc->fc);
46 if (ret) {
47 goto end;
48 }
49 }
50
51 break;
52 }
53 case CTF_FIELD_CLASS_TYPE_VARIANT:
54 {
55 struct ctf_field_class_variant *var_fc = (void *) fc;
56
57 for (i = 0; i < var_fc->options->len; i++) {
58 struct ctf_named_field_class *named_fc =
59 ctf_field_class_variant_borrow_option_by_index(
60 var_fc, i);
61
62 ret = set_text_array_sequence_field_class(named_fc->fc);
63 if (ret) {
64 goto end;
65 }
66 }
67
68 break;
69 }
70 case CTF_FIELD_CLASS_TYPE_ARRAY:
71 case CTF_FIELD_CLASS_TYPE_SEQUENCE:
72 {
73 struct ctf_field_class_array_base *array_fc = (void *) fc;
74
75 if (array_fc->elem_fc->type == CTF_FIELD_CLASS_TYPE_INT ||
76 array_fc->elem_fc->type == CTF_FIELD_CLASS_TYPE_ENUM) {
77 struct ctf_field_class_int *int_fc =
78 (void *) array_fc->elem_fc;
79
80 if (int_fc->base.base.alignment == 8 &&
81 int_fc->base.size == 8 &&
82 int_fc->encoding == CTF_ENCODING_UTF8) {
83 array_fc->is_text = true;
84
85 /*
86 * Force integer element to be unsigned;
87 * this makes the decoder enter a single
88 * path when reading a text
89 * array/sequence and we can safely
90 * decode bytes as characters anyway.
91 */
92 int_fc->is_signed = false;
93 }
94 }
95
96 ret = set_text_array_sequence_field_class(array_fc->elem_fc);
97 if (ret) {
98 goto end;
99 }
100
101 break;
102 }
103 default:
104 break;
105 }
106
107 end:
108 return ret;
109 }
110
111 BT_HIDDEN
112 int ctf_trace_class_update_text_array_sequence(struct ctf_trace_class *ctf_tc)
113 {
114 int ret = 0;
115 uint64_t i;
116
117 if (!ctf_tc->is_translated) {
118 ret = set_text_array_sequence_field_class(
119 ctf_tc->packet_header_fc);
120 if (ret) {
121 goto end;
122 }
123 }
124
125 for (i = 0; i < ctf_tc->stream_classes->len; i++) {
126 struct ctf_stream_class *sc = ctf_tc->stream_classes->pdata[i];
127 uint64_t j;
128
129 if (!sc->is_translated) {
130 ret = set_text_array_sequence_field_class(
131 sc->packet_context_fc);
132 if (ret) {
133 goto end;
134 }
135
136 ret = set_text_array_sequence_field_class(
137 sc->event_header_fc);
138 if (ret) {
139 goto end;
140 }
141
142 ret = set_text_array_sequence_field_class(
143 sc->event_common_context_fc);
144 if (ret) {
145 goto end;
146 }
147 }
148
149 for (j = 0; j < sc->event_classes->len; j++) {
150 struct ctf_event_class *ec =
151 sc->event_classes->pdata[j];
152
153 if (ec->is_translated) {
154 continue;
155 }
156
157 ret = set_text_array_sequence_field_class(
158 ec->spec_context_fc);
159 if (ret) {
160 goto end;
161 }
162
163 ret = set_text_array_sequence_field_class(
164 ec->payload_fc);
165 if (ret) {
166 goto end;
167 }
168 }
169 }
170
171 end:
172 return ret;
173 }
This page took 0.032517 seconds and 4 git commands to generate.