From 61f65d0aefa388cebadd66cba08f2529fc4d36c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matt=C3=A9o=20Delabre=20=E2=9C=8F?= Date: Tue, 25 Oct 2016 06:51:07 +0200 Subject: [PATCH] =?UTF-8?q?R=C3=A9organisation=20du=20code=20&=20du=20make?= =?UTF-8?q?file?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Makefile | 42 +++++++++++++++++++++++++----- inc/common.h | 26 +++++++++++++++++++ inc/compress.h | 8 ++++++ inc/display.h | 25 ++++++++++++++++++ inc/huftree.h | 70 ++++++++++++++++++++++++++++++++++++++++++++++++++ src/common.c | 2 +- src/compress.c | 6 ++--- src/display.c | 4 +-- src/huftree.c | 4 +-- src/main.c | 4 +-- 10 files changed, 174 insertions(+), 17 deletions(-) create mode 100644 inc/common.h create mode 100644 inc/compress.h create mode 100644 inc/display.h create mode 100644 inc/huftree.h diff --git a/Makefile b/Makefile index a05abf4..bf9a396 100644 --- a/Makefile +++ b/Makefile @@ -1,13 +1,41 @@ +# Dossiers contenant les fichiers sources, les en-têtes +# et les sorties +SRC=src/ +INC=inc/ +OUT=out/ + +# Configuration du compilateur CC=gcc -CFLAGS=-Wall -std=c99 -SRC=src +CFLAGS=-Wall -std=c99 -I$(INC) + +# Objets et exécutables à construire PROG=huffman +SOURCES=$(wildcard $(SRC)*.c) +OBJECTS=$(patsubst $(SRC)%.c,$(OUT)%.o,$(SOURCES)) -all: main.o compress.o huftree.o display.o common.o - $(CC) $^ $(CFLAGS) -o $(PROG) +##################################################### -%.o: src/%.c - $(CC) $(CFLAGS) -c $^ +all: $(OUT) $(OUT)$(PROG) +# Créer le dossier de sortie si nécessaire +$(OUT): + mkdir -p $(OUT) + +# Lier les différents fichiers objets générés en un exécutable +$(OUT)$(PROG): $(OBJECTS) + $(CC) $^ $(CFLAGS) -o $@ + +# Générer les fichiers objets pour chaque source +$(OUT)common.o: $(SRC)common.c $(INC)common.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 +$(OUT)huftree.o: $(SRC)huftree.c $(INC)huftree.h $(INC)common.h +$(OUT)main.o: $(SRC)main.c $(INC)compress.h $(INC)common.h + +$(OBJECTS): + $(CC) $(CFLAGS) -o $@ -c $< + +# Nettoyer le dossier de sortie clean: - rm -f $(PROG) *.o + rm -rf out diff --git a/inc/common.h b/inc/common.h new file mode 100644 index 0000000..b155b16 --- /dev/null +++ b/inc/common.h @@ -0,0 +1,26 @@ +#ifndef __IN303_COMMON_H__ +#define __IN303_COMMON_H__ + +#define TRUE 1 +#define FALSE 0 +#define NUM_CHARS 256 + +/** + * Écrire sur la sortie standard à la manière de printf, + * seulement si le mode verbeux est actif + */ +void printVerbose(const char* format, ...); + +/** + * Active ou désactive l'affichage des messages verbeux + * (mode verbeux). Si activé, `printVerbose` écrit sur + * la sortie standard. Sinon, `printVerbose` n'a pas d'effet + */ +void setVerbose(int); + +/** + * Renvoie l'état du mode verbeux + */ +int isVerbose(); + +#endif diff --git a/inc/compress.h b/inc/compress.h new file mode 100644 index 0000000..70bfebd --- /dev/null +++ b/inc/compress.h @@ -0,0 +1,8 @@ +#ifndef __IN303_COMPRESS_H__ +#define __IN303_COMPRESS_H__ + +#include "huftree.h" + +void compress(const char* filepath); + +#endif diff --git a/inc/display.h b/inc/display.h new file mode 100644 index 0000000..dcbd4bb --- /dev/null +++ b/inc/display.h @@ -0,0 +1,25 @@ +#ifndef __IN303_DISPLAY_H__ +#define __IN303_DISPLAY_H__ + +#include "huftree.h" +#include + +/** + * Afficher sur la sortie standard l'arbre passé + * en paramètre + */ +void printTree(HufTree tree); + +/** + * Afficher sur la sortie standard le tableau associant les caractères + * à leur fréquence d'apparition passé en argument + */ +void printFrequenciesTable(double*, size_t); + +/** + * Afficher sur la sortie standard le tableau associant les caractères + * à leur étiquette passé en argument + */ +void printLabelsTable(char**, size_t); + +#endif diff --git a/inc/huftree.h b/inc/huftree.h new file mode 100644 index 0000000..3ffef16 --- /dev/null +++ b/inc/huftree.h @@ -0,0 +1,70 @@ +#ifndef __IN303_HUFTREE_H__ +#define __IN303_HUFTREE_H__ + +#include + +/** + * Représente un des sommets d'un arbre de Huffman + */ +typedef struct HufVertex HufVertex; +struct HufVertex { + // Indique la fréquence d'apparition de la lettre du sommet + // dans le corpus original, ou bien la somme des fréquences + // de ses enfants (si ce n'est pas une feuille) + double frequency; + + // Caractère du corpus original associé à ce sommet. Uniquement + // valable pour les feuilles. Pour les autres sommets, la valeur + // de (character) n'est pas garantie + char character; + + // Pointeurs vers les deux enfants de ce sommet. Ils valent tous + // deux NULL si le sommet est une feuille. À noter qu'un sommet + // a toujours 0 ou 2 enfants car un arbre de Huffman est binaire + HufVertex* child_l; + HufVertex* child_r; +}; + +/** + * Représente un arbre de Huffman + */ +typedef struct HufTree HufTree; +struct HufTree { + // Pointeur sur la racine de l'arbre + HufVertex* root; + + // Quantité de sommets dans l'arbre + size_t size; +}; + +/** + * Construire un arbre de Huffman basé sur les fréquences + * de caractères passées dans `frequencies` + * + * (résultat à libérer avec `freeTree`) + */ +HufTree createTree(double* frequencies); + +/** + * Libérer la mémoire occupée par un arbre de Huffman + * généré par la fonction `createTree` + */ +void freeTree(HufTree tree); + +/** + * Associer à chaque feuille de l'arbre une étiquette unique basée + * sur sa position dans l'arbre. Aucune étiquette n'est ainsi préfixe + * d'une autre. Le tableau renvoyé associe chaque caractère ASCII + * à son préfixe, ou à NULL s'il n'est pas présent dans l'arbre + * + * (résultat à libérer avec `freeTreeLabels`) + */ +char** createTreeLabels(HufTree tree); + +/** + * Libérer la mémoire occupée par un tableau d'étiquettes renvoyé + * par la fonction `labelTree` + */ +void freeTreeLabels(char** labels); + +#endif diff --git a/src/common.c b/src/common.c index a5b6ef7..92e19ab 100644 --- a/src/common.c +++ b/src/common.c @@ -1,4 +1,4 @@ -#include "../include/common.h" +#include "common.h" #include #include diff --git a/src/compress.c b/src/compress.c index 35352c7..448d020 100644 --- a/src/compress.c +++ b/src/compress.c @@ -1,6 +1,6 @@ -#include "../include/compress.h" -#include "../include/common.h" -#include "../include/display.h" +#include "compress.h" +#include "common.h" +#include "display.h" #include #include #include diff --git a/src/display.c b/src/display.c index 67b8c84..b664cba 100644 --- a/src/display.c +++ b/src/display.c @@ -1,5 +1,5 @@ -#include "../include/display.h" -#include "../include/common.h" +#include "display.h" +#include "common.h" #include #include #include diff --git a/src/huftree.c b/src/huftree.c index 5625d12..673f012 100644 --- a/src/huftree.c +++ b/src/huftree.c @@ -1,5 +1,5 @@ -#include "../include/huftree.h" -#include "../include/common.h" +#include "huftree.h" +#include "common.h" #include #include diff --git a/src/main.c b/src/main.c index 14c89c4..75ce12c 100644 --- a/src/main.c +++ b/src/main.c @@ -1,5 +1,5 @@ -#include "../include/common.h" -#include "../include/compress.h" +#include "common.h" +#include "compress.h" #include #include