45 lines
1.0 KiB
C
45 lines
1.0 KiB
C
|
#include "./bitstream.h"
|
||
|
#include <stdio.h>
|
||
|
|
||
|
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;
|
||
|
}
|