Accepte les options via Argp
This commit is contained in:
parent
c142d06464
commit
2b3162cd66
89
src/main.c
89
src/main.c
|
@ -1,20 +1,85 @@
|
||||||
|
#include "../include/common.h"
|
||||||
#include "../include/compress.h"
|
#include "../include/compress.h"
|
||||||
#include <stdio.h>
|
#include <argp.h>
|
||||||
|
#include <locale.h>
|
||||||
|
|
||||||
int main(int argc, const char** argv) {
|
/**
|
||||||
if (argc != 2) {
|
* Définition de la configuration de Argp, qui affichera
|
||||||
fprintf(stderr, "Utilisation : compress <source>\n");
|
* 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");
|
* Contient les valeurs des arguments (options et opérandes)
|
||||||
} else {
|
* passées au programme et interprétées via Argp
|
||||||
fprintf(stderr, "Trop de paramètres.\n");
|
*/
|
||||||
}
|
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;
|
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++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue