huffman/inc/buffer.h

82 lines
2.2 KiB
C

#ifndef __IN303_BUFFER_H__
#define __IN303_BUFFER_H__
#include <stdio.h>
/**
* 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
char 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
size_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
*/
size_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
char 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