#ifndef __IN303_BUFFER_H__ #define __IN303_BUFFER_H__ #include #include /** * Tampon permettant d'abstraire l'écriture dans un fichier bit par * bit au lieu d'octet par octet. Les bits sont vidés dans le fichier * dès qu'un octet est complet */ typedef struct WriteBuffer WriteBuffer; struct WriteBuffer { // Contient les données du tampon d'écriture, c'est-à-dire // les données en attente de vidage dans le fichier int data; // Nombre de bits utilisés dans `data`. Si ce nombre vaut 8, // le tampon d'écriture est plein size_t pending_bits; // Nombre d'octets écrits par le tampon d'écriture dans le // fichier, correspondant au nombre de vidages du tampon uint64_t flushed_count; // Fichier dans lequel le tampon d'éciture est vidé à l'appel // de `flushBuffer` ou au débordement FILE* dest_file; }; /** * Initialise un tampon d'écriture vide, avec le fichier donné comme * destination */ WriteBuffer createWriteBuffer(FILE*); /** * Écrit le bit donné dans le tampon d'écriture */ void putBuffer(char bit, WriteBuffer*); /** * Force le vidage du tampon dans son fichier et sa réinitialisation * (les bits non-remplis seront remplacés par des 0) */ void flushBuffer(WriteBuffer*); /** * Récupère le nombre de vidages effectués sur le tampon d'écriture, * correspondant au nombre d'octets écrits par le tampon dans le fichier */ uint64_t getFlushedCount(WriteBuffer*); /** * Tampon permettant d'abstraire le lecture depuis un fichier bit par * bit au lieu d'octet par octet. Un octet est lu depuis le fichier * dès que tous les bits du précédent ont été lus */ typedef struct ReadBuffer ReadBuffer; struct ReadBuffer { // Contient les données du tampon de lecture, c'est-à-dire // le dernier octet lu depuis le fichier int data; // Numéro du prochain bit de `data` qui sera lu par `getBuffer` size_t next_bit; // Fichier depuis lequel le tampon de lecture est rempli FILE* source_file; }; /** * Initialise un tampon de lecture avec le fichier donné comme source */ ReadBuffer createReadBuffer(FILE*); /** * Lit le prochain bit depuis le tampon de lecture */ char getBuffer(ReadBuffer*); #endif