Ces précisions concernent le début qui concerne...
Les noms longs de MagiC (suite)
Et bien, il ne faut plus les employer avec les noms longs ! Ça a le mérite d'être clair. D'après ce que j'ai compris c'est tabou ("tabu" en teuton) donc strictement interdit. De nouvelles fonctions existent depuis la version 0.90 de MiNT, pour nous il suffira de tester si on a une version de l'AES égale ou supérieure à 3.99, puisque MagiC (se voulant compatible avec MultiTOS) possède ces fonctions.
Ces nouvelles fonctions (provenant de MiNT, donc d'Unix) ont la caractèristique de considérer la FAT comme une réserve de simples fichiers. On peut trouver à côté de vieilles fonctions comme Dcreate (MKDIR ou GEMDOS(57)) :
Dopendir | dirhandle%=GEMDOS(296,L:ad_nom_dir%,W:flag&) ad_nom_dir% est l'adresse de la chaîne (terminée par un nullbyte) du chemin (sans le \ de fin), flag& est à 0 pour avoir le mode compatible (l'autre valeur est 1 pour Unix), dirhandle% est le handle du dossier ouvert (comme un fichier normal ou une fenêtre, quoi) |
Dclosedir | ~GEMDOS(299,L:dirhandle%) Comme on est propre sur soi et qu'on respecte le système, il faut toujours fermer ce qu'on a ouvert, c'est la même chose pour un fichier normal ou une fenêtre. |
Dxreaddir | retour%=GEMDOS(322,W:taille_buffer&,L:dirhandle%,L:ad_buffer%,L:attr%,L:xr%)
Avec cet appel, le GEMDOS va lire la (V)FAT et déposer dans la zone mémoire
ad_buffer% de taille taille_buffer&, le nom du fichier (qu'il soit long ou pas). Si la
longueur de la chaîne de caractère est supérieure à la taille du
buffer, retour% prend une valeur particulière. Si tous se passe bien, la fonction
renvoie 0. Autre chose importante, la fonction charge également les attributs du fichier dans une structure XATTR qui est de la forme :
typedef struct xattr { UWORD mode; /* Dateimodus */ LONG index; /* Dateinummer */ UWORD dev; /* Gerätenummer */ UWORD reserved1; /* reserviert */ UWORD nlink; /* Anzahl der Links */ UWORD uid; /* Benutzernummer */ UWORD gid; /* Gruppennummer */ LONG size; /* Dateilänge */ LONG blksize, nblocks; /* Blockgröße/belegte Blocks */ UWORD mtime, mdate; /* Datum der letzten Änderung */ UWORD atime, adate; /* Datum des letzten Zugriffs */ UWORD ctime, cdate; /* Erstellungsdatum */ UWORD attr; /* TOS-Dateiattribute */ UWORD reserved2; /* reserviert */ LONG reserved3[2]; /* reserviert */ } XATTR;Remarquez que cette structure contient l'attribut du fichier tel qu'on le connait dans le vieux TOS. Si l'offset +30 de l'adresse xattr% contient :
|
Drewinddir | ~GEMDOS(298,L:dirhandle%) Revenir en début de liste ! |
Voilà, dommage que Fsfirst et Fsnext sont interdites, car elles nous aidaient bien pour
le filtrage des fichiers ! Il faut donc le faire à la main. Voici donc, plus ou
moins traduit en GFA de la doc-dev "officielle" de MagiC (écrite par Andreas Kromke
himself) comment on fait :
dirhandle%=@Dopendir(adr_nom_dir%,0) IF dirhandle%>0 DO retour%=@Dxreaddir(taille_buffer&,dirhandle%,adr_buffer%,xattr%,xr%) ' ' ici, test de INT{xattr%+30} (me suis-je trompé dans les offsets ?) pour ' déterminer la nature du fichier, éventuel filtrage : recherche de ' chaîne (utilisez UPPER$() pour éviter les problèmes de casse) ' puis ' indexation dans une liste qu'on conservera ou traitement immédiat ' on récupère la chaîne de texte avec a$=CHAR{adr_buffer%} ' LOOP UNTIL retour%<>0 ~@Dclosedir ENDIFNB : Il est clair qu'on a alloué de la mémoire pour les buffers (adr_nom_dir%, adr_buffer%, xattr%), que les chaînes se terminent par des nullbytes, et que les fonctions sont quelques part sous la forme de GEMDOS(numéro,paramètres... quelque part dans votre programme GFA.
Je rappelle que tous cela n'a pas été vérifié, seulement tiré et déduit des docs que j'ai en ma possession.
Petite gâterie
FUNCTION cab_win ' ' on récupère l'ap_id& de CAB ' survey_bro&=APPL_FIND("CAB ") ' ' à qui appartient la fenêtre active ? sinon on récupère le ' handle (below_win%) de la fenêtre juste en dessous ' ~WIND_GET(0,10,win%,app%,below_win%,dummy%) ' ' IF app%=survey_bro& ! bingo c'est la première ' ' je teste les composantes, car celle que je veux a le bouton "fuller" ' ~WIND_GET(win%,1,comp_win%,dummy%,dummy%,dummy%) IF BTST(comp_win%,2) RETURN win% ENDIF ENDIF ' ' je teste à qui appartiennent les fenêtre en dessous ' WHILE WIND_GET(below_win%,20,app%,dummy%,dummy%,win%) IF win%=0 RETURN 0 ENDIF IF app%=survey_bro& ~WIND_GET(below_win%,1,comp_win%,dummy%,dummy%,dummy%) IF BTST(comp_win%,2) RETURN below_win% ENDIF ENDIF below_win%=win% WEND RETURN 0 ENDFUNCLa fonction renvoie 0 si échec, ou le handle% de la fenêtre. Attention, ça ne marche que si une seule fenêtre de navigation de CAB est ouverte. S'il y en a plusieurs, c'est la première en avant plan qui sera prise.
cab_win%=@cab_win IF cab_win%>0 AND cab_win%<32000 INT{m_adr%}=27 ! WM_SIZED INT{m_adr%+2}=ap_id_de_joe& ! on s'identifie INT{m_adr%+4}=0 INT{m_adr%+6}=cab_win% INT{m_adr%+8}=screenx&+1 ! x INT{m_adr%+10}=screeny&+202 ! y INT{m_adr%+12}=screenl&-4 ! largeur INT{m_adr%+14}=screenh&-205 ! hauteur ~APPL_WRITE(survey_bro&,16,m_adr%) ENDIFm_adr% est un buffer de 16 octets qui est rempli comme le remplirait le Screen Manager (Vous savez, l'application invisible dont l'ap_id& est toujours 1, qui gère tout l'AES). C'est au tour de CAB d'accepter ou non le message. Je vous conseille de mettre l'ap_id& de votre programme plutôt que 1, car c'est malpoli de se faire passer pour quelqu'un d'autre.
Petite gâterie (bis)
PROCEDURE force_drive(force_drive$) INT{m_adr%}=72 INT{m_adr%+2}=ap_id& INT{m_adr%+4}=0 INT{m_adr%+6}=MAX(0,MIN(ASC(force_drive$)-65,25)) INT{m_adr%+8}=0 INT{m_adr%+10}=0 INT{m_adr%+12}=0 INT{m_adr%+14}=0 ~APPL_WRITE(0,16,m_adr%) RETURNforce_drive$ contient la lettre correspondant au disque logique (A pour le lecteur, C pour la partiction C:, etc...), c'est en fait un LEFT$(chemin$) qui est envoyé à cette fonction.
A bientôt pour de nouvelles aventures !
Ce n'est pas donné à tout le monde de connaître sa machine.
Rajah Lone
nef@mygale.org
écrit le 9 Mars 1998