ReadArgs : le traitement efficace des arguments ...
Un article de GuruMed.
ReadArgs : pour ne plus se prendre la tête avec argv
Par Corto
Théorie et principe
Plutôt que de se casser la tête en traitant les arguments avec la classique gestion de argv, savez-vous qu'il exitse une fonctionnalité puissante de l'AmigaDOS qui permet bien plus de souplesse et fait tout le sale boulot ? La fonction ReadArgs formate en effet un tableau d'arguments en fonction d'une chaîne descriptive (template) de cette liste d'arguments. Je m'explique : essayez "copy ?" dans une fenêtre Shell, vous verrez apparaître cette fameuse chaîne d'arguments, avec pour chacun d'eux un nom et des options marquées d'un slash /. Quelle que soit la nature de l'option (texte ou nombre), le tableau contient des entiers longs dont la valeur représente l'adresse du texte ou du nombre en question (notion de pointeurs).
La signification des options est la suivante :
- /M = Multiple : accepte plusieurs arguments
- /A = Always : argument obligatoire
- /S = Switch : si le mot-clé est mentionné, l'option est "activée"
- /K = Key : le mot-clé doit précéder l'argument
- /N = Numeric : l'argument est une valeur numérique
- /T = Toggle : l'argument doit être "yes", "no", "on" ou "off"
- /F = Final : tout ce qui reste de la ligne de commande constitue l'argument
Voir Amiga Guru Book : 17.1.104 page 469 Voir AmigaDOS Voir Autodocs : dos.doc
Mise en oeuvre
Prenons l'exemple de la commande version (essayez "version ?") : NAME,VERSION/N,REVISION/N,FILE/S,FULL/S,RES/S On remarque qu'aucun argument n'est obligatoire. Le premier représente une chaîne qui est le nom du fichier dont l'on souhaite connaître la version. Il y a ensuite 2 arguments numériques puis 3 arguments de type switch, qui agissent comme des drapeaux à deux positions.
Pour notre programme de test (appelé readargs), on ne va pas singer le modèle d'arguments de la commande version. On choisira quatre arguments de type différent : FILE/A : on oblige la saisie d'une chaîne, désignant typiquement le fichier à traiter par le programme. VERSION/N/K : c'est juste pour tester le type numérique ; la présence du /K nous forcera à écrire "version" dans la chaîne d'arguments. FULL/S : ce drapeau prend une valeur différente de 0 si le mot-clé ("full" dans ce cas) se trouve dans la ligne de commande. TXT=TEXT/K : le /K demande là encore de spécifier le nom de l'option dans la ligne de commande. Ici le nom est "text" ou encore "txt" car le signe d'égalité permet de déclarer une abbréviation qui équivaut au nom complet de l'option.
Le source est très court. On remarque les différentes opérations de cast suivant le type du paramètre à récupérer. On notera aussi que la structure récupérée par ReadArgs doit être libérée par FreeArgs. Mais attention, si vous effectuez un FreeArgs avant l'appel des fonctions de traitement de votre programme, le contenu de argarray ne pointra plus sur des données valides !!
Dernière recommandation : si vous ajoutez des paramètres à votre programme, pensez à augmenter la taille du tableau argarray en conséquence.
#include <stdio.h>
#include <proto/dos.h>
static long argarray[4];
struct RDArgs *rdargs = NULL;
int main(int argc, char **argv){
int *version;
char *argstring = "FILE/A,VERSION/N/K,FULL/S,TEXT/K";
int full = 0;
if (argc <= 1){
printf("Usage : %s %s\n", argv[0], argstring);
}else{
printf("%s - Programme de découverte de ReadArgs\n", argv[0]);
rdargs = ReadArgs(argstring, argarray, NULL);
if (rdargs == NULL){
printf("Erreur dans le traitement des arguments\n");
printf("Usage : %s %s\n", argv[0], argstring);
}else{
if (argarray[0]){
printf("FILE : Vous avez demandé le traitement de '%s'\n", (char *)argarray[0]);
}
if (argarray[1] != 0L){
version = (int *)argarray[1];
printf("VERSION : %d\n", *version);
}
if (argarray[2]){
printf("FULL : option FULL activée\n");
full = 1;
}
if (argarray[3]){
printf("TEXT : Vous avez saisi '%s'\n", (char *)argarray[3]);
}
FreeArgs(rdargs);
rdargs = NULL;
}
}
return 0;
}
