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 : ARexx - Catalogue d'un disque (deuxième partie)
(Article écrit par François Gueugnon et extrait d'Amiga News Tech - novembre 1991)
|
|
Dans le chapitre précédent, nous avons écrit et expliqué le
premier module (Repertoire) de notre projet d'édition du catalogue du disque de notre choix. Nous nous attaquons
aujourd'hui au second module (Traitement).
Rappelons que ce premier module permettait d'obtenir de manière quasi-certaine, c'est-à-dire sans risque d'erreur,
le nom du disque dont on désire obtenir le catalogue, ce nom pouvant être logique (par exemple, Arexx:)
ou bien physique (par exemple, DH0:). Mais afin de permettre l'interfaçage entre les deux modules, nous
proposons une petite, toute petite, modification. Il s'agit d'ajouter juste avant l'instruction EXIT les
deux instructions PUSH suivantes :
PUSH device
PUSH 'rx ram:Traitement'
EXIT /* Ligne 48 du module précédent */
|
Ces deux instructions "poussent" dans la pile de la console, d'une part la variable ARexx "device"
(qui contient la définition du disque choisi) et d'autre part, une instruction du type CLI, Shell ou ConMan.
Voici alors ce qui va se passer (on supposera que le nom du programme décrit ci-après est "Traitement"
et qu'il est placé en RAM:).
Il faut d'abord lancer le premier programme, qui va obtenir le nom légal du disque à analyser. A la
fin de ce programme, juste avant EXIT, ces deux instructions vont pousser dans la pile le nom du disque
à analyser et celui du programme qui devra le faire. Notons en passant que ces deux instructions
appartiennent chacune à des mondes différents. Dès la sortie par EXIT, la main revient à l'hôte,
ici la console. L'instruction rx ram:Traitement, insérée en dernier par PUSH, est celle qui
va être rappelée la première (différence entre PUSH et QUEUE). C'est une instruction légale pour la
console, elle lance donc le programme ARexx Traitement.
Dans ce programme qui prend alors la main, la première instruction est PULL nomvariable ;
cette instruction extrait de la pile celle qui reste, à savoir le nom du disque à traiter. Voici
donc une particularité intéressante qui permet de passer à peu près n'importe quoi d'un programme à
un autre, sans égard pour la différence des types de programme.
Programme Traitement
Ce programme permet d'obtenir le répertoire du disque précédemment défini avec la longueur de chaque fichier.
Voici son mécanisme :
- En utilisant la fonction "dir opt a" du DOS, création d'un fichier en RAM: nommé "repertoire".
- Analyse ligne par ligne de ce fichier et obtention de la taille de chaque entrée.
- Création d'un fichier en RAM: nommé "resul" comprenant les indications nécessaires au prochain
programme pour afficher notre forme personnelle du répertoire.
Note : on aurait pu utiliser les fonctions spécialisées d'ARexx pour obtenir le répertoire
désiré (en l'occurrence, la fonction DIR). Nous avons bien précisé que nous ne cherchions qu'à montrer
des fonctionnements et des mécanismes !
Pour analyser le fichier placé en RAM, il faut en connaître la structure. C'est un fichier texte, dans
lequel chaque ligne peut contenir soit un nom de répertoire, soit deux noms de fichiers. Le décalage
des répertoires entre eux, selon leur rang, est de cinq caractères, le premier étant à trois
caractères de la marge gauche. Les fichiers d'un répertoire sont décalés de deux caractères à droite.
C'est le calcul de la position du répertoire qui donne son rang et les fichiers qui lui sont affectés.
Il faut donc retenir les différentes positions pour affecter correctement les fichiers aux répertoires,
surtout en revenant d'un emboîtement de répertoires ! Les fichiers, eux, sont placés à raison de deux
par ligne, lorsque le nombre est pair. Dans le cas contraire, il n'y en a qu'un. Un intitulé de fichier
peut contenir des espaces ce qui leurre ARexx, qui l'interprète comme un séparateur. En conséquence,
l'extraction des fichiers se fera par position, car elle reste heureusement constante.
Enfin, le fichier résultat aura une forme particulière. Ce sera une chaîne de caractères contenant toutes
les informations nécessaires, concaténées sans espaces et avec des séparateurs spécifiques. Cette chaîne
sera construite par concaténations consécutives des valeurs utiles dès leur obtention.
Avertissement : une erreur de programmation initiale fait que la chaîne finale n'a pas tout à fait
la régularité souhaitée. Au moment d'effectuer la correction, nous avons pensé tirer parti de la chose en
transformant un bogue en caractéristique ! En effet, dans le programme suivant, nous verrons comment filtrer
et corriger l'erreur. Ceci pour montrer la souplesse des programmes qui peuvent traiter des logiciels
extérieurs sans s'occuper vraiment de la logique matérielle de ces programmes.
Ce programme fait partie d'un tout. On peut toutefois le lancer seul (par exemple, rx ram:traitement) ;
l'instruction PULL en tête attend alors un argument qui aurait été placé dans la pile par le programme précédent.
Comme il n'y est pas, il faut le fournir à partir du clavier. Par exemple, DF1: et puis la touche "Entrée".
Listing du programme
Ce programme est listé ci-dessous. Rappelons que les numéros de lignes n'ont été mis que pour
faciliter la lecture ; il ne faut pas les taper lors de la recopie du programme. Les explications
nécessaires ont été directement incluses dans le listing, mais il semble toutefois utile d'apporter
quelques compléments.
Certaines lignes de programme sont trop longues pour la largeur de la page de l'éditeur utilisé. Dans
ce cas, il est possible de couper la ligne sans affecter son intégrité logique, en plaçant une virgule
à l'endroit de la coupure, suivie bien sûr d'un retour-chariot.
La création d'une chaîne de caractères continue pour matérialiser le résultat est totalement arbitraire.
Mais cela représente une bonne introduction à la lecture de chaînes qui n'ont pas de sens ASCII,
c'est-à-dire du code ou tout autre chose, dans lesquelles la notion de ligne n'a pas de sens. C'est
un des aspects sympathiques et uniques d'ARexx de traiter uniquement des caractères.
Dans ce programme, nous voyons comment nous pouvons, d'une part, acquérir des noms de répertoires ou de
fichiers, les traiter, mélanger, construire et leur faire subir tout ce qu'on peut effectuer sur des
chaînes de caractères et d'autre part, pourvu qu'ils aient une forme légale, les utiliser comme commandes
par exemple pour changer de répertoire !
Enfin pour passer des éléments : variables, chaînes, valeurs, tableaux, commandes, etc., nous
avions utilisé et nous utilisons encore cette fois-ci, le passage par la pile. Cependant, nous avons
ici utilisé concurremment une autre méthode qui s'apparente aux POKE et PEEK du BASIC, avec cette différence
essentielle toutefois que l'opération se fait au travers de l'allocateur général de l'Amiga et qu'en
conséquence, il n'y a pas de risque d'écraser un espace occupé par quelqu'un d'autre, non plus que de
risquer pour soi les mêmes déboires. Dans le présent programme, nous n'avons pas pris la précaution de
vérifier que l'allocation avait été correctement effectuée en regardant le RC (pour Return Code),
ce qui est imprudent en milieu multitâche.
Cette allocation survient à la fin du programme demandeur d'allocation. Cela impose de gérer la désallocation
lorsque il n'est plus utile de conserver cet espace. L'instruction est FREESPACE(adresse,taille),
d'où la nécessité de passer ces valeurs aux programmes utilisateurs.
|