diff --git a/Makefile b/Makefile index bf9a396..56ba96f 100644 --- a/Makefile +++ b/Makefile @@ -27,6 +27,7 @@ $(OUT)$(PROG): $(OBJECTS) # Générer les fichiers objets pour chaque source $(OUT)common.o: $(SRC)common.c $(INC)common.h +$(OUT)buffer.o: $(SRC)buffer.c $(INC)buffer.h $(OUT)compress.o: $(SRC)compress.c $(INC)compress.h $(INC)common.h \ $(INC)display.h $(OUT)display.o: $(SRC)display.c $(INC)display.h $(INC)common.h diff --git a/inc/buffer.h b/inc/buffer.h new file mode 100644 index 0000000..9116fac --- /dev/null +++ b/inc/buffer.h @@ -0,0 +1,41 @@ +#ifndef __IN303_BUFFER_H__ +#define __IN303_BUFFER_H__ + +#include + +/** + * Informations sur un tampon de 8 caractères. + * Utiliser `createBuffer` pour initialiser un tampon + */ +typedef struct Buffer Buffer; +struct Buffer { + // Contient les données du tampon, c'est-à-dire + // les données en attente de vidage dans le fichier + char data; + + // Nombre de bits utilisés dans le tampon. Si ce + // nombre vaut 8, le tampon est plein + int used_bits; + + // Fichier dans lequel le tampon est vidé à l'appel + // de `flushBuffer` ou au débordement + FILE* linked_file; +}; + +/** + * Initialise un tampon vide lié au fichier donné + */ +Buffer createBuffer(FILE*); + +/** + * Pousse le bit donné dans le tampon passé. + * Si le tampon déborde, le vide dans le fichier lié + */ +void pushToBuffer(int bit, Buffer*); + +/** + * Vide le tampon dans son fichier et le réinitialise + */ +void flushBuffer(Buffer*); + +#endif diff --git a/src/buffer.c b/src/buffer.c new file mode 100644 index 0000000..23f5e8d --- /dev/null +++ b/src/buffer.c @@ -0,0 +1,36 @@ +#include "buffer.h" +#include + +Buffer createBuffer(FILE* file) { + Buffer buffer = { + .data = 0, + .used_bits = 0, + .linked_file = file + }; + + return buffer; +} + +void flushBuffer(Buffer* buffer) { + // TODO: gérer les erreurs d'écriture + + // Alignement des données à gauche de l'octet + buffer->data <<= 8 - buffer->used_bits; + fputc(buffer->data, buffer->linked_file); + + buffer->data = 0; + buffer->used_bits = 0; +} + +void pushToBuffer(int bit, Buffer* buffer) { + // Si le tampon déborde, écriture dans le fichier + if (buffer->used_bits == 8) { + flushBuffer(buffer); + } + + // Insertion de chaque bit de l'étiquette dans + // le tampon de sortie + buffer->data <<= 1; + buffer->data |= bit; + buffer->used_bits += 1; +}