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
|
# Générer les fichiers objets pour chaque source
|
||||||
$(OUT)common.o: $(SRC)common.c $(INC)common.h
|
$(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 \
|
$(OUT)compress.o: $(SRC)compress.c $(INC)compress.h $(INC)common.h \
|
||||||
$(INC)display.h
|
$(INC)display.h
|
||||||
$(OUT)display.o: $(SRC)display.c $(INC)display.h $(INC)common.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