4 * Integers read/write functions.
6 * Copyright 2010 - Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
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:
15 * The above copyright notice and this permission notice shall be included in
16 * all copies or substantial portions of the Software.
19 #include <babeltrace/ctf/types.h>
20 #include <babeltrace/bitfield.h>
26 * The aligned read/write functions are expected to be faster than the
27 * bitfield variants. They will be enabled eventually as an
32 int _aligned_integer_read(struct stream_pos
*ppos
,
33 struct definition
*definition
)
35 struct definition_integer
*integer_definition
=
36 container_of(definition
, struct definition_integer
, p
);
37 const struct declaration_integer
*integer_declaration
=
38 integer_definition
->declaration
;
39 struct ctf_stream_pos
*pos
= ctf_pos(ppos
);
40 int rbo
= (integer_declaration
->byte_order
!= BYTE_ORDER
); /* reverse byte order */
42 ctf_align_pos(pos
, integer_declaration
->p
.alignment
);
44 if (!ctf_pos_access_ok(pos
, integer_declaration
->len
))
47 assert(!(pos
->offset
% CHAR_BIT
));
48 if (!integer_declaration
->signedness
) {
49 switch (integer_declaration
->len
) {
54 v
= *(const uint8_t *) ctf_get_pos_addr(pos
);
55 integer_definition
->value
._unsigned
= v
;
62 v
= *(const uint16_t *) ctf_get_pos_addr(pos
);
63 integer_definition
->value
._unsigned
=
64 rbo
? GUINT16_SWAP_LE_BE(v
) : v
;
71 v
= *(const uint32_t *) ctf_get_pos_addr(pos
);
72 integer_definition
->value
._unsigned
=
73 rbo
? GUINT32_SWAP_LE_BE(v
) : v
;
80 v
= *(const uint64_t *) ctf_get_pos_addr(pos
);
81 integer_definition
->value
._unsigned
=
82 rbo
? GUINT64_SWAP_LE_BE(v
) : v
;
89 switch (integer_declaration
->len
) {
94 v
= *(const int8_t *) ctf_get_pos_addr(pos
);
95 integer_definition
->value
._signed
= v
;
102 v
= *(const int16_t *) ctf_get_pos_addr(pos
);
103 integer_definition
->value
._signed
=
104 rbo
? GUINT16_SWAP_LE_BE(v
) : v
;
111 v
= *(const int32_t *) ctf_get_pos_addr(pos
);
112 integer_definition
->value
._signed
=
113 rbo
? GUINT32_SWAP_LE_BE(v
) : v
;
120 v
= *(const int64_t *) ctf_get_pos_addr(pos
);
121 integer_definition
->value
._signed
=
122 rbo
? GUINT64_SWAP_LE_BE(v
) : v
;
129 ctf_move_pos(pos
, integer_declaration
->len
);
134 int _aligned_integer_write(struct stream_pos
*ppos
,
135 struct definition
*definition
)
137 struct definition_integer
*integer_definition
=
138 container_of(definition
, struct definition_integer
, p
);
139 const struct declaration_integer
*integer_declaration
=
140 integer_definition
->declaration
;
141 struct ctf_stream_pos
*pos
= ctf_pos(ppos
);
142 int rbo
= (integer_declaration
->byte_order
!= BYTE_ORDER
); /* reverse byte order */
144 ctf_align_pos(pos
, integer_declaration
->p
.alignment
);
146 if (!ctf_pos_access_ok(pos
, integer_declaration
->len
))
149 assert(!(pos
->offset
% CHAR_BIT
));
152 if (!integer_declaration
->signedness
) {
153 uint64_t v
= integer_definition
->value
._unsigned
;
155 switch (integer_declaration
->len
) {
156 case 8: *(uint8_t *) ctf_get_pos_addr(pos
) = (uint8_t) v
;
159 *(uint16_t *) ctf_get_pos_addr(pos
) = rbo
?
160 GUINT16_SWAP_LE_BE((uint16_t) v
) :
164 *(uint32_t *) ctf_get_pos_addr(pos
) = rbo
?
165 GUINT32_SWAP_LE_BE((uint32_t) v
) :
169 *(uint64_t *) ctf_get_pos_addr(pos
) = rbo
?
170 GUINT64_SWAP_LE_BE(v
) : v
;
176 int64_t v
= integer_definition
->value
._signed
;
178 switch (integer_declaration
->len
) {
179 case 8: *(int8_t *) ctf_get_pos_addr(pos
) = (int8_t) v
;
182 *(int16_t *) ctf_get_pos_addr(pos
) = rbo
?
183 GUINT16_SWAP_LE_BE((int16_t) v
) :
187 *(int32_t *) ctf_get_pos_addr(pos
) = rbo
?
188 GUINT32_SWAP_LE_BE((int32_t) v
) :
192 *(int64_t *) ctf_get_pos_addr(pos
) = rbo
?
193 GUINT64_SWAP_LE_BE(v
) : v
;
200 ctf_move_pos(pos
, integer_declaration
->len
);
204 int ctf_integer_read(struct stream_pos
*ppos
, struct definition
*definition
)
206 struct definition_integer
*integer_definition
=
207 container_of(definition
, struct definition_integer
, p
);
208 const struct declaration_integer
*integer_declaration
=
209 integer_definition
->declaration
;
210 struct ctf_stream_pos
*pos
= ctf_pos(ppos
);
212 if (!(integer_declaration
->p
.alignment
% CHAR_BIT
)
213 && !(integer_declaration
->len
% CHAR_BIT
)) {
214 return _aligned_integer_read(ppos
, definition
);
217 ctf_align_pos(pos
, integer_declaration
->p
.alignment
);
219 if (!ctf_pos_access_ok(pos
, integer_declaration
->len
))
222 if (!integer_declaration
->signedness
) {
223 if (integer_declaration
->byte_order
== LITTLE_ENDIAN
)
224 bt_bitfield_read_le(pos
->base
, unsigned long,
225 pos
->offset
, integer_declaration
->len
,
226 &integer_definition
->value
._unsigned
);
228 bt_bitfield_read_be(pos
->base
, unsigned long,
229 pos
->offset
, integer_declaration
->len
,
230 &integer_definition
->value
._unsigned
);
232 if (integer_declaration
->byte_order
== LITTLE_ENDIAN
)
233 bt_bitfield_read_le(pos
->base
, unsigned long,
234 pos
->offset
, integer_declaration
->len
,
235 &integer_definition
->value
._signed
);
237 bt_bitfield_read_be(pos
->base
, unsigned long,
238 pos
->offset
, integer_declaration
->len
,
239 &integer_definition
->value
._signed
);
241 ctf_move_pos(pos
, integer_declaration
->len
);
245 int ctf_integer_write(struct stream_pos
*ppos
, struct definition
*definition
)
247 struct definition_integer
*integer_definition
=
248 container_of(definition
, struct definition_integer
, p
);
249 const struct declaration_integer
*integer_declaration
=
250 integer_definition
->declaration
;
251 struct ctf_stream_pos
*pos
= ctf_pos(ppos
);
253 if (!(integer_declaration
->p
.alignment
% CHAR_BIT
)
254 && !(integer_declaration
->len
% CHAR_BIT
)) {
255 return _aligned_integer_write(ppos
, definition
);
258 ctf_align_pos(pos
, integer_declaration
->p
.alignment
);
260 if (!ctf_pos_access_ok(pos
, integer_declaration
->len
))
265 if (!integer_declaration
->signedness
) {
266 if (integer_declaration
->byte_order
== LITTLE_ENDIAN
)
267 bt_bitfield_write_le(pos
->base
, unsigned long,
268 pos
->offset
, integer_declaration
->len
,
269 integer_definition
->value
._unsigned
);
271 bt_bitfield_write_be(pos
->base
, unsigned long,
272 pos
->offset
, integer_declaration
->len
,
273 integer_definition
->value
._unsigned
);
275 if (integer_declaration
->byte_order
== LITTLE_ENDIAN
)
276 bt_bitfield_write_le(pos
->base
, unsigned long,
277 pos
->offset
, integer_declaration
->len
,
278 integer_definition
->value
._signed
);
280 bt_bitfield_write_be(pos
->base
, unsigned long,
281 pos
->offset
, integer_declaration
->len
,
282 integer_definition
->value
._signed
);
285 ctf_move_pos(pos
, integer_declaration
->len
);
This page took 0.034611 seconds and 4 git commands to generate.