#include "../include/common.h" #include "../include/compress.h" #include #include /** * Définition de la configuration de Argp, qui affichera * ces informations dans la page d'aide entre autres */ static char doc[] = "Compresse ou décompresse des fichiers en " "utilisant l'algorithme de Huffman"; static char args_doc[] = "FICHIER..."; static struct argp_option options[] = { { "verbose", 'V', 0, 0, "Afficher des informations de débogage sur la compression" }, {0} }; /** * Contient les valeurs des arguments (options et opérandes) * passées au programme et interprétées via Argp */ typedef struct Args { int verbose; char **files; } Args; /** * Fonction de rappel pour interpréter les arguments * passés au programme */ static error_t parse_opt(int key, char *arg, struct argp_state *state) { Args *args = state->input; switch (key) { case 'V': args->verbose = TRUE; break; case ARGP_KEY_ARG: // Consommation de tous les fichiers en argument // et arrêt du parsage args->files = &state->argv[state->next - 1]; state->next = state->argc; break; case ARGP_KEY_NO_ARGS: argp_usage(state); break; default: return ARGP_ERR_UNKNOWN; } return 0; } static struct argp argp = {options, parse_opt, args_doc, doc}; int main(int argc, char** argv) { // Pour pouvoir afficher des caractères larges dans le terminal setlocale(LC_CTYPE, ""); // Interprétation des arguments passés au programme par Argv, // suivant la configuration définie au dessus Args args; args.verbose = FALSE; args.files = NULL; argp_parse(&argp, argc, argv, 0, 0, &args); // Passage en mode verbeux si demandé setVerbose(args.verbose); // Compression de chaque fichier en argument char** filepath = args.files; while (*filepath != NULL) { compress(*filepath); filepath++; } }