X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=include%2Fbabeltrace%2Fctf%2Ftypes.h;h=c311b532738612fb2feeb31da1655755f610101a;hb=dd2544fde7500d15afb76f588009874cc577f0ac;hp=73288ef6681117bb8b8bd839f5bf5fc3f5f738fd;hpb=bbefb8dd3e1e198313e2eaf83f5451224ef8e27e;p=babeltrace.git diff --git a/include/babeltrace/ctf/types.h b/include/babeltrace/ctf/types.h index 73288ef6..c311b532 100644 --- a/include/babeltrace/ctf/types.h +++ b/include/babeltrace/ctf/types.h @@ -23,6 +23,59 @@ #include #include +/* + * Always update stream_pos with move_pos and init_pos. + */ +struct stream_pos { + char *base; /* Base address */ + size_t offset; /* Offset from base, in bits */ + int dummy; /* Dummy position, for length calculation */ +}; + +static inline +void init_pos(struct stream_pos *pos, char *base) +{ + pos->base = base; /* initial base, page-aligned */ + pos->offset = 0; + pos->dummy = false; +} + +/* + * move_pos - move position of a relative bit offset + * + * TODO: allow larger files by updating base too. + */ +static inline +void move_pos(struct stream_pos *pos, size_t offset) +{ + pos->offset = pos->offset + offset; +} + +/* + * align_pos - align position on a bit offset (> 0) + * + * TODO: allow larger files by updating base too. + */ +static inline +void align_pos(struct stream_pos *pos, size_t offset) +{ + pos->offset += offset_align(pos->offset, offset); +} + +static inline +void copy_pos(struct stream_pos *dest, struct stream_pos *src) +{ + memcpy(dest, src, sizeof(struct stream_pos)); +} + +static inline +char *get_pos_addr(struct 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); +} + /* * IMPORTANT: All lengths (len) and offsets (start, end) are expressed in bits, * *not* in bytes.