Réorganisation du code & du makefile
This commit is contained in:
parent
7871866a68
commit
61f65d0aef
42
Makefile
42
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
|
||||
|
|
|
@ -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
|
|
@ -0,0 +1,8 @@
|
|||
#ifndef __IN303_COMPRESS_H__
|
||||
#define __IN303_COMPRESS_H__
|
||||
|
||||
#include "huftree.h"
|
||||
|
||||
void compress(const char* filepath);
|
||||
|
||||
#endif
|
|
@ -0,0 +1,25 @@
|
|||
#ifndef __IN303_DISPLAY_H__
|
||||
#define __IN303_DISPLAY_H__
|
||||
|
||||
#include "huftree.h"
|
||||
#include <stdlib.h>
|
||||
|
||||
/**
|
||||
* 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
|
|
@ -0,0 +1,70 @@
|
|||
#ifndef __IN303_HUFTREE_H__
|
||||
#define __IN303_HUFTREE_H__
|
||||
|
||||
#include <stdlib.h>
|
||||
|
||||
/**
|
||||
* 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
|
|
@ -1,4 +1,4 @@
|
|||
#include "../include/common.h"
|
||||
#include "common.h"
|
||||
#include <stdarg.h>
|
||||
#include <stdio.h>
|
||||
|
||||
|
|
|
@ -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 <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
#include "../include/display.h"
|
||||
#include "../include/common.h"
|
||||
#include "display.h"
|
||||
#include "common.h"
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <locale.h>
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
#include "../include/huftree.h"
|
||||
#include "../include/common.h"
|
||||
#include "huftree.h"
|
||||
#include "common.h"
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
#include "../include/common.h"
|
||||
#include "../include/compress.h"
|
||||
#include "common.h"
|
||||
#include "compress.h"
|
||||
#include <argp.h>
|
||||
#include <locale.h>
|
||||
|
||||
|
|
Loading…
Reference in New Issue