Ajout d'une structure tampon

This commit is contained in:
Mattéo Delabre 2016-10-27 15:36:51 +02:00
parent f1819526ed
commit e67cccce22
3 changed files with 78 additions and 0 deletions

View File

@ -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

41
inc/buffer.h Normal file
View File

@ -0,0 +1,41 @@
#ifndef __IN303_BUFFER_H__
#define __IN303_BUFFER_H__
#include <stdio.h>
/**
* 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

36
src/buffer.c Normal file
View File

@ -0,0 +1,36 @@
#include "buffer.h"
#include <stdio.h>
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;
}