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 <stdio.h> | ||||
| #include <argp.h> | ||||
| #include <locale.h> | ||||
| 
 | ||||
| int main(int argc, const char** argv) { | ||||
|     if (argc != 2) { | ||||
|         fprintf(stderr, "Utilisation : compress <source>\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++; | ||||
|     } | ||||
| } | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue