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