huffman/inc/buffer.h

130 lines
3.4 KiB
C
Raw Normal View History

2016-11-30 10:55:10 +00:00
/**
* @file
* @brief Abstraction de l'écriture et la lecture d'un fichier bit à bit.
*
* Définir des structures et des fonctions de manipulation liées à
* un fichier et permettant d'accéder à son contenu ou de le modifier
* bit par bit au lieu d'octet par octet.
*/
#ifndef __HUFFMAN_BUFFER_H_INCLUDED__
#define __HUFFMAN_BUFFER_H_INCLUDED__
2016-10-27 13:36:51 +00:00
#include <stdio.h>
#include <stdint.h>
2016-10-27 13:36:51 +00:00
#include "common.h"
2016-10-27 13:36:51 +00:00
/**
2016-11-30 10:55:10 +00:00
* @brief Tampon d'écriture bit par bit.
*
* 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
2016-11-30 10:55:10 +00:00
* dès qu'un octet est complet, ou lorsque le vidage est forcé.
2016-10-27 13:36:51 +00:00
*/
2016-11-30 10:55:10 +00:00
typedef struct WriteBuffer {
/**
* Données du tampon d'écriture en attente de vidage.
*/
int data;
2016-10-27 13:36:51 +00:00
2016-11-30 10:55:10 +00:00
/**
* Nombre de bits utilisés dans WriteBuffer#data.
*/
size_t pending_bits;
2016-10-27 13:36:51 +00:00
2016-11-30 10:55:10 +00:00
/**
* Nombre de vidages effectués par le tampon.
*/
bytecount flushed_count;
2016-11-30 10:55:10 +00:00
/**
* Fichier dans lequel le tampon est vidé.
*/
FILE* dest_file;
2016-11-30 10:55:10 +00:00
} WriteBuffer;
2016-10-27 13:36:51 +00:00
/**
2016-11-30 10:55:10 +00:00
* @brief Initialiser un tampon d'écriture.
*
* Initialiser un tampon vide avec le fichier @p dest pour destination.
* @param dest Fichier de destination.
* @return Tampon créé.
*/
2016-11-30 10:55:10 +00:00
WriteBuffer createWriteBuffer(FILE* dest);
/**
2016-11-30 10:55:10 +00:00
* @brief Écrire un bit dans le tampon d'écriture.
*
* Ajouter le bit @p bit aux données du tampon @p buffer. Si le tampon est
* plein, vidage dans le fichier associé.
* @param bit Bit à ajouter au tampon (0 ou 1).
* @param buffer Tampon dans lequel ajouter le bit.
2016-10-27 13:36:51 +00:00
*/
2016-11-30 10:55:10 +00:00
void putBuffer(char bit, WriteBuffer* buffer);
2016-10-27 13:36:51 +00:00
/**
2016-11-30 10:55:10 +00:00
* @brief Forcer le vidage du tampon d'écriture.
*
* Forcer le vidage du tampon dans son fichier et sa réinitialisation.
* Si le tampon est vide, pas de vidage (pas d'octet superflu écrit).
* Si le tampon n'est pas rempli, complétion à droite par des 0.
* @param buffer Tampon à vider.
2016-10-27 13:36:51 +00:00
*/
2016-11-30 10:55:10 +00:00
void flushBuffer(WriteBuffer* buffer);
/**
2016-11-30 10:55:10 +00:00
* @brief Récupèrer le nombre de vidages effectués par ce tampon.
*
* Permet de savoir combien d'octets ont é écrits dans le fichier
* par le tampon @p buffer.
* @param buffer Tampon à vérifier.
* @return Nombre de vidages effectués.
*/
2016-11-30 10:55:10 +00:00
bytecount getFlushedCount(WriteBuffer* buffer);
/**
2016-11-30 10:55:10 +00:00
* @brief Tampon de lecture bit par bit.
*
* Tampon permettant d'abstraire la lecture d'un fichier bit par
* bit au lieu d'octet par octet. Un octet est lu depuis le fichier
2016-11-30 10:55:10 +00:00
* seulement lorsque tous les bits du précédent octet ont é consommés.
*/
2016-11-30 10:55:10 +00:00
typedef struct ReadBuffer {
/**
* Données du tampon de lecture en attente de lecture.
*/
int data;
2016-11-30 10:55:10 +00:00
/**
* Numéro du prochain bit de ReadBuffer#data à lire.
*/
size_t next_bit;
2016-11-30 10:55:10 +00:00
/**
* Fichier depuis lequel les données sont lues.
*/
FILE* source_file;
2016-11-30 10:55:10 +00:00
} ReadBuffer;
/**
2016-11-30 10:55:10 +00:00
* @brief Initialiser un tampon de lecture.
*
* Initialiser un tampon vide avec le fichier @p source comme source.
* @param source Fichier source.
* @return Tampon créé.
*/
2016-11-30 10:55:10 +00:00
ReadBuffer createReadBuffer(FILE* source);
2016-10-27 13:36:51 +00:00
/**
2016-11-30 10:55:10 +00:00
* @brief Lire un bit depuis le tampon de lecture.
*
* Lire le prochain bit depuis le tampon de lecture, et lire un octet
* depuis la source si besoin est.
* @param buffer Tampon depuis lequel lire un bit.
* @return Valeur du bit qui est lu : 0 ou 1.
2016-10-27 13:36:51 +00:00
*/
2016-11-30 10:55:10 +00:00
char getBuffer(ReadBuffer* buffer);
2016-10-27 13:36:51 +00:00
2016-11-30 10:55:10 +00:00
#endif // __HUFFMAN_BUFFER_H_INCLUDED__