1

Je souhaiterais créer une librairie personnalisée basée sur Flib.
En modifiant le code source de FLib 3.2 j'ai supprimé certaines commandes concernant les fonctions High-Scores et Textes ...

Mais en voulant modifier le système de compilation flib (huffman) j'ai du commettre une erreur. En effet maintenant les décompressions échouent toutes et je me retrouve avec un fichier EXPR énorme (exactement ce qui m'étais arrivé une fois avec flib lorsqu'il avait planté ...). Voici la source de ma lib ... #include "Commun.h" #include "modern.h" void _main() {      char            retour[5000];      unsigned char  *str, *nam, *n;      short           i;      unsigned short  tableau[9];      unsigned short  j, rang;      HANDLE          handle;      SYM_ENTRY      *entry;      CESI            arg;      Retour = retour;      Num = 4999;      Temp = 0;      while (FolderFind(TempFolderName(++Temp)) == 3) ;      Temp--;      InitArgPtr(arg);      while (GetArgType(arg) == STR_TAG)      {           str = (unsigned char *)GetStrnArg(arg);           if (strncmp(str, "apd:", 4) == 0)           {                int_add((unsigned short)OSTimerCurVal(APD_TIMER) / 20);                arguments(str + 4, tableau, 1);                OSFreeTimer(APD_TIMER);                OSRegisterTimer(APD_TIMER, 20 * tableau[0]);           } /*-------------------------     FONCTIONS VARIABLES ---------------------------*/           else if (strncmp(str, "hd:", 3) == 0)           {                entry = get_entry(str + 3);                if (entry == NULL)                     entry = get_entry_fold(str + 3);                if (entry != NULL)                {                     entry->flags.bits.hidden = 1;                     entry->flags.bits.collapsed = 1;                }           }           else if (strncmp(str, "uhd:", 4) == 0)           {                entry = get_entry(str + 4);                if (entry == NULL)                     entry = get_entry_fold(str + 4);                if (entry != NULL)                     entry->flags.bits.hidden = 0;           }           else if (strncmp(str, "sz:", 3) == 0)           {                entry = get_entry(str + 3);                int_add(entry != NULL ? var_len(get_ptr(entry)) : 0);           }                 else if (strncmp(str, "extra:", 6) == 0)           {                unsigned char  *var, *nom, *nom_var;                long            taille = 8;                tableau[0] = 0;                i = 0;                nom = nom_var = n = arguments(str + 6, tableau, 1);                while (*(n++) != 0)                {                     if (*n == ',')                     {                          *n = 0;                          nam = get_ptr(get_entry(nom_var));                          if (nam != NULL)                               taille += var_len(nam) + 18;                          *n = ',';                          nom_var = n + 1;                     }                }                if (taille > 8)                {                     n = get_ptr(get_entry(nom_var));                     nam = n + var_len(n) - 8;                     if (n != NULL && memcmp(nam + 3, "Pck", 4) == 0)                     {                          var = mk_perso_ptr("fl", "Pck", var_len(n) + taille - 8);                          if (var != NULL)                          {                               *(nom_var - 1) = 0;                               memcpy(var, n + 2, var_len(n));                               nam = get_ptr(get_entry(nom));                               strcpy(var + var_len(n) - 8, nom);                               memcpy(var + var_len(n) + 10, nam, var_len(nam));                               i = 1;                               check(nom_var);                               SymDel(nom_var);                               SymMove(SYMSTR("fl"), nom_var + strlen(nom_var));                          }                     }                     else                     {                          var = mk_perso_ptr(nom_var, "Pck", taille);                          if (var != NULL)                          {                               n = nom;                               while (*(++n) != 0)                               {                                    if (*n == ',')                                    {                                         *n = 0;                                         if (strcmp(nom, nom_var) == 0)                                         {                                              SymDel(nom);                                              break;                                         }                                         nam = get_ptr(get_entry(nom));                                         if (nam != NULL)                                         {                                              strcpy(var, nom);                                              memcpy(var + 18, nam, var_len(nam));                                              var += var_len(nam) + 18;                                              i++;                                         }                                         nom = n + 1;                                    }                               }                          }                     }                }                else                {                     n = get_ptr(get_entry(nom_var));                     var = n + var_len(n) - 8;                     if (n != NULL && memcmp(var + 3, "Pck", 4) == 0)                     {                          n += 2;                          j = 1;                          while (n < var)                          {                               rang = 256 ** (n + 18) + *(n + 19);                               if (tableau[0] == 0 || tableau[0] == j)                               {                                    nam = mk_ptr(n, rang + 2);                                    if (nam != NULL)                                    {                                         memcpy(nam, n + 20, rang);                                         i++;                                    }                               }                               n += rang + 20;                               j++;                          }                     }                }                int_add(i);           }           else if (strncmp(str, "zip:", 4) == 0)           {                struct hArbre  *arbre, *debut, *lecture;                unsigned char  *tampon, *n2, *limite, *limite2;                short           chemin[512];                short           nbre1 = 0, nbre2 = 0, mode;                unsigned short  val, longueur;                unsigned long   bit = 0;                arbre = HeapDeref(handle = HeapAllocHigh(512 * sizeof(struct hArbre)));                str += 4;                nam = get_ptr(entry = get_entry(str));                if (nam != NULL && handle != H_NULL)                {                     longueur = var_len(nam);                     limite = nam + longueur - 1;                     if (memcmp(limite - 4, "Comp", 4) != 0)                     {                          if ((tampon = malloc(longueur + 250)) == NULL)                          {                               int_add(3);                               goto Fini;                          }                          if (longueur < 17)                          {                               int_add(2);                               goto Fini;                          } //                  HeapLock(*(unsigned short*)(tampon-2)) ;                          *(unsigned short *)tampon = *(unsigned short *)nam;                          tampon[2] = *limite;                          memset(chemin, 0, 1024);                          for (n = nam + 2; n < limite; n++)                               chemin[*n]++;                          for (i = 0; i < 256; i++)                          {                               val = chemin[i];                               nbre1 += (val && val < 256);                               nbre2 += (val >= 256);                          }                          mode = nbre2 != 0 ? 2 : 1;                          if (nbre1 + 2 * nbre2 < 255 * mode)                               mode = 0;                          tampon[3] = mode;                          n2 = tampon + 4;                          if (mode)                          {                               for (i = 0; i < 256; i++)                               {                                    val = chemin[i];                                    *n2++ = val;                                    if (mode == 2)                                         *n2++ = val >> 8;                               }                          }                          else                          {                               *n2++ = nbre2;                               *n2++ = nbre1;                               for (i = 0; i < 256; i++)                               {                                    if ((val = chemin[i]) > 255)                                    {                                         *n2++ = i;                                         *n2++ = chemin[i] >> 8;                                         *n2++ = val;                                    }                               }                               for (i = 0; i < 256; i++)                               {                                    val = chemin[i];                                    if (val && val < 256)                                    {                                         *n2++ = i;                                         *n2++ = val;                                    }                               }                          }                          arbre_to_tab(mk_arbre(arbre, tampon + 3), 0, 0, (unsigned long *)chemin);                          j = 0;                          limite2 = tampon + longueur - 10;                          for (n = nam + 2; n < limite; n++)                          {                               bit += (unsigned long)(chemin[2 ** n + 1]) << j;                               j += chemin[2 ** n];                               while (j >= 8)                               {                                    if (n2 >= limite2)                                    {                                         int_add(2);                                         goto Fini;                                    }                                    *n2++ = bit;                                    bit >>= 8;                                    j -= 8;                               }                          }                          if (j > 0)                               *n2++ = bit;                          longueur = n2 - tampon;                          nam = mk_perso_ptr(str, "Comp", longueur + 9);                     }                     else                     {                          longueur = var_len(nam + 2) - 2;                          if ((tampon = malloc(longueur)) == NULL)                          {                               int_add(3);                               goto Fini;                          } //                  HeapLock(*(unsigned short*)(tampon-2)) ;                          debut = mk_arbre(arbre, nam + 4);                          n = nam + 6 + 256 * (nam[5] == 1) + 512 * (nam[5] == 2) + (3 * nam[6] + 2 * nam[7] + 2) * (nam[5] == 0);                          n2 = tampon;                          j = 0;                          while (n2 - tampon < longueur - 1)                          {                               lecture = debut;                               do                               {                                    if (j == 0)                                    {                                         nbre1 = *n++;                                         j += 8;                                    }                                    val = nbre1 % 2;                                    nbre1 >>= 1;                                    j--;                                    if (val == 0)                                         lecture = lecture->gauche;                                    else                                         lecture = lecture->droite;                               }                               while (lecture->gauche != NULL || lecture->droite != NULL);                               *n2++ = lecture->valeur;                          }                          *n2 = nam[4];                          nam = mk_ptr(str, longueur + 2);                     }                     if (nam != NULL)                     {                          memcpy(nam, tampon, longueur);                          int_add(0);                     }                     else                          int_add(3);                  Fini:                     if (tampon != NULL)                          free(tampon);                }                else                     int_add(1);                HeapFree(handle);           }                 if (GetArgType(arg) == LIST_TAG)                SkipArg((ESQ *) arg);      } //     Inutile dans cette lib -> nam = mk_ptr("fl", 5003 - Num);      *nam = 0xE5;      memcpy(nam + 1, Retour + Num + 1, 4999 - Num);      nam[5000 - Num] = 0xD9;      return; }

Pouvez vous m'aider a déceler mon erreur ...



P.S : En revanche j'ai réussi a recréer le prog que flib m'avait convertit ... merci de vos conseils (qui m'ont donné envie de faire cette lib ...)

2

J'ai pas regarde le code mais pourquoi ne recupere tu pas le code pour retaurer la fonction a son etat initial.
Vu que tu as modifier le code et que ca ne marche plus, tu n'as qu'a remettre l'original.

3

Ben non puisque j'ai personnalisé la fonction en modifiant la commande et aussi le type de fichier de sortie ...

4

Si ce sont seulement c'est 2 modif que tu as faite, il est plus simple de reprendre le code d'origine pour le remodifier.

5

Ben je regarde ca ...