#include "./bitstream.h" #include BitStream bitstream_load_from_file(FILE *fp) { fseek(fp, SEEK_END, 0); size_t length = ftell(fp); fseek(fp, SEEK_SET, 0); BitStream bs = bitstream_init_empty(length); fread(bs.buffer, 1, length, fp); return bs; } BitStream bitstream_init_empty(size_t size_in_bytes) { return (BitStream){ .buffer = malloc(size_in_bytes), .buffer_size = size_in_bytes, .offset = 0 }; } bool bitstream_end(BitStream bs) { return (bs.offset >> 3) >= bs.buffer_size; } uint8_t bitstream_get(BitStream bs, off_t offset) { return bs.buffer[offset >> 3] & (0x80 >> (offset & 7)) ? 1 : 0; } uint8_t bitstream_next(BitStream *bs) { uint8_t val = bitstream_get(*bs, bs->offset); bs->offset++; return val; } void bitstream_set(BitStream bs, off_t offset, uint8_t value) { bs.buffer[offset >> 3] &= ~(0x80 >> (offset & 7)); bs.buffer[offset >> 3] |= (value ? 1 : 0) * (0x80 >> (offset & 7)); } void bitstream_unload(BitStream *bs) { free(bs->buffer); bs->buffer = 0; }