From 948f73027b153d65b6975842ae6185b5c4adabfd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matt=C3=A9o=20Delabre=20=E2=9C=8F?= Date: Thu, 27 Oct 2016 18:19:44 +0200 Subject: [PATCH] =?UTF-8?q?Ajout=20de=20la=20fonction=20pour=20s=C3=A9rial?= =?UTF-8?q?iser=20les=20arbres?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- inc/huftree.h | 13 ++++++++++++ src/buffer.c | 2 +- src/huftree.c | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 71 insertions(+), 1 deletion(-) diff --git a/inc/huftree.h b/inc/huftree.h index 3ffef16..a695ef5 100644 --- a/inc/huftree.h +++ b/inc/huftree.h @@ -1,6 +1,7 @@ #ifndef __IN303_HUFTREE_H__ #define __IN303_HUFTREE_H__ +#include #include /** @@ -45,6 +46,18 @@ struct HufTree { */ HufTree createTree(double* frequencies); +/** + * Écrit une représentation binaire de l'arbre dans le fichier + * passé en paramètre + */ +void writeTree(HufTree, FILE*); + +/** + * Reconstruit un arbre de Huffman à partir du fichier passé + * en paramètre + */ +HufTree readTree(FILE*); + /** * Libérer la mémoire occupée par un arbre de Huffman * généré par la fonction `createTree` diff --git a/src/buffer.c b/src/buffer.c index 23f5e8d..b93e8d0 100644 --- a/src/buffer.c +++ b/src/buffer.c @@ -12,7 +12,7 @@ Buffer createBuffer(FILE* file) { } void flushBuffer(Buffer* buffer) { - // TODO: gérer les erreurs d'écriture + // FIXME: gérer les erreurs d'écriture // Alignement des données à gauche de l'octet buffer->data <<= 8 - buffer->used_bits; diff --git a/src/huftree.c b/src/huftree.c index 673f012..736f9db 100644 --- a/src/huftree.c +++ b/src/huftree.c @@ -1,5 +1,6 @@ #include "huftree.h" #include "common.h" +#include "buffer.h" #include #include @@ -10,6 +11,12 @@ */ static void _findMinimalVertices(HufVertex**, size_t, size_t* min, size_t* sec); +/** + * Écrit dans le tampon donné les informations sur le sommet + * en question et tous ses fils + */ +static void _writeVertex(HufVertex, Buffer*); + /** * Libérer récursivement la mémoire occupée par le sommet * donné ainsi que celle de tous ses enfants (s'il en a). @@ -139,6 +146,56 @@ void _findMinimalVertices( } } +void writeTree(HufTree tree, FILE* output) { + Buffer buffer = createBuffer(output); + _writeVertex(*tree.root, &buffer); + flushBuffer(&buffer); +} + +void _writeVertex(HufVertex vertex, Buffer* buffer) { + if (vertex.child_l != NULL && vertex.child_r != NULL) { + // Séquence de 9 bits indiquant un sommet qui + // n'est pas une feuille (100000000) + pushToBuffer(1, buffer); + + for (int i = 0; i < 8; i++) { + pushToBuffer(0, buffer); + } + + // Écriture du fils gauche et du fils droit + _writeVertex(*vertex.child_l, buffer); + _writeVertex(*vertex.child_r, buffer); + } else { + // Séquence de 9 bits encodant la feuille rencontrée + // (0 + octet du caractère) + pushToBuffer(0, buffer); + + for (int i = 7; i >= 0; i--) { + pushToBuffer( + // Écriture du n-ième bit du caractère du fils + // dans le tampon + (vertex.character & (1 << i)) != 0, + buffer + ); + } + + // Séquence de 9 bits indiquant un sommet + // sans fils (100000001) + pushToBuffer(1, buffer); + + for (int i = 0; i < 7; i++) { + pushToBuffer(0, buffer); + } + + pushToBuffer(1, buffer); + } +} + +HufTree readTree(FILE* output) { + // TODO: implémenter la lecture des arbres + exit(0); +} + void freeTree(HufTree tree) { _freeTreeVertex(tree.root); tree.root = NULL;