Obligement - L'Amiga au maximum

Vendredi 23 mai 2025 - 18:41  

Translate

En De Nl Nl
Es Pt It Nl


Rubriques

Actualité (récente)
Actualité (archive)
Comparatifs
Dossiers
Entrevues
Matériel (tests)
Matériel (bidouilles)
Points de vue
En pratique
Programmation
Reportages
Quizz
Tests de jeux
Tests de logiciels
Tests de compilations
Trucs et astuces
Articles divers

Articles in English


Réseaux sociaux

Suivez-nous sur X




Liste des jeux Amiga

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


Trucs et astuces

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


Glossaire

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


Galeries

Menu des galeries

BD d'Amiga Spécial
Caricatures Dudai
Caricatures Jet d'ail
Diagrammes de Jay Miner
Images insolites
Fin de jeux (de A à E)
Fin de Jeux (de F à O)
Fin de jeux (de P à Z)
Galerie de Mike Dafunk
Logos d'Obligement
Pubs pour matériels
Systèmes d'exploitation
Trombinoscope Alchimie 7
Vidéos


Téléchargement

Documents
Jeux
Logiciels
Magazines
Divers


Liens

Associations
Jeux
Logiciels
Matériel
Magazines et médias
Pages personnelles
Réparateurs
Revendeurs
Scène démo
Sites de téléchargement
Divers


Partenaires

Annuaire Amiga

Amedia Computer

Relec


A Propos

A propos d'Obligement

A Propos


Contact

David Brunet

Courriel

 


Programmation : Assembleur/C - La requête de fichiers de la arp.library
(Article écrit par Dominique Genot et extrait d'Amiga News Tech - janvier 1991)


Chaque programmeur se heurte un jour ou l'autre au problème qui consiste à demander à l'utilisateur du programme le nom d'un fichier : chargement, sauvegarde, données...

Cette interaction est une des routines de base de la arp.library ; elle s'appelle FileRequest (requête de fichiers). Tout le monde a déjà vu cette routine en action : elle ouvre une fenêtre munie de trois gadgets booléens (Ok, Parent, Cancel), d'un gadget vertical proportionnel pour visualiser tous les répertoires et fichiers du chemin courant, et de deux gadgets de chaîne pour entrer au clavier le nom du chemin et celui du fichier, on peut aussi cliquer sur le bouton droit de la souris pour changer de disque. C'est cette requête qui s'ouvre quand on demande à charger un fichier avec l'assembleur Devpac. Ceux qui ont déjà programmé cette requête savent que cela prend du temps pour une tâche finalement triviale et fastidieuse. Celui-ci est-il au moins simple à utiliser ? La réponse est oui... (ouf !).

La seule chose nécessaire est bien entendu la bibliothèque ARP qui est dans le domaine public et qui se trouve dans le tiroir "Libs:" de beaucoup d'utilitaires courants (comme Devpac), Il suffit de la copier dans le tiroir "Libs:" de sa disquette système. On peut en connaître la version en tapant sous CLI "version arp.library". Les sources qui suivent sont valables pour la version 34.1 et au-delà.

Deux types de sources sont donnés : en C (Lattice 4.01) et en assembleur (Devpac 2), ce qui devrait satisfaire la plupart des programmeurs (pour le GFA Basic, voir cet article).

Programmation en C

Cela va nous permettre de préciser les structures nécessaires. En effet, ouvrir la requête, c'est bien, récupérer les réponses, c'est mieux ! Une seule structure est ici nécessaire : elle s'appelle FileRequester et elle décrit les caractéristiques de la fenêtre que l'on veut ouvrir :

assembleur

Ce qui est directement utilisable :
  • fr_titre est un pointeur sur la chaîne qui contient le titre voulu pour la requête (du style "Ma Requête" pour rester traditionnel...).
  • fr_file est un pointeur sur un tampon mémoire qui contiendra au retour le nom du fichier choisi (plus un octet à 0).
  • fr_dir est un pointeur sur un tampon mémoire qui contiendra le nom du chemin.
  • fr_window permet de choisir la fenêtre Intuition dans laquelle s'ouvrira la requête. Si on met à 0 ce pointeur, la requête s'ouvre alors dans la fenêtre active au moment de l'appel. Si on a ouvert sa propre fenêtre Intuition par l'instruction "Window=OpenWindow(&NewWindow);", on pourra fixer ce pointeur par "Freq.fr_window=Window;"
  • fr_reserved2 est un long mot qui, dans les versions ultérieures (au-delà de 34.1) indique la position du coin supérieur gauche de la requête (par rapport au coin supérieur gauche de l'écran ?). Il est alors décomposé comme suit :
UWORD fr_leftedge /* marge gauche */
UWORD fr_topedge /* hauteur du coin */

Quand cette structure est définie et initialisée, y compris les tampons nécessaires :

char fname[80]; /* 79 octets +0 pour le nom de fichier */
char dirname[120]; /* idem pour le nom du chemin */
char nom_complet[200]; /* pour le nom complet */

Il faut préciser le décalage de la routine FileRequest avec une instruction pragma au début du source :

#pragma libcall ArpBase FileRequest 126 801

Ceci correspond à :

D0 = FileRequest(FileRequester) (A0)

Le décalage de la routine est -$126 dans ArpBase et le registre A0 doit pointer sur la structure FileRequester. En retour, D0 contient 0 s'il y a eu une erreur ou si l'utilisateur a cliqué sur "Cancel". Si tout s'est déroulé normalement, D0 contient l'adresse du tampon qui contient le nom du fichier choisi ("fname" dans le source qui suit).

Voici le programme (sous LATTICE 4.0) :

assembleur

Programmation en assembleur

La structure est la même que précédemment, on la définit sous Devpac avec le compteur interne "rs". Pour la signification de chaque label, voir le paragraphe précédent. Rappelons les conditions d'appel :

FileRequest EQU -$126
D0 = FileRequest(FileRequester) (A0)

Donc A0 doit pointer sur une structure FileRequester et D0 donne le résultat de la demande : D0=0 si "Cancel" ou si un problème fut rencontré, sinon D0 pointe sur le nom du fichier.

Précisons que si une fenêtre Intuition est ouverte, on peut fixer le pointeur "fr_window" pour que la requête s'ouvre dans cette fenêtre.

Exemple :

move.l _intuitionbase,A6   ; la bibliothèque Intuition étant ouverte
lea fenetre,a0             ; structure de la fenêtre à ouvrir
JSR OpenWindow(A6)         ; ->D0=adresse fenêtre ouverte
lea FileReq,a0             ; filerequester à ouvrir
move.l d0,fr_window(A0)   ; initialise le pointeur fr_window

Enfin, si le pointeur "fr_window" est à 0, la requête s'ouvrira dans la fenêtre à partir de laquelle le programme fut lancé (sauf si le programme est lancé sous Devpac, la requête s'ouvre alors dans la fenêtre ouverte par défaut). Voici le source du programme sous Devpac 2 :

#include <exec/types.h>
#include <string.h>
#pragma libcall ArpBase FileRequest 126 801
APTR ArpBase=NULL;
LONG FileRequest();
struct FileRequester
{
UBYTE *fr_titre;	/* texte fenêtre */
UBYTE *fr_file;		/*       filename */
UBYTE *fr_dir;		/*       direname */
struct Window *fr_window; /* Win voulue ou NULL */
UBYTE fr_flags;		/* flags */
UBYTE fr_reserved1;	/* mettre à zéro */
APTR fr_fonction;	/* UserFunction */
LONG fr_reserved2;	/* occupe ! */
};
char fname[80];
char dirname[120];
char nom_complet[200];
LONG reponse;
struct FileRequester Freq=
{"        Mon Requester ",fname,dirname,NULL,NULL,NULL,NULL,NULL};
void main()
{
ArpBase=(APTR)OpenLibrary("arp.library",0);
if (ArpBase==NULL)
	exit(FALSE);
reponse=FileRequest(&Freq);
CloseLibrary(ArpBase);
if(reponse)
	{
	printf("\n Vous avez choisi comme chemin '%s'",dirname);
	printf("\n Vous avez choisi comme fichier '%s'",fname);
	strmfp(nom_complet,dirname,fname);
	printf("\n Le nom complet est '%s'\n",nom_complet);
	}
}

Mise à jour de mai 2025 : une archive contenant le listing adapté à vbcc, et avec l'exécutable compilé par vbcc, a été réalisée par Yann-Gaël Guéhéneuc et est disponible sur obligement.free.fr/files/antarpfilerequester.lha.

Comme les deux sources le montrent, il ne faut pas oublier de "coller" le nom du répertoire et celui du fichier pour avoir le nom complet (en ajoutant un "/" si nécessaire).


[Retour en haut] / [Retour aux articles]