14Fermer16
ibi0tuxLe 25/05/2008 à 21:51
if (strncmp(str, "komp:", 5) == 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 += 5;                nam = get_ptr(entry = get_entry(str));                if (nam != NULL && handle != H_NULL)                {                     longueur = var_len(nam);                     limite = nam + longueur - 1;                     if (memcmp(limite - 5, "KOMP", 5) != 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, "KOMP", 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 + 5);                          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);           }


Si quelqu'un peut m'aider ...