151 lines
5.5 KiB
C
151 lines
5.5 KiB
C
#include <string.h>
|
|
|
|
#include "liste.h"
|
|
#include "arbre.h"
|
|
|
|
// Affiche le message d'aide.
|
|
void help(char const progName[]);
|
|
|
|
// Ajoute l'extension du fichier compressé au fichier original.
|
|
char *fichierHuff(const char *fichier);
|
|
|
|
int main(int argc, char const *argv[]) {
|
|
/* Morceau de code qui m'a permis de testé `liste.c`
|
|
|
|
Liste l = NULL;
|
|
FILE *f;
|
|
|
|
if ((f = fopen("res_fprintf.txt", "w")) == NULL) {
|
|
printf("Erreur lors de l'ouverture du fichier.\n");
|
|
return 1;
|
|
}
|
|
|
|
ajouterLettre(&l, 'a');
|
|
ajouterLettre(&l, 'c');
|
|
ajouterLettre(&l, 'c');
|
|
ajouterLettre(&l, 'b');
|
|
ajouterLettre(&l, 'b');
|
|
ajouterLettre(&l, 'b');
|
|
ajouterLettre(&l, 'b');
|
|
ajouterLettre(&l, 'c');
|
|
ajouterLettre(&l, 'e');
|
|
trierListe(&l);
|
|
|
|
Cellule *c = allouerCellule('x');
|
|
c->frequence=2;
|
|
ajouterRangee(&l, c);
|
|
|
|
|
|
ajouterLettre(&l, 'r');
|
|
|
|
Cellule *d = allouerCellule('w');
|
|
ajouterRangee(&l, d);
|
|
|
|
afficherListe(l, f);
|
|
|
|
fclose(f);
|
|
|
|
viderListe(l);
|
|
*/
|
|
|
|
if (argc < 2) { // si aucun argument
|
|
printf("Aucun argument n'a été renseigné.\n");
|
|
help(argv[0]); // affichage du message d'aide
|
|
return 1;
|
|
}
|
|
|
|
if (argc == 2) { // si un seul argument de renseigné
|
|
if (strcmp(argv[1], "--help") == 0 || strcmp(argv[1], "-h") == 0) { // affiche le message d'aide
|
|
help(argv[0]);
|
|
return 2;
|
|
}
|
|
FILE *entree;
|
|
if ((entree = fopen(argv[1], "r")) == NULL) { // ouverture du fichier + gestion erreur
|
|
printf("Erreur lors de l'ouverture du fichier.\n");
|
|
return 1;
|
|
}
|
|
|
|
printf("Compression de %s...\n", argv[1]);
|
|
|
|
char *nomFichierCompressee = fichierHuff(argv[1]);
|
|
FILE *sortie = fopen(nomFichierCompressee, "wb");
|
|
compression(entree, sortie); // compression du fichier
|
|
|
|
fclose(entree); // fermeture du fichier de base
|
|
fclose(sortie); // fermeture du nouveau fichier compressé
|
|
free(nomFichierCompressee); // free du nom car on a utilisé malloc dans `fichierHuff`
|
|
return 0;
|
|
}
|
|
|
|
if (argc > 3) { // s'il y a plus de 3 arguments
|
|
printf("Trop d'arguments renseignés.\n");
|
|
help(argv[0]); // affichage du message d'aide
|
|
return 1;
|
|
}
|
|
|
|
if (strcmp(argv[1], "-d") == 0 && argc == 3) { // s'il y a 3 arguments et que l'option `d` est renseigné
|
|
printf("Décompression de %s...", argv[1]);
|
|
return 0;
|
|
}
|
|
|
|
// Si quelque chose ne s'est pas passé comment prévu
|
|
printf("Arguments incorrect, réessayez.\n");
|
|
help(argv[0]); // affichage du message d'aide
|
|
return 1;
|
|
}
|
|
|
|
void help(char const progName[]) {
|
|
printf("=================================== HUFFMAN ===================================\n");
|
|
printf("-> %s <fichier> || Construit le fichier <fichier>.huff compressé.\n", progName);
|
|
printf("-> %s -d <fichier>.huff || Décompresse le fichier préalabrement compressé.\n", progName);
|
|
printf("-> %s -h, --help || Affiche ce message d'aide.\n", progName);
|
|
printf("===============================================================================\n");
|
|
}
|
|
|
|
char *fichierHuff(const char *fichier) { /* peut posé problème lors de la décompression car on perd définitivement l'extension du fichier originale ? | ajouter un .txt a tous les fichiers sans extensions ?*/
|
|
/*
|
|
Récupération informations concernant la position
|
|
du dernier point et de la taille du nom du fichier.
|
|
*/
|
|
int positionDernierPoint = -1;
|
|
int tailleNomFichier = 0;
|
|
while (fichier[tailleNomFichier] != '\0') {
|
|
tailleNomFichier++;
|
|
if (fichier[tailleNomFichier] == '.') positionDernierPoint = tailleNomFichier;
|
|
}
|
|
|
|
char *resultat;
|
|
if (positionDernierPoint != -1 && tailleNomFichier - positionDernierPoint <= 4) { // s'il y a une extension à la fin du fichier (c-à-d 4 lettres max après le dernier point dans le nom du fichier)
|
|
int tailleNouveauFichier = tailleNomFichier - (tailleNomFichier - positionDernierPoint); // taille fichier sans extension
|
|
|
|
char *fichierSansExtension;
|
|
if ((fichierSansExtension = malloc(tailleNouveauFichier * sizeof(char))) == NULL) { // variable du fichier sans son extension, exemple : `text.txt` devient `text` + gestion erreur
|
|
printf("Erreur lors du malloc qui alloue de l'espace pour le nom du fichier compressé (1).\n");
|
|
exit(1);
|
|
}
|
|
for (int i = 0; i < tailleNouveauFichier; i++)
|
|
fichierSansExtension[i] = fichier[i];
|
|
|
|
if((resultat = malloc((tailleNouveauFichier + 5) * sizeof(char))) != NULL) { // +5 car .huff contient 5 caractères
|
|
resultat[0] = '\0'; // pour être sur que le string est vide
|
|
} else {
|
|
printf("Erreur lors du malloc qui alloue de l'espace pour le nom du fichier compressé (2-1).\n");
|
|
exit(1);
|
|
}
|
|
strcat(resultat, fichierSansExtension); // écrit le nom de l'ancien fichier sans son extension
|
|
|
|
free(fichierSansExtension); // on free le malloc que l'on vient de faire
|
|
} else {
|
|
if((resultat = malloc((tailleNomFichier + 5) * sizeof(char))) != NULL) { // +5 car .huff contient 5 caractères
|
|
resultat[0] = '\0'; // pour être sur que le string est vide
|
|
} else {
|
|
printf("Erreur lors du malloc qui alloue de l'espace pour le nom du fichier compressé (2-2).\n");
|
|
exit(1);
|
|
}
|
|
strcat(resultat, fichier); // écrit le nom de l'ancien fichier complètement
|
|
}
|
|
|
|
strcat(resultat, ".huff"); // ajoute l'extension .huff
|
|
|
|
return resultat;
|
|
}
|