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 ...)