#include #include #include "bin.h" #include "bits.h" #include "buf.h" #include "def.h" #include "std.h" bool com_bin_read_i16(com_bin *b, int16_t *value) { int16_t buf; if (!b->interface.readn(b->ctx, (char *)&buf, 2)) return false; if (COM_DEF_CPU_LITEND && (b->flags & COM_BIN_BIG_ENDIAN)) { *value = __builtin_bswap16(buf); } else *value = buf; return true; } /* Same thing, really. */ bool com_bin_read_u16(com_bin *b, uint16_t *value) { return (com_bin_read_i16(b, (int16_t *)value)); } bool com_bin_read_bufb(com_bin *b, struct com_buf *buf, uint32_t bytes) { com_std_assert(buf->typesz == 1); if (!com_buf_make_room(buf, bytes)) return false; bool s = b->interface.readn(b->ctx, (char *)&buf->data[buf->len], bytes); if (s) buf->len += bytes; return s; } bool com_bin_read_bufbi(com_bin *b, struct com_buf *buf, uint32_t *index, uint32_t bytes) { com_std_assert(buf->typesz == 1); uint32_t const alignextra = com_bits_nalign(buf->len, COM_DEF_ALIGNMENT) - buf->len; if (!com_buf_make_room(buf, alignextra + sizeof(struct com_buf) + bytes)) return false; buf->len += alignextra; struct com_buf *in = (struct com_buf *)&buf->data[buf->len]; buf->len += sizeof(struct com_buf); bool s = b->interface.readn(b->ctx, (char *)&buf->data[buf->len], bytes); if (s) { buf->len += bytes; *in = (struct com_buf){.cap = bytes, .len = bytes, .typesz = 1, .flags = (buf->flags & COM_BUF_STACK) | COM_BUF_SUB}; *index = ((ptrdiff_t)in - (ptrdiff_t)buf->data) / sizeof(struct com_buf); } return s; } bool com_bin_skip(com_bin *b, uint32_t bytes) { return b->interface.skipn(b->ctx, bytes); }