diff --git a/Makefile b/Makefile index d2f077d..efd3ce3 100644 --- a/Makefile +++ b/Makefile @@ -3,11 +3,11 @@ FLAGS=-Wall -std=c99 SRC=src PROG=compress -all: $(SRC)/main.o $(SRC)/freq.o +all: $(SRC)/main.o $(SRC)/huf.o $(CC) $^ $(FLAGS) -o $(PROG) %.o: %.cpp $(CC) $(FLAGS) -c $^ camille: - rm -f $(PROG) *.o *.gch + rm -f $(PROG) **/*.o **/*.gch diff --git a/compress b/compress new file mode 100755 index 0000000..eccd934 Binary files /dev/null and b/compress differ diff --git a/include/huf.h b/include/huf.h new file mode 100644 index 0000000..50a1a73 --- /dev/null +++ b/include/huf.h @@ -0,0 +1,28 @@ +#ifndef __FREQ_H__ +#define __FREQ_H__ + +typedef struct Vertex Vertex; +struct Vertex { + // le double `freq` indique la fréquence d'apparition de la lettre + // du sommet dans le corpus, ou bien la somme des fréquences de ses fils + double frequency; + + // le caractère `value` est le caractère du corpus que ce sommet + // représente (caractère ASCII 0 - 255) + char value; + + // pointe vers le sommet parent à celui-ci (ou bien vers NULL s'il n'a + // pas de parent affecté, comme c'est le cas pour les sommets non-traités + // et pour la racine) + Vertex* parent; +}; + +// calcule un tableau des fréquences des caractères dans le corpus, +// indexé par la valeur numérique ASCII de chaque caractère +double* computeFrequencies(const char* filepath); + +// déduit du tableau de fréquences l'arbre de Huffman, représenté +// par une liste de sommets chaînés +Vertex* buildTree(double* frequencies); + +#endif diff --git a/main.c b/main.c deleted file mode 100644 index 9185482..0000000 --- a/main.c +++ /dev/null @@ -1,9 +0,0 @@ -#include "freq.h" -#include - -int main(int argc, char** argv) { - if (argc != 2) { - printf("Usage : compress \n") - printf("Paramètre fichier manquant.\n"); - } -} diff --git a/src/freq.c b/src/freq.c deleted file mode 100644 index b27e328..0000000 --- a/src/freq.c +++ /dev/null @@ -1,29 +0,0 @@ -#include "freq.h" -#include -#include - -double* computeFreq(const char* filepath) { - double* freq = (double*) malloc(256 * sizeof(double)); - int totalChars = 0; - - // initialisation du tableau à 0 - for (int i = 0; i < 256; i++) { - freq[i] = 0; - } - - // parcours du fichier et comptage des caractères - FILE* file = fopen(filepath, "r"); - char current; - - while ((current = fgetc(file)) != EOF) { - freq[(size_t) current]++; - totalChars++; - } - - // conversion des effectifs en fréquences - for (int i = 0; i < 256; i++) { - freq[i] /= totalChars; - } - - return freq; -} diff --git a/src/freq.h b/src/freq.h deleted file mode 100644 index a44cb1d..0000000 --- a/src/freq.h +++ /dev/null @@ -1 +0,0 @@ -double* computeFreq(const char* filepath); diff --git a/src/freq.o b/src/freq.o deleted file mode 100644 index 2a9d54d..0000000 Binary files a/src/freq.o and /dev/null differ diff --git a/src/huf.c b/src/huf.c new file mode 100644 index 0000000..635508d --- /dev/null +++ b/src/huf.c @@ -0,0 +1,50 @@ +#include "../include/huf.h" +#include +#include + +double* computeFrequencies(const char* filepath) { + double* frequencies = (double*) malloc(256 * sizeof(double)); + int totalChars = 0; + + // initialisation du tableau à 0 + for (int i = 0; i < 256; i++) { + frequencies[i] = 0; + } + + // parcours du fichier et comptage des caractères + FILE* file = fopen(filepath, "r"); + char current; + + while ((current = fgetc(file)) != EOF) { + frequencies[(size_t) current]++; + totalChars++; + } + + // conversion des effectifs en fréquences + for (int i = 0; i < 256; i++) { + frequencies[i] /= totalChars; + } + + return frequencies; +} + +Vertex* buildTree(double* frequencies) { + int vertexCount = 0; + + // on compte le nombre de sommets à allouer + // (uniquement les caractères qui apparaissent au moins une fois) + for (int i = 0; i < 256; i++) { + if (frequencies[i] > 0) { + vertexCount++; + } + } + + // on alloue la place pour 2n + 1 sommets (nombre total + // de sommets dans l'arbre binaire) + Vertex* tree = (Vertex*) malloc((2 * vertexCount - 1) * sizeof(Vertex)); + + // (à faire: algo pour remplir l'arbre) + // (trier le tableau des fréquences ?) + + return tree; +} diff --git a/src/huf.o b/src/huf.o new file mode 100644 index 0000000..0f781c4 Binary files /dev/null and b/src/huf.o differ diff --git a/src/main.c b/src/main.c index e69de29..1e5ae20 100644 --- a/src/main.c +++ b/src/main.c @@ -0,0 +1,24 @@ +#include "../include/huf.h" +#include + +int main(int argc, const char** argv) { + if (argc != 2) { + printf("Usage : compress \n"); + printf("Paramètre fichier manquant.\n"); + return 1; + } + + double* frequencies = computeFrequencies(argv[1]); + double sum = 0; + + for (int i = 0; i < 256; i++) { + if (frequencies[i] != 0) { + sum += frequencies[i]; + printf("%c (%d) : %f\n", i, i, frequencies[i]); + } + } + + printf("Total : %f\n", sum); + + return 0; +} diff --git a/src/main.o b/src/main.o index fac15cc..42f2588 100644 Binary files a/src/main.o and b/src/main.o differ