Fix: missing paragraph in python bindings license (MIT)
[babeltrace.git] / bindings / python / python-complements.c
CommitLineData
24a3136a
DS
1/*
2 * python-complements.c
3 *
4 * Babeltrace Python module complements, required for Python bindings
5 *
6 * Copyright 2012 EfficiOS Inc.
7 *
8 * Author: Danny Serres <danny.serres@efficios.com>
9 *
10 * Permission is hereby granted, free of charge, to any person obtaining a copy
11 * of this software and associated documentation files (the "Software"), to deal
12 * in the Software without restriction, including without limitation the rights
13 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
14 * copies of the Software, and to permit persons to whom the Software is
15 * furnished to do so, subject to the following conditions:
16 *
17 * The above copyright notice and this permission notice shall be included in
18 * all copies or substantial portions of the Software.
5aa9939f
JD
19 *
20 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
21 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
22 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
23 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
24 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
25 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
24a3136a
DS
26 */
27
28#include "python-complements.h"
adc315b8
JG
29#include <babeltrace/ctf-ir/event-types-internal.h>
30#include <babeltrace/ctf-ir/event-fields-internal.h>
b4b5e4b5 31#include <babeltrace/ctf-ir/event-types.h>
38f28df6 32#include <babeltrace/ctf-ir/event.h>
da64442f 33#include <babeltrace/ctf-ir/clock-internal.h>
24a3136a
DS
34
35/* List-related functions
36 ----------------------------------------------------
37*/
38
39/* ctf-field-list */
2c0df204 40struct bt_definition **_bt_python_field_listcaller(
24a3136a 41 const struct bt_ctf_event *ctf_event,
cebae8c3
JG
42 const struct bt_definition *scope,
43 unsigned int *len)
24a3136a 44{
2c0df204 45 struct bt_definition **list;
24a3136a
DS
46 int ret;
47
48 ret = bt_ctf_get_field_list(ctf_event, scope,
cebae8c3 49 (const struct bt_definition * const **)&list, len);
24a3136a
DS
50
51 if (ret < 0) /* For python to know an error occured */
52 list = NULL;
24a3136a
DS
53
54 return list;
55}
56
2c0df204
XH
57struct bt_definition *_bt_python_field_one_from_list(
58 struct bt_definition **list, int index)
24a3136a
DS
59{
60 return list[index];
61}
62
63/* event_decl_list */
64struct bt_ctf_event_decl **_bt_python_event_decl_listcaller(
cebae8c3
JG
65 int handle_id,
66 struct bt_context *ctx,
67 unsigned int *len)
24a3136a
DS
68{
69 struct bt_ctf_event_decl **list;
24a3136a
DS
70 int ret;
71
72 ret = bt_ctf_get_event_decl_list(handle_id, ctx,
cebae8c3 73 (struct bt_ctf_event_decl * const **)&list, len);
24a3136a
DS
74
75 if (ret < 0) /* For python to know an error occured */
76 list = NULL;
24a3136a
DS
77
78 return list;
79}
80
81struct bt_ctf_event_decl *_bt_python_decl_one_from_list(
82 struct bt_ctf_event_decl **list, int index)
83{
84 return list[index];
85}
86
87/* decl_fields */
88struct bt_ctf_field_decl **_by_python_field_decl_listcaller(
89 struct bt_ctf_event_decl *event_decl,
cebae8c3
JG
90 enum bt_ctf_scope scope,
91 unsigned int *len)
24a3136a
DS
92{
93 struct bt_ctf_field_decl **list;
24a3136a
DS
94 int ret;
95
96 ret = bt_ctf_get_decl_fields(event_decl, scope,
cebae8c3 97 (const struct bt_ctf_field_decl * const **)&list, len);
24a3136a
DS
98
99 if (ret < 0) /* For python to know an error occured */
100 list = NULL;
24a3136a
DS
101
102 return list;
103}
104
105struct bt_ctf_field_decl *_bt_python_field_decl_one_from_list(
106 struct bt_ctf_field_decl **list, int index)
107{
108 return list[index];
109}
3c2ce778
XH
110
111struct definition_array *_bt_python_get_array_from_def(
112 struct bt_definition *field)
113{
114 const struct bt_declaration *array_decl;
115 struct definition_array *array = NULL;
116
117 if (!field) {
118 goto end;
119 }
120
121 array_decl = bt_ctf_get_decl_from_def(field);
122 if (bt_ctf_field_type(array_decl) == CTF_TYPE_ARRAY) {
123 array = container_of(field, struct definition_array, p);
124 }
125end:
126 return array;
127}
786207e0 128
5792eb34
JG
129struct bt_declaration *_bt_python_get_array_element_declaration(
130 struct bt_declaration *field)
131{
132 struct declaration_array *array_decl;
133 struct bt_declaration *ret = NULL;
134
135 if (!field) {
136 goto end;
137 }
138
139 array_decl = container_of(field, struct declaration_array, p);
140 ret = array_decl->elem;
141end:
142 return ret;
143}
144
3866c850
JG
145struct bt_declaration *_bt_python_get_sequence_element_declaration(
146 struct bt_declaration *field)
147{
148 struct declaration_sequence *sequence_decl;
149 struct bt_declaration *ret = NULL;
150
151 if (!field) {
152 goto end;
153 }
154
155 sequence_decl = container_of(field, struct declaration_sequence, p);
156 ret = sequence_decl->elem;
157end:
158 return ret;
159}
160
5792eb34
JG
161const char *_bt_python_get_array_string(struct bt_definition *field)
162{
163 struct definition_array *array;
164 const char *ret = NULL;
165
166 if (!field) {
167 goto end;
168 }
169
170 array = container_of(field, struct definition_array, p);
171 ret = array->string->str;
172end:
173 return ret;
174}
175
3866c850
JG
176const char *_bt_python_get_sequence_string(struct bt_definition *field)
177{
178 struct definition_sequence *sequence;
179 const char *ret = NULL;
180
181 if (!field) {
182 goto end;
183 }
184
185 sequence = container_of(field, struct definition_sequence, p);
186 ret = sequence->string->str;
187end:
188 return ret;
189}
190
786207e0
XH
191struct definition_sequence *_bt_python_get_sequence_from_def(
192 struct bt_definition *field)
193{
194 if (field && bt_ctf_field_type(
195 bt_ctf_get_decl_from_def(field)) == CTF_TYPE_SEQUENCE) {
196 return container_of(field, struct definition_sequence, p);
197 }
198
199 return NULL;
200}
ec8c88d7
JG
201
202int _bt_python_field_integer_get_signedness(const struct bt_ctf_field *field)
203{
204 int ret;
205
206 if (!field || field->type->declaration->id != CTF_TYPE_INTEGER) {
207 ret = -1;
208 goto end;
209 }
210
211 const struct bt_ctf_field_type_integer *type = container_of(field->type,
212 const struct bt_ctf_field_type_integer, parent);
213 ret = type->declaration.signedness;
214end:
215 return ret;
216}
217
218enum ctf_type_id _bt_python_get_field_type(const struct bt_ctf_field *field)
219{
220 enum ctf_type_id type_id = CTF_TYPE_UNKNOWN;
221
222 if (!field) {
223 goto end;
224 }
225
226 type_id = field->type->declaration->id;
227end:
228 return type_id;
229}
b4b5e4b5
JG
230
231/*
232 * Swig doesn't handle returning pointers via output arguments properly...
233 * These functions only wrap the ctf-ir functions to provide them directly
234 * as regular return values.
235 */
236const char *_bt_python_ctf_field_type_enumeration_get_mapping(
237 struct bt_ctf_field_type *enumeration, size_t index,
238 int64_t *range_start, int64_t *range_end)
239{
240 int ret;
241 const char *name;
242
243 ret = bt_ctf_field_type_enumeration_get_mapping(enumeration, index,
244 &name, range_start, range_end);
245 return !ret ? name : NULL;
246}
247
248const char *_bt_python_ctf_field_type_enumeration_get_mapping_unsigned(
249 struct bt_ctf_field_type *enumeration, size_t index,
250 uint64_t *range_start, uint64_t *range_end)
251{
252 int ret;
253 const char *name;
254
255 ret = bt_ctf_field_type_enumeration_get_mapping_unsigned(enumeration,
256 index, &name, range_start, range_end);
257 return !ret ? name : NULL;
258}
259
260const char *_bt_python_ctf_field_type_structure_get_field_name(
261 struct bt_ctf_field_type *structure, size_t index)
262{
263 int ret;
264 const char *name;
265 struct bt_ctf_field_type *type;
266
267 ret = bt_ctf_field_type_structure_get_field(structure, &name, &type,
268 index);
269 if (ret) {
270 name = NULL;
271 goto end;
272 }
273
274 bt_ctf_field_type_put(type);
275end:
276 return name;
277}
278
279struct bt_ctf_field_type *_bt_python_ctf_field_type_structure_get_field_type(
280 struct bt_ctf_field_type *structure, size_t index)
281{
282 int ret;
283 const char *name;
284 struct bt_ctf_field_type *type;
285
286 ret = bt_ctf_field_type_structure_get_field(structure, &name, &type,
287 index);
288 return !ret ? type : NULL;
289}
290
291const char *_bt_python_ctf_field_type_variant_get_field_name(
292 struct bt_ctf_field_type *variant, size_t index)
293{
294 int ret;
295 const char *name;
296 struct bt_ctf_field_type *type;
297
298 ret = bt_ctf_field_type_variant_get_field(variant, &name, &type,
299 index);
300 if (ret) {
301 name = NULL;
302 goto end;
303 }
304
305 bt_ctf_field_type_put(type);
306end:
307 return name;
308}
309
310struct bt_ctf_field_type *_bt_python_ctf_field_type_variant_get_field_type(
311 struct bt_ctf_field_type *variant, size_t index)
312{
313 int ret;
314 const char *name;
315 struct bt_ctf_field_type *type;
316
317 ret = bt_ctf_field_type_variant_get_field(variant, &name, &type,
318 index);
319 return !ret ? type : NULL;
320}
38f28df6
JG
321
322const char *_bt_python_ctf_event_class_get_field_name(
323 struct bt_ctf_event_class *event_class, size_t index)
324{
325 int ret;
326 const char *name;
327 struct bt_ctf_field_type *type;
328
329 ret = bt_ctf_event_class_get_field(event_class, &name, &type,
330 index);
331 if (ret) {
332 name = NULL;
333 goto end;
334 }
335
336 bt_ctf_field_type_put(type);
337end:
338 return name;
339}
340
341struct bt_ctf_field_type *_bt_python_ctf_event_class_get_field_type(
342 struct bt_ctf_event_class *event_class, size_t index)
343{
344 int ret;
345 const char *name;
346 struct bt_ctf_field_type *type;
347
348 ret = bt_ctf_event_class_get_field(event_class, &name, &type,
349 index);
350 return !ret ? type : NULL;
351}
352
da64442f
JG
353int _bt_python_ctf_clock_get_uuid_index(struct bt_ctf_clock *clock,
354 size_t index, unsigned char *value)
355{
356 int ret = 0;
357 const unsigned char *uuid;
358
359 if (index >= 16) {
360 ret = -1;
361 goto end;
362 }
363
364 uuid = bt_ctf_clock_get_uuid(clock);
365 if (!uuid) {
366 ret = -1;
367 goto end;
368 }
369
370 *value = uuid[index];
371end:
372 return ret;
373}
374
375int _bt_python_ctf_clock_set_uuid_index(struct bt_ctf_clock *clock,
376 size_t index, unsigned char value)
377{
378 int ret = 0;
379
380 if (index >= 16) {
381 ret = -1;
382 goto end;
383 }
384
385 clock->uuid[index] = value;
386end:
387 return ret;
388}
This page took 0.040873 seconds and 4 git commands to generate.