Initial DD
This commit is contained in:
commit
4c129f3bdd
|
@ -0,0 +1,3 @@
|
|||
test_bitstream
|
||||
main
|
||||
*.o
|
|
@ -0,0 +1,13 @@
|
|||
OBJECTS := bitstream.o
|
||||
|
||||
clean:
|
||||
$(RM) *.o test_bitstream main
|
||||
|
||||
run_%: %
|
||||
./$^
|
||||
|
||||
test_%: test_%.c $(OBJECTS)
|
||||
$(CC) $^ -o $@
|
||||
|
||||
%.o: %.c
|
||||
$(CC) $^ -c -o $@
|
|
@ -0,0 +1,44 @@
|
|||
#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;
|
||||
}
|
|
@ -0,0 +1,25 @@
|
|||
#ifndef _BITSTREAM_H_
|
||||
#define _BITSTREAM_H_
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
typedef struct bit_stream {
|
||||
uint8_t *buffer;
|
||||
size_t buffer_size;
|
||||
off_t offset;
|
||||
} BitStream;
|
||||
|
||||
BitStream bitstream_load_from_file(FILE *fp);
|
||||
BitStream bitstream_init_empty(size_t size_in_bytes);
|
||||
|
||||
uint8_t bitstream_get(BitStream bs, off_t offset);
|
||||
uint8_t bitstream_next(BitStream *bs);
|
||||
bool bitstream_end(BitStream bs);
|
||||
void bitstream_set(BitStream bs, off_t offset, uint8_t value);
|
||||
|
||||
void bitstream_unload(BitStream *bs);
|
||||
|
||||
#endif
|
|
@ -0,0 +1,5 @@
|
|||
// x-run: make clean all run
|
||||
#include "./bitstream.h"
|
||||
|
||||
int main(void) {
|
||||
}
|
|
@ -0,0 +1,22 @@
|
|||
// x-run: make clean test_bitstream run_test_bitstream
|
||||
#include "./bitstream.h"
|
||||
|
||||
int main(void) {
|
||||
BitStream bs = bitstream_init_empty(16 * 2);
|
||||
bitstream_set(bs, 16 * 0 + 0, 1);
|
||||
bitstream_set(bs, 16 * 2 + 2, 1);
|
||||
bitstream_set(bs, 16 * 4 + 4, 1);
|
||||
bitstream_set(bs, 16 * 8 + 8, 1);
|
||||
bitstream_set(bs, 16 * 4 + 4, 0);
|
||||
printf(" ");
|
||||
for (int i = 0; i < 16; i++) printf("%2x", i);
|
||||
printf("\n");
|
||||
for (int i = 0; !bitstream_end(bs); i++) {
|
||||
if (i % 16 == 0) printf("%2x", i >> 4);
|
||||
printf("\033[%dm ", bitstream_next(&bs) \
|
||||
? (i >> 4 & 1 ? 47 : 107) \
|
||||
: (i >> 4 & 1 ? 40 : 100));
|
||||
if (i % 16 == 15) printf("\033[0m\n");
|
||||
}
|
||||
bitstream_unload(&bs);
|
||||
}
|
Loading…
Reference in New Issue