-uint64_t ctf_uint_read(struct stream_pos *pos,
- const struct type_class_integer *int_class);
-int64_t ctf_int_read(struct stream_pos *pos,
- const struct type_class_integer *int_class);
-void ctf_uint_write(struct stream_pos *pos,
- const struct type_class_integer *int_class,
- uint64_t v);
-void ctf_int_write(struct stream_pos *pos,
- const struct type_class_integer *int_class,
- int64_t v);
-
-uint64_t ctf_bitfield_unsigned_read(struct stream_pos *pos,
- const struct type_class_bitfield *bitfield_class);
-int64_t ctf_bitfield_signed_read(struct stream_pos *pos,
- const struct type_class_bitfield *bitfield_class);
-void ctf_bitfield_unsigned_write(struct stream_pos *pos,
- const struct type_class_bitfield *bitfield_class,
- uint64_t v);
-void ctf_bitfield_signed_write(struct stream_pos *pos,
- const struct type_class_bitfield *bitfield_class,
- int64_t v);
-
-double ctf_double_read(struct stream_pos *pos,
- const struct type_class_float *src);
-void ctf_double_write(struct stream_pos *pos,
- const struct type_class_float *dest,
- double v);
-long double ctf_ldouble_read(struct stream_pos *pos,
- const struct type_class_float *src);
-void ctf_ldouble_write(struct stream_pos *pos,
- const struct type_class_float *dest,
- long double v);
-void ctf_float_copy(struct stream_pos *destp, const struct type_class_float *dest,
- struct stream_pos *srcp, const struct type_class_float *src);
-
-void ctf_string_copy(struct stream_pos *dest, struct stream_pos *src,
- const struct type_class_string *string_class);
-void ctf_string_read(unsigned char **dest, struct stream_pos *src,
- const struct type_class_string *string_class);
-void ctf_string_write(struct stream_pos *dest, const unsigned char *src,
- const struct type_class_string *string_class);
-void ctf_string_free_temp(unsigned char *string);
-
-GQuark ctf_enum_read(struct stream_pos *pos,
- const struct type_class_enum *src);
-void ctf_enum_write(struct stream_pos *pos,
- const struct type_class_enum *dest,
- GQuark q);
+/*
+ * align_pos - align position on a bit offset (> 0)
+ *
+ * TODO: allow larger files by updating base too.
+ */
+static inline
+void ctf_align_pos(struct ctf_stream_pos *pos, size_t bit_offset)
+{
+ ctf_move_pos(pos, offset_align(pos->offset, bit_offset));
+}
+
+static inline
+char *ctf_get_pos_addr(struct ctf_stream_pos *pos)
+{
+ /* Only makes sense to get the address after aligning on CHAR_BIT */
+ assert(!(pos->offset % CHAR_BIT));
+ return pos->base + (pos->offset / CHAR_BIT);
+}
+
+static inline
+void ctf_dummy_pos(struct ctf_stream_pos *pos, struct ctf_stream_pos *dummy)
+{
+ memcpy(dummy, pos, sizeof(struct ctf_stream_pos));
+ dummy->dummy = 1;
+ dummy->fd = -1;
+}
+
+/*
+ * Check if current packet can hold data.
+ * Returns 0 for success, negative error otherwise.
+ */
+static inline
+int ctf_pos_packet(struct ctf_stream_pos *dummy)
+{
+ if (dummy->offset > dummy->packet_size)
+ return -ENOSPC;
+ return 0;
+}
+
+static inline
+void ctf_pos_pad_packet(struct ctf_stream_pos *pos)
+{
+ ctf_move_pos(pos, pos->packet_size - pos->offset);
+}
+
+static inline
+int ctf_pos_access_ok(struct ctf_stream_pos *pos, size_t bit_len)
+{
+ if (pos->offset == EOF)
+ return 0;
+ if (pos->offset + bit_len > pos->packet_size)
+ return 0;
+ return 1;
+}
+
+/*
+ * Update the stream position for to the current event. This moves to
+ * the next packet if we are located at the end of the current packet.
+ */
+static inline
+void ctf_pos_get_event(struct ctf_stream_pos *pos)
+{
+ assert(pos->offset <= pos->content_size);
+ if (pos->offset == pos->content_size) {
+ printf_debug("ctf_move_pos_slow (before call): %zd\n",
+ pos->offset);
+ ctf_move_pos_slow(pos, 0, SEEK_CUR);
+ printf_debug("ctf_move_pos_slow (after call): %zd\n",
+ pos->offset);
+ }
+}