Index des articles > Programmation > Tuto sur les fichiers TI avec vat.h (Auteur: Benjy)

Tuto sur les fichiers TI avec vat.h (Auteur: Benjy)

Article posté par Kevin Kofler

TUTO SUR LES FICHIERS TI AVEC VAT.H

  1. Création d'un fichier :
  2. Nous allons donc voir comment créer un fichier TI avec les fonctions de la librairie Vat.h de TIGCC.

    Donc voici comment créer un fichier :

    HANDLE handle;
    char *ptrFILE;
    SYM_ENTRY *sym ;
    
    handle=HeapAlloc(16);
    if(!handle) return;
    sym=DerefSym(SymAdd(SYMSTR("tuto")));
    if(!sym) {HeapFree(handle); return;}
    sym->handle=handle;
    ptrFILE=HeapDeref(handle);
    *(short*)ptrFILE=14;
    ptrFILE[10]=0;
    strcpy(ptrFILE+11,"TUT");
    ptrFILE[15]=OTH_TAG;

    Nous allons étudier chaque ligne ensemble.

    handle=HeapAlloc(16);

    Ici, on attribue une taille de 16 octets au handle. Cette taille est la taille du fichier que l'on désire créer, donc ici un fichier de 16 octets.

    if(!handle) return;

    Ici, on teste si l'espace mémoire que l'on a attribué a l'handle a bien été alloué. Si ça n'est pas le cas (pour manque de mémoire), on quitte.

    sym=DerefSym(SymAdd(SYMSTR("tuto")));

    Ensuite, on crée une entrée SYM (SYM_ENTRY) en précisant le nom que l'on veut donner au fichier. (Le SYMSTR sert à créer un nom de fichier au format voulu par les routines de fichiers de AMS.) Ici, le nom sera tuto.

    if(!sym) {HeapFree(handle); return;}

    Ici, on teste également que l'allocation du sym s'est bien passée. S'il n'y a pas assez de place on quitte, après avoir libéré le handle alloué auparavant.

    sym->handle=handle;

    On copie le handle de notre handle déclaré dans la structure sym.

    ptrFILE=HeapDeref(handle);

    On met l'adresse du handle dans le pointeur que l'on a déclaré.

    *(short*)ptrFILE=14;

    Ici on attribue le premier word (les 2 premiers octets) du fichier. Il correspond a la taille du fichier moins les deux octets de fin donc ici 16-2=14.

    Ensuite, selon le fichier que vous voulez créer, vous avez plus ou moins d'octets disponibles. Ici j'utilise une extension personnelle qui est TUT donc il me faut 5 octets à la fin (3 octets plus les octets nuls avant et après la chaîne de caractères) pour la mettre plus le dernier octet d'extension, ici OTH_TAG pour une extension personnel. Pour une extension personnelle on peut aller jusqu'à 4 caractères alpha.

    ptrFILE[10]=0;
    strcpy(ptrFILE+11,"TUT");

    Donc ici je met mon extension en fin de fichier juste avant l'avant dernier octet. L'octet nul devant la chaîne doit être mis explicitement, celui après la chaîne sera mis par le strcpy.

    ptrFILE[15]=OTH_TAG;

    Ici, je mets l'extension TI utilisée dans le dernier octet du fichier qui est toujours la taille du fichier déclare au départ moins un. Donc ici 16-1=15.

    Voilà pour la création d'un fichier, j'espère avoir été assez clair.

  3. Ouverture/Lecture d'un fichier:
  4. Nous allons maintenant voir comment lire un fichier.

    SYM_ENTRY *sym = SymFindPtr(SYMSTR("tuto"),0);
    if(!sym) return;
    ptrFILE=HeapDeref(sym->handle);
    SYM_ENTRY *sym = SymFindPtr(SYMSTR("tuto"),0);

    Ici, nous créons un SYM_ENTRY comme tout à l'heure, à la différence que celui-ci pointe sur le fichier que l'on veut ouvrir, ici tuto.

    if(!sym) return;

    Si le fichier n'existe pas, on quitte.

    ptrFILE=HeapDeref(sym->handle);

    On met l'adresse du handle dans le pointeur que l'on a déclare.

    Voilà, il ne reste plus qu'a lire ce que vous désirez avec un memcpy.

    memcpy(&lire,ptrFILE+2,4);

    Par exemple, là, on lit les 4 octets de ptrFILE de l'octet 2 à l'octet 6.

    Remarquez qu'il n'est souvent pas nécessaire de copier les données. On peut souvent les lire directement du fichier, à condition de verrouiller le handle avec HeapLock. C'est le cas si le fichier contient par exemple des sprites ou des chaînes de caractères.

  5. Ecriture :

Bon et dernière étape : écrire dans votre fichier. Voici comment on fait :

SYM_ENTRY *sym = SymFindPtr(SYMSTR("tuto"),0);
ptrFILE=HeapDeref(sym->handle);

memcpy(ptrFILE+2,&ecrire,4);

Ici, vous écrirez les 4 octets de votre fichier à partir du premier octet de données (juste après les 2 octets de taille).

Attention, vous ne pouvez pas écrire dans un fichier archivé ! Si votre fichier est archivé, il vous faudra d'abord le désarchiver avec EM_moveSymFromExtMem :

EM_moveSymFromExtMem(SYMSTR("tuto"),HS_NULL);

Voilà, vous savez tout maintenant !!

FAIT PAR Benjy. Corrections et ajouts par Kevin Kofler.


>> Vos commentaires [4]

Ajout utile à TIGCC... :: [Commentaire n°1]

Posté par Lionel Debroux le 03/10/2004
C'est, en plus détaillé et expliqué, un exemple fait par JimRandomH, modifié par moi, qui doit traîner quelque part chez Kevin depuis un certain temps déjà...


[Commentaire n°2]

Posté par RiRi le 29/03/2005
Ca c cool comme tuto...
Ca devrait m'aider car je trouve vraiment les manipulation sur la vat très pénibles.


[Commentaire n°3]

Posté par Martial Demolins le 04/07/2005
oui ben en assembleur, ça aide pas beaucoup, on aurait bien aimé avoir la structure d'un symentry octet par octet par exemple. :)


Layout :: [Commentaire n°4]

Posté par Kevin Kofler le 15/12/2005
Euh, j'ai l'impression que le layout se soit cassé... :(

Membre de l'équipe de TIGCC: http://tigcc.ticalc.org
Mainteneur du portage Linux/Unix de TIGCC: http://tigcc.ticalc.org/linux/
Membre de l'équipe de TiEmu: http://lpg.ticalc.org/prj_tiemu/

Participez à la reprise de Ti-Gen!


Poster un commentaire


Seuls les membres peuvent poster des commentaires