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
ENDFUNC
Et 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
RETURN
Et 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