Ajout d'une structure tampon
This commit is contained in:
parent
f1819526ed
commit
e67cccce22
1
Makefile
1
Makefile
|
@ -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
|
||||
|
|
|
@ -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
|
|
@ -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;
|
||||
}
|
Loading…
Reference in New Issue