From 2b3162cd66639871002a34e5b2729d0da71f17bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matt=C3=A9o=20Delabre=20=E2=9C=8F?= Date: Sat, 22 Oct 2016 02:56:35 +0200 Subject: [PATCH] Accepte les options via Argp --- src/main.c | 89 ++++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 77 insertions(+), 12 deletions(-) diff --git a/src/main.c b/src/main.c index 7180831..ffcfe1b 100644 --- a/src/main.c +++ b/src/main.c @@ -1,20 +1,85 @@ +#include "../include/common.h" #include "../include/compress.h" -#include +#include +#include -int main(int argc, const char** argv) { - if (argc != 2) { - fprintf(stderr, "Utilisation : compress \n"); +/** + * 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[] = { + { + "debug", 'd', 0, 0, + "Afficher des informations de débogage sur la compression" + }, + {0} +}; - if (argc == 1) { - fprintf(stderr, "Paramètre fichier manquant.\n"); - } else { - fprintf(stderr, "Trop de paramètres.\n"); - } +/** + * 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; - return 1; +/** + * 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 'd': + 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; } - compress(argv[1]); - 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++; + } +}