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);
}