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 : Assembleur - XPK et ARexx : l'interrogation d'ARexx
(Article écrit par Frédéric Delacroix et extrait d'Amiga News - janvier 1997)
|
|
Dans notre exemple d'écriture d'une
bibliothèque ARexx, nous en sommes arrivés à la disposition de la fonction d'interrogation d'ARexx. Je vais maintenant vous
décrire dans les détails le travail de cette fonction, et nous aborderons également la programmation de XPK.
En avant !
Nous en étions au point où ARexx appelle la fonction d'interrogation à la recherche d'une
fonction qu'il cherche à localiser. Le registre A0 contient alors une structure RexxMsg telle qu'on l'a vue le mois dernier. Dans
cette structure (qui n'est pas à considérer comme une structure Message : surtout pas de GetMsg()), le champ le plus important dans
notre cas est le premier argument : rm_Args (aussi appelé Arg0). Il contient le nom de la fonction qu'ARexx recherche, sous forme
d'une ArgString. Notre fonction doit donc comparer cet argument avec les noms de fonctions de notre bibliothèque.
A partir de là, de deux choses l'une : ou la fonction est connue, ou elle ne l'est pas. Dans les deux cas, il ne faudra surtout pas
modifier la structure RexxMsg ni les Argstrings associés : elles serviront à d'autres appels de bibliothèques de la part d'ARexx.
Si la fonction demandée est inconnue, on doit retourner 1 en D0 (ce qui correspond à l'erreur "Program not found"). ARexx sait alors
qu'il doit continuer sa recherche. Si, par contre, la fonction est connue, il nous faut d'exécuter. Pour cela, les différents
arguments passés à la fonction se trouve dans les autres champs du tableau d'Argstrings rm_Args, le nombre d'arguments donnés étant
dans l'octet de poids faible de rm_Action (soit dans l'octet rm_Action+3). Ce nombre inclut les arguments passés en tant que valeurs
par défaut, auquel cas le pointeur correspondant est nul, mais n'inclut pas Arg0 (le nom de la fonction).
Une fois la fonction exécutée, on doit retourner 0 en D0 (ce qui indique l'absence d'erreur) et le résultat sous forme d'ArgString en
A1. C'est du moins ce que dit la doc officielle, il semble que ce soit plutôt en A0. Soyons prudent : à la fois en A0 et A1. La
création d'une telle ArgString se fait très simplement grâce à la fonction CreateArgsting() de la rexxsyslib.library et consorts.
Si une erreur s'est produite, le code de l'erreur est à retourner en D0 (par exemple : 17=nombre d'arguments incorrects), mais il
ne faut pas renvoyer de résultat. N'oubliez pas non plus que le code 1 est réservé à un usage particulier.
L'exemple
Dans notre exemple, tout ceci est accompli en scrutant une table, de façon à rendre le programme très extensible, même si dans la
version que je vous présente ici, seules les fonctions PackFile() et UnpackFile() sont présentes. La documentation est au format
"autodoc", de sorte que vous pourrez, grâce à l'utilitaire "autodoc" (fourni sur le CD Developer Kit), extraire la dite documentation
du source, et éventuellement la convertir au format AmigaGuide grâce à AD2AG :
autodoc -t8 -s -l RexxXPK.s >rexxxpk.doc
ad2ag rexxxpk.doc
|
Je vous laisse donc avec la fin du programme entamé le mois dernier qu'il suffit de taper à la suite. Examinez également les
prochaines disquettes de la collection DPAT, dans lesquelles vous retrouverez cette bibliothèque rexxxpk.library (ou une
version améliorée) et quelques scripts ARexx utiles (comme un script permettant d'ouvrir et sauvegarder des fichiers compressés
avec XPK dans l'éditeur CygnusEd 3.5).
En attendant, cet exemple-ci devrait vous permettre de tester la bibliothèque. Le mois prochain, programmation de XPK
avec un autre exemple.
|