2016-10-27 13:36:51 +00:00
|
|
|
#ifndef __IN303_BUFFER_H__
|
|
|
|
#define __IN303_BUFFER_H__
|
|
|
|
|
|
|
|
#include <stdio.h>
|
2016-11-20 00:40:24 +00:00
|
|
|
#include <stdint.h>
|
2016-10-27 13:36:51 +00:00
|
|
|
|
2016-11-20 13:33:55 +00:00
|
|
|
#include "common.h"
|
|
|
|
|
2016-10-27 13:36:51 +00:00
|
|
|
/**
|
2016-11-19 14:53:43 +00:00
|
|
|
* 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
|
2016-10-27 13:36:51 +00:00
|
|
|
*/
|
2016-11-19 14:53:43 +00:00
|
|
|
typedef struct WriteBuffer WriteBuffer;
|
|
|
|
struct WriteBuffer {
|
|
|
|
// Contient les données du tampon d'écriture, c'est-à-dire
|
2016-10-27 13:36:51 +00:00
|
|
|
// les données en attente de vidage dans le fichier
|
2016-11-20 00:29:24 +00:00
|
|
|
int data;
|
2016-10-27 13:36:51 +00:00
|
|
|
|
2016-11-19 14:53:43 +00:00
|
|
|
// Nombre de bits utilisés dans `data`. Si ce nombre vaut 8,
|
|
|
|
// le tampon d'écriture est plein
|
|
|
|
size_t pending_bits;
|
2016-10-27 13:36:51 +00:00
|
|
|
|
2016-11-19 20:36:31 +00:00
|
|
|
// Nombre d'octets écrits par le tampon d'écriture dans le
|
|
|
|
// fichier, correspondant au nombre de vidages du tampon
|
2016-11-20 13:33:55 +00:00
|
|
|
bytecount flushed_count;
|
2016-11-19 20:36:31 +00:00
|
|
|
|
2016-11-19 14:53:43 +00:00
|
|
|
// Fichier dans lequel le tampon d'éciture est vidé à l'appel
|
2016-10-27 13:36:51 +00:00
|
|
|
// de `flushBuffer` ou au débordement
|
2016-11-19 14:53:43 +00:00
|
|
|
FILE* dest_file;
|
2016-10-27 13:36:51 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
2016-11-19 14:53:43 +00:00
|
|
|
* Initialise un tampon d'écriture vide, avec le fichier donné comme
|
|
|
|
* destination
|
|
|
|
*/
|
|
|
|
WriteBuffer createWriteBuffer(FILE*);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Écrit le bit donné dans le tampon d'écriture
|
2016-10-27 13:36:51 +00:00
|
|
|
*/
|
2016-11-19 14:53:43 +00:00
|
|
|
void putBuffer(char bit, WriteBuffer*);
|
2016-10-27 13:36:51 +00:00
|
|
|
|
|
|
|
/**
|
2016-11-19 14:53:43 +00:00
|
|
|
* Force le vidage du tampon dans son fichier et sa réinitialisation
|
|
|
|
* (les bits non-remplis seront remplacés par des 0)
|
2016-10-27 13:36:51 +00:00
|
|
|
*/
|
2016-11-19 14:53:43 +00:00
|
|
|
void flushBuffer(WriteBuffer*);
|
|
|
|
|
2016-11-19 20:36:31 +00:00
|
|
|
/**
|
|
|
|
* 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
|
|
|
|
*/
|
2016-11-20 13:33:55 +00:00
|
|
|
bytecount getFlushedCount(WriteBuffer*);
|
2016-11-19 20:36:31 +00:00
|
|
|
|
2016-11-19 14:53:43 +00:00
|
|
|
/**
|
|
|
|
* 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
|
2016-11-20 00:29:24 +00:00
|
|
|
int data;
|
2016-11-19 14:53:43 +00:00
|
|
|
|
|
|
|
// 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;
|
|
|
|
};
|
2016-11-19 13:58:05 +00:00
|
|
|
|
|
|
|
/**
|
2016-11-19 14:53:43 +00:00
|
|
|
* Initialise un tampon de lecture avec le fichier donné comme source
|
2016-11-19 13:58:05 +00:00
|
|
|
*/
|
2016-11-19 14:53:43 +00:00
|
|
|
ReadBuffer createReadBuffer(FILE*);
|
2016-10-27 13:36:51 +00:00
|
|
|
|
|
|
|
/**
|
2016-11-19 14:53:43 +00:00
|
|
|
* Lit le prochain bit depuis le tampon de lecture
|
2016-10-27 13:36:51 +00:00
|
|
|
*/
|
2016-11-19 14:53:43 +00:00
|
|
|
char getBuffer(ReadBuffer*);
|
2016-10-27 13:36:51 +00:00
|
|
|
|
|
|
|
#endif
|