Use Buffer + fixing overflow issue
This commit is contained in:
parent
21f8173d86
commit
ed5002472d
1 changed files with 12 additions and 3 deletions
15
arbre.c
15
arbre.c
|
@ -114,14 +114,19 @@ void enteteVersFichier(Entete *enteteListe, int nombreLettresDansFichier, int lo
|
||||||
|
|
||||||
void huffmanVersFichier(FILE *entree, FILE *sortie, Entete *enteteListe, int nombreLettresDansFichier) {
|
void huffmanVersFichier(FILE *entree, FILE *sortie, Entete *enteteListe, int nombreLettresDansFichier) {
|
||||||
int buffer = 0, tailleBufferActuelle = 0, sizeOfInt = sizeof(int) * 8; // *8 car "long unsigned int" d'après GCC
|
int buffer = 0, tailleBufferActuelle = 0, sizeOfInt = sizeof(int) * 8; // *8 car "long unsigned int" d'après GCC
|
||||||
char lettre = 'a'; // initalisation pour éviter un warning
|
char lettre = 'a'; // initialisation pour éviter un warning
|
||||||
while (lettre != EOF) {
|
while (lettre != EOF) { // on parcours le fichier
|
||||||
lettre = fgetc(entree);
|
lettre = fgetc(entree);
|
||||||
Entete entete = recuperationLettre(lettre, enteteListe, nombreLettresDansFichier); // rappel: entete représente une liste de caractères
|
Entete entete = recuperationLettre(lettre, enteteListe, nombreLettresDansFichier); // rappel: entete représente une liste de caractères
|
||||||
if (tailleBufferActuelle + entete.longueur >= sizeOfInt) { // écriture dans le fichier
|
if (tailleBufferActuelle + entete.longueur >= sizeOfInt) { // écriture dans le fichier
|
||||||
// Modification du buffer
|
// Modification du buffer
|
||||||
int aAjouter = sizeOfInt - tailleBufferActuelle;
|
int aAjouter = sizeOfInt - tailleBufferActuelle;
|
||||||
buffer <<= aAjouter;
|
if (aAjouter < 32)
|
||||||
|
buffer <<= aAjouter; // décalage vers la gauche
|
||||||
|
else { // évite un overflow (https://gcc.gnu.org/onlinedocs/gcc/Static-Analyzer-Options.html#index-Wanalyzer-shift-count-overflow)
|
||||||
|
printf("Déplacement de bits trop important (aAjouter >=32 [=%d])", aAjouter);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
// Ajout de la lettre
|
// Ajout de la lettre
|
||||||
int tmp = entete.code >> (entete.longueur - aAjouter);
|
int tmp = entete.code >> (entete.longueur - aAjouter);
|
||||||
|
@ -133,6 +138,10 @@ void huffmanVersFichier(FILE *entree, FILE *sortie, Entete *enteteListe, int nom
|
||||||
|
|
||||||
buffer = 0, tailleBufferActuelle = 0; // reset du buffer
|
buffer = 0, tailleBufferActuelle = 0; // reset du buffer
|
||||||
}
|
}
|
||||||
|
// Mise à jour du buffer
|
||||||
|
tailleBufferActuelle += entete.longueur;
|
||||||
|
buffer <<= entete.longueur; // décalage vers la gauche
|
||||||
|
buffer |= entete.code;
|
||||||
}
|
}
|
||||||
if (tailleBufferActuelle > 0) {
|
if (tailleBufferActuelle > 0) {
|
||||||
buffer <<= sizeOfInt - tailleBufferActuelle; // décalage vers la gauche
|
buffer <<= sizeOfInt - tailleBufferActuelle; // décalage vers la gauche
|
||||||
|
|
Reference in a new issue