1

Vu que je suis en train de porter mon projet de compression sur ti, j'en suis venu a une question:
J'ai decidé d'ajouter les headers a la fin des fichiers compressés, a la manière du format zip, mais si je veux les lire, est-ce que je dois mettre un offset en debut de fichier pour sauter, au bon endroit pour obtenir les infos, ou bien je peux le fier aux indication de heapsize, pour sauter au bon endroit, c'est a dire a la fin du fichier, j'ai lu dans la doc, que heapsize, ne renvoie pas toujours la bonne taille de fichier, que heapcompress peut influer dans de rares cas sur le resultat...
Il y a t'il un moyen de se passer de ca, c'est a dire une autre fonction qui realise qqch, d'equivalent, ou que peut-on faire d'autre, pour obtenir a coup sur le bon nombre d'octets pour sauter a la fin du fichier.
En asm, j'utilisais toujours la taille fournie par l'handle, mais je ne sais pas a quelle fonction elle correspond, et vu ce qui est marqué dans la doc, si finalement c'est sur de donner la bonne taille...
Merci a ceux qui auront compris mon dilème et qui prendront le temps de repondre...

2

Je pense que le plus simple c'est quand même debut_prog + *(unsigned short*)HeapDeref(handle) + 1, ca te fait pointer sur le dernier octet du fichier.

3

heapsize ne renvoit jamais la taille du fichier...
Et fait comme Extended a dit smile
Handle
adr = HeapDeref(Handle); Puis adr += *((short *) adr) + 1
Ou tu utilises la fonction de Tios qui fait pointer sur le tag.

avec adr unsigned char *

4

>adr += *((short *) adr) + 1

N'oublie pas le unsigned! Sinon, ça ne marchera pas pour les fichiers de plus de 32 KO!
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

5



J'ai implémenté ca pour le mode binaire, ca devrait etre bon non?

  short fresize(FILE *f1, int size) {          unsigned long fpos = (unsigned long)f1->fpos - (unsigned long)f1->base;                    if(!f1) return EOF;             HeapUnlock(f1->handle);             if ((f1->alloc -= size) < 8 ) f1->alloc = 8;          HeapRealloc(f1->handle, f1->alloc);          f1->base = HLock(f1->handle);          f1->fpos = f1->base + fpos;          if (fpos >= f1->alloc) {               f1->fpos = f1->base + f1->alloc;               f1->flags|=_F_EOF;          }           f1->unget = EOF;          return 0;             }

6

oups, le code est tout faux, je vais essayer d'en mettre un juste des que j'arrive a en faire un tongue

7

Voila ce source a l'air deja meilleur tongue
Kevin, si tu passes par là, j'aimerais bien que tu me donne ton avis.
J'ai respecté les sources de tigccpour ecrire ce code, c'est a dire, que c'est compatible en mode texte ou binaire, il n'y a que le unget ou je suis pas tres sur.
Sinon, je me suis servi des sources de tigcc0.93 pour m'en inspiré, j'espère qu'il n'y a pas eu de modif depuis dans stdio.h tongue
  short fresize(FILE *f1, int size) {          unsigned short oldSize;           unsigned short newSize;          unsigned long fpos;          short tmode;                    fpos = (unsigned long)f1->fpos - (unsigned long)f1->base;          tmode = !(f1->flags & _F_BIN);          if(!f1) return EOF;          oldSize = peek_w(f1->base);           newSize = oldSize + size;          if (newSize < 8) newSize = 8;             HeapUnlock(f1->handle);          if (!HeapRealloc(f1->handle, newSize + 2)) {               HLock(f1->handle);               return EOF;          }          f1->base = HLock(f1->handle);          f1->fpos = f1->base + fpos;             poke_w(f1->base, newSize);             f1->alloc = newSize;             f1->unget = EOF;             if((unsigned long)(f1->base + peek_w(f1->base) + (tmode?0:2)) > fpos) {                  f1->fpos = f1->base + peek_w(f1->base) + (tmode?0:2);                  f1->flags |= _F_EOF;             }           return 0;             }

8

Je crois que la ligne 12 sert a rien... faut que je l'enleve, vaut mieux que ca renvoit une erreur

9

Et paf encore une couche tongue
La j'ai enlevé la ligne 12, et j'ai carrement rajouter une fonction qui au lieu de redimensionner en fonction de la valeur rentrée, dimensionne le fichier en fonction de la valeur tongue

Si vous voyez une erreur dites le
  short fresize(FILE *f1, int size) {          unsigned short oldSize;           unsigned short newSize;          unsigned long fpos;          short tmode;                    fpos = (unsigned long)f1->fpos - (unsigned long)f1->base;          tmode = !(f1->flags & _F_BIN);          if(!f1) return EOF;          oldSize = peek_w(f1->base);           newSize = oldSize + size;             HeapUnlock(f1->handle);          if (!HeapRealloc(f1->handle, newSize + 2)) {               HLock(f1->handle);               return EOF;          }          f1->base = HLock(f1->handle);          f1->fpos = f1->base + fpos;             poke_w(f1->base, newSize);             f1->alloc = newSize;             f1->unget = EOF;             if((unsigned long)(f1->base + peek_w(f1->base) + (tmode?0:2)) > fpos) {                  f1->fpos = f1->base + peek_w(f1->base) + (tmode?0:2);                  f1->flags |= _F_EOF;             }           return 0;             }      short fsize(FILE *f1, int size) {          unsigned long fpos;          short tmode;                    fpos = (unsigned long)f1->fpos - (unsigned long)f1->base;          tmode = !(f1->flags & _F_BIN);          if(!f1) return EOF;             HeapUnlock(f1->handle);          if (!HeapRealloc(f1->handle, size + 2)) {               HLock(f1->handle);               return EOF;          }          f1->base = HLock(f1->handle);          f1->fpos = f1->base + fpos;             poke_w(f1->base, size);             f1->alloc = size;             f1->unget = EOF;             if((unsigned long)(f1->base + peek_w(f1->base) + (tmode?0:2)) > fpos) {                  f1->fpos = f1->base + peek_w(f1->base) + (tmode?0:2);                  f1->flags |= _F_EOF;             }           return 0;             }   

10

C'est cool, depuis exactement 2 heures, tu parles tout seul gni

(accessoirement : elle sert à quoi ta fonction ?)
avatar
Un site complet sur lequel vous trouverez des programmes et des jeux pour votre calculatrice TI 89 / Titanium / 92+ / Voyage 200 : www.ti-fr.com.
Quelques idées personnelles ici.

11

Il y a eu des modifications dans les routines de fichiers depuis TIGCC 0.93, mais ça ne devrait pas affecter ta routine normalement.

Et ça serait bien si tu la contribuais à TIGCCLIB:
1. Teste-la bien!
2. Envoie-la à Sebastian Reichelt en lui disant que je suis d'accord. Mais il faut quand-même qu'un de nous deux (Sebastian ou moi) vérifie ces routines en détail avant de les mettre dans TIGCCLIB.

Mais ces noms de fonctions viennent d'où? De toi? Ou suivent-ils un standard particulier? Parce qu'il faudrait essayer de suivre un standard pour les noms s'il en existe un. Mais s'il n'y a pas de standard à suivre pour ces fonctions-là (et c'est ce qu'il me semble - c'est quand-même bizarre...), n'hésite pas à les contribuer avec les noms que tu viens de leur donner.
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

12

Bon, ces routines m'ont l'air OK, à part pour une chose:
22: if((unsigned long)(f1->base + peek_w(f1->base) + (tmode?0:2)) > fpos) {
48: if((unsigned long)(f1->base + peek_w(f1->base) + (tmode?0:2)) > fpos) {
Cette comparaison (présente une fois dans chacune de tes 2 routines) n'est-elle pas à l'envers?
Et évidemment, il faut aussi tester les routines en pratique.

Autre chose: ne serait-il pas une bonne idée de rajouter une fonction simple pour lire la taille d'un fichier rapidement? Une macro devrait suffir, de style:
#define fgetsize(__f1__) (peek_w((__f1__)->base))
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

13

Ouais, c'est une tres bonne idée kevin, j'osais pas te demander, tu sais le C j'en ai fait tres peu meme si je pense que les implementations de ces deux fonctions ont été faites proprement et serieusement tongue

Pour ce qui est du test de ces fonctions, je le ferais plus en profondeur, car de totue facon j'en ai besoin beaucoup tongue

Ensuite, tu n'as rien mis a propos de ungetc()... et de FILE.unget, faudrait que tu m'éclaires tongue

(unsigned long)(f1->base + peek_w(f1->base) + (tmode?0:2)) > fpos a bien l'air a l'envers tongue je le corrigerais

Sinon dgetsize, est bien pour l'utilisateur pas pour les fonctions de stdio.h elles-meme, ensuite je n'ai pas utilisé de nom standard, mais je trouve qu'elles correspondent bien, et sont un manque cruel dans stdio.h

Autre chose, a ton avis si on ouvre le fichier en lecture, ca devrait etre possible de dimensionner ou redimensionner une variable ou pas?

14

freka a écrit :
Ensuite, tu n'as rien mis a propos de ungetc()... et de FILE.unget, faudrait que tu m'éclaires tongue

ungetc fait en sorte que le prochain getc lise le caractère mis par ungetc au lieu de lire le prochain caractère du fichier. Commes tes fonctions ne lisent aucun caractère, tu n'as pas à te préoccuper de cela.
Sinon dgetsize, est bien pour l'utilisateur pas pour les fonctions de stdio.h elles-meme, ensuite je n'ai pas utilisé de nom standard, mais je trouve qu'elles correspondent bien, et sont un manque cruel dans stdio.h

OK.
Autre chose, a ton avis si on ouvre le fichier en lecture, ca devrait etre possible de dimensionner ou redimensionner une variable ou pas?

Non. Quand on redimensionne, on écrit.
Surtout qu'il est possible d'ouvrir un fichier archivé en lecture seule, et que si on essaye de le redimensionner, ça plantera grave.
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

15

Et le caractère donner par ungetc a getc, il vient d'ou, ca correspond a quoi, j'ai pas compris, il y a une classe de stream en java pareil, mais j'ai pas compris non plus tongue
C'est le caractère précédent de la stream en fait?

16

freka
a écrit : Et le caractère donner par ungetc a getc, il vient d'ou

Il vient du paramètre de ungetc. Ensuite, ungetc le stocke dans le champ unget de la structure FILE, et (f)getc vérifiera s'il y a un caractère qui attend dans ce champ avant d'aller en récupérer un dans le fichier.
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

17

freka a écrit :
Vu que je suis en train de porter mon projet de compression sur ti, j'en suis venu a une question: J'ai decidé d'ajouter les headers a la fin des fichiers compressés, a la manière du format zip,


Mets ton heaer au debut du fichier, c'est beaucoup plus simple...
XLib v1.00 Powerrrrrrrrrrrrrrrrrrrr!

18

Boudiou' mais elles servent à quoi ces fonctions ????????????
avatar
Un site complet sur lequel vous trouverez des programmes et des jeux pour votre calculatrice TI 89 / Titanium / 92+ / Voyage 200 : www.ti-fr.com.
Quelques idées personnelles ici.

19

ben a pouvoir editer facilement des archives de compression multifichier thibaut tongue
Je te montrerais tout ca des que ca sera fonctionnel wink

timad, j'ai bien reflechis, et ca pose trop de pbs, en effet des qu'un fichier est ajouté ou enlever il faut modifier la taille alouée aux header et decaler toutes les données du programme! c pas intéressant, c'est bien pour ca qu'ils le mettent a la fin dans le format zip tongue
Mais si tu pensais a autre chose dis le wink