Suivez-nous sur X

|
|
|
0,
A,
B,
C,
D,
E,
F,
G,
H,
I,
J,
K,
L,
M,
N,
O,
P,
Q,
R,
S,
T,
U,
V,
W,
X,
Y,
Z,
ALL
|
|
0,
A,
B,
C,
D,
E,
F,
G,
H,
I,
J,
K,
L,
M,
N,
O,
P,
Q,
R,
S,
T,
U,
V,
W,
X,
Y,
Z
|
|
0,
A,
B,
C,
D,
E,
F,
G,
H,
I,
J,
K,
L,
M,
N,
O,
P,
Q,
R,
S,
T,
U,
V,
W,
X,
Y,
Z
|
|
A propos d'Obligement
|
|
David Brunet
|
|
|
|
Programmation : ReadArgs, le traitement efficace des arguments
(Article écrit par Mathias Parnaudeau et extrait de GuruMed.net - décembre 2002)
|
|
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 existe une fonctionnalité puissante d'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 : tapez "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 deux arguments numériques, puis trois 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 abréviation
qui équivaut au nom complet de l'option.
Le source est très court. On remarque les différentes opérations de "cast" (conversion de type) 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 pointera 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 decouverte 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 demande 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 activee\n");
full = 1;
}
if (argarray[3]){
printf("TEXT : Vous avez saisi '%s'\n", (char *)argarray[3]);
}
FreeArgs(rdargs);
rdargs = NULL;
}
}
return 0;
}
|
|