Cette fois-ci, on va parler des noms de fichiers longs gérés par MagiC 5. Enfin, pas quelque chose d'officiel ; je vais juste raconter ce qui m'est arrivé pour pouvoir gérer les noms longs pour la version 1.30 de mon Joe adoré.
Malheur ! mais c'est compatible !
Mais il y a un hic...
' ' n$ est une chaine C, se terminant par un nullbyte ' FUNCTION s_exist(n$) IF LEN(n$)=0 RETURN FALSE ELSE IF GEMDOS(78,L:V:n$,0)=0 ! =FSFIRST(fichier) RETURN TRUE ELSE RETURN FALSE ENDIF ENDIF ENDFUNC
Qui ne marche toujours pas avec les noms longs. S_exist revoie FALSE, ce qui fait dire que
les fonctions FSFIRST et FSNEXT ne peuvent utiliser que les noms 8+3 de MSDOS. Je suppute
que les auteurs de MagiC ont bricolé des fonctions permettant le passage des noms longs
aux 8+3 et inversement. L'avenir nous le dira.
Pour avoir toujours notre EXIST, bien utile en GFA, il faut ruser. Les adeptes C ne l'utilisent
jamais, parce que seule la fonction GEMDOS(61) est nécessaire. Si le fichier n'existe
pas, le GEMDOS renvoie une valeur négative pour le handle (équivalent du
#numéro du GFA) signifiant qu'il y a un problème.
Qu'à cela ne tienne, on va pomper sur le C :
' ' le nom de fichier doit se terminer ici par un nullbyte comme en C. ' pour ceux que ça gène, faire terminer par un nullbyte ' le nom dans le GEMDOS(61) ' FUNCTION s_exist(exist_name$) LOCAL existe& IF LEN(exist_name$)=0 OR exist_name$=CHR$(0) RETURN FALSE ELSE existe&=GEMDOS(61,L:V:exist_name$,W:0) ! on ouvre IF existe&>0 ! si c'est positif ~GEMDOS(62,W:existe&) ! on renferme RETURN TRUE ! et on dit que c'est bon ELSE ! si problème RETURN FALSE ! on dit qu'il n'y a rien ENDIF ENDIF ENDFUNCEt après on peut ouvrir le fichier avec le nom long.
Mais comment obtient-on ces noms longs de fichiers ?
VA_START
C'est une méthode par tube GEM (donc interapplication, vive le multitache) qui constiste à se passer des noms de fichiers entre programmes. Magxdesk, entre autres, en fait une grande utilisation (tout comme Joe avec CAB, vous croyez comment qu'il l'appelle quand les deux sont déjà en mémoire ?). Donc, pour prendre exemple avec Joe et CAB,
du côté de Joe
n_adr%=GEMDOS(72,L:LEN(n$)) buf_adr%=GEMDOS(72,L:16) ap_id_cab&=APPL_FIND("CAB ") INT{buf_adr%}=18193 ! VA_START INT{buf_adr%+2}=ap_id_joe& LONG{buf_adr%+6}=n_adr% ! adresse où se trouve la chaine du nom de fichier ~APPL_WRITE(ap_id_cab&,16,buf_adr%)
Et du côté de CAB
evnt&=EVNT_MULTI(.....buf_msg%.... IF BTST(evnt&,4) SELECT INT{buf_msg%} CASE 10 gestion_menu CASE 20 redraw CASE 18193 appel_par_va_start ENDSELECT ENDIF et plus loin dans CAB... PROCEDURE appel_par_va_start adr_nom%=LONG{buf_msg%+6} ap_id_prg_appelant&=INT{buf_msg%+2} IF adr_nom%>0 ! juste un petite sécurité ' ' on récupère le nom du fichier ' nom_de_fichier$=CHAR{adr_nom%} ' ' on confirme au programme appelant qu'on a récupéré quelque chose ' nettoyage_buf_msg INT{buf_adr%}=18232 ! VA_STARTED INT{buf_adr%+2}=ap_id_prg_appelant& LONG{buf_adr%+6}=adr_nom% ! l'adresse qui nous était donnée par tube GEM ~APPL_WRITE(ap_id_prg_appelant&,16,buf_msg%) ' charger(nom_de_fichier$) ' ENDIF RETURNEt Joe reçoit VA_STARTED par ENT_MULTI et libère la mémoire qu'il a alloué.
le FILESELECTOR de MagiC
Là, on s'amuse. Il existe depuis la version 4 de ce système d'exploitation un sélécteur de fichiers pouvant gérer les noms longs, les sélections multiples, le pré-emptif (on peut appeler le sélecteur de fichiers dans une fenêtre !)... Prière donc d'appeler Application Systems France. Dites leurs que vous programmez sous MagiC (de préférence un petit éditeur HTML nommé Joe) et ils vous envoyent illico presto des docs développeurs (malheureusement en allemand et seulement celles qu'ils ont en stock, mais on peut se débrouiller avec la doc de MagiC 4)...
Ça donne en GFA :
' ' toutes les chaines se terminent par un nullbyte (CHR$(0)) ' PROCEDURE fslx_do(fi_titre$,fi_path$,fi_name$,fi_masque$,VAR fs_name$) ' rub$=fi_path$+"U:\"+CHR$(0)+"C:\CLIPBRD\"+CHR$(0)+CHR$(0) ' ' fi_masque$ et rub$ sont des chaines C, chaque ligne se termine par un nullbyte, ' la chaine totale se termine par deux nullbytes ' fi_path$=fi_path$+SPACE$(300) ! de la place fi_name$=fi_name$+SPACE$(100) ! écartez-vous ' GCONTRL(0)=194 ! nouvelle fonction AES GCONTRL(1)=4 ! avec tout ses paramètres GCONTRL(2)=4 GCONTRL(3)=6 GCONTRL(4)=2 ' GINTIN(0)=128 ! longueur du chemin dans la boite du fileseletor GINTIN(1)=33 ! longueur du nom de fichier (dans le chemin) dans le fileselector GINTIN(2)=0 GINTIN(3)=0 ' ADDRIN(0)=V:fi_titre$ ! titre de la boite ADDRIN(1)=V:fi_path$ ! nom du chemin ADDRIN(2)=V:fi_name$ ! nom du fichier sans le chemin ADDRIN(3)=V:fi_masque$ ! masques possibles (prière de voir la doc) ADDRIN(4)=0 ADDRIN(5)=V:rub$ ! chemins par défaut ' GEMSYS ' fsd%=ADDROUT(0) ! on récupère un identificateur qui ' servira à fermer le FILESELECTOR (c'est un handle) IF GINTOUT(1)=1 ! si l'appel a marché ' on récupère le nom de fichier (avec chemin) fs_name$=CHAR{V:fi_path$}+CHAR{V:fi_name$}+CHR$(0) ELSE fs_name$=CHR$(0) ENDIF ' IF GINTOUT(0) ! on referme proprement l'appel GCONTRL(0)=191 ! c'est en fait fslx_close() GCONTRL(1)=0 GCONTRL(2)=1 GCONTRL(3)=1 GCONTRL(4)=0 ' ADDRIN(0)=fsd% ' GEMSYS ENDIF ' RETURN
Avant que j'aille me coucher...
Il y avait :
C'est tout pour ce soir et pour cette fois. Je part au lit, parce que demain, je prend
tôt le TGV pour Paris et le Salon ATARI. Bonne nuit.
Rajah Lone
nef@mygale.org
Le 6 Décembre 1997, 23h40