Ajout de la fonction pour sérialiser les arbres

This commit is contained in:
Mattéo Delabre 2016-10-27 18:19:44 +02:00
parent 24f66c415e
commit 948f73027b
3 changed files with 71 additions and 1 deletions

View File

@ -1,6 +1,7 @@
#ifndef __IN303_HUFTREE_H__
#define __IN303_HUFTREE_H__
#include <stdio.h>
#include <stdlib.h>
/**
@ -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`

View File

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

View File

@ -1,5 +1,6 @@
#include "huftree.h"
#include "common.h"
#include "buffer.h"
#include <stdio.h>
#include <string.h>
@ -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;