pkmndecompress/bitstream.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;
}