/* Ajuste la taille en octets du paramètre buffer
à la chaine de caractères qu'il contient
*/
char *ajustebuf (char *buffer)
{
char *nouvbuf;
// essayer de créer un nouveau buffer de la bonne taille
nouvbuf = (char *) malloc (strlen (buffer) + 1);
// si création réussie
if (nouvbuf)
{
// recopier l'ancien buffer dans le nouveau
strcpy (nouvbuf, buffer);
// on peut libérer l'espace mémoire occupé par l'ancien buffer
free (buffer);
// et retourner l'adresse du nouveau
return (nouvbuf);
}
// sinon
else
// mauvais signe : on garde l'adresse de l'ancien buffer
return (buffer);
}
/* Regroupement de la ligne de texte passée
en paramètre avec la ligne suivante du mail
*/
void regroupeligne (char *buffer)
{
char *lignefusion;
char carsuiv;
int i, j;
// allouer un buffer pour contenir les 2 lignes
lignefusion = (char *) malloc (strlen (buffer) + sizeof (buf_lect) + 1);
// si espace mémoire suffisant
if (lignefusion)
{
// recopier la dernière ligne lue dans ce buffer
strcpy (lignefusion, buffer);
// lire et convertir la suivante et la recopier à la suite
if (lire_fmail ())
{
majligne ();
strcat (lignefusion, buf_lect);
// on cherche à optimiser la mémoire utilisée
lignefusion = ajustebuf (lignefusion);
// si encodage base 64
if (encodage_texte == Base64)
{
// on va générer les lignes complètes mémorisées
// non indispensable, mais ça limite la consommation mémoire
do
{
i = 0;
j = 0;
// chercher si passage à la ligne dans le texte mémorisé
while (lignefusion [i] != '\n' && lignefusion [i])
i++;
// si passage à la ligne trouvé
if (lignefusion [i] == '\n')
{
// terminer la chaine après ce passage à la ligne
carsuiv = lignefusion [i + 1];
lignefusion [i + 1] = '\0';
// générer la ligne correspondante
genligne (lignefusion);
// restaurer le premier caractère de la ligne suivante
lignefusion [i + 1] = carsuiv;
// et supprimer la ligne traitée du buffer
do
lignefusion [j++] = lignefusion [++i];
while (lignefusion [i]);
}
}
// on recommence tant qu'on a pu générer une ligne complète
while (j > 0);
}
// s'il reste un début de ligne
if (*lignefusion)
{
// le prendre en compte de la manière la plus adéquate
if (lignefusion [strlen (lignefusion) - 1] != '\n')
{
// un nouvel appel de regroupeligne va avoir lieu
// on cherche à optimiser la mémoire utilisée
lignefusion = ajustebuf (lignefusion);
// on peut regrouper les lignes
regroupeligne (lignefusion);
}
else
// cas d'un \n en fin de chaine, on génère la ligne
genligne (lignefusion);
}
// libérer le buffer de travail
free (lignefusion);
}
// sinon, (manque de mémoire) on va juste générer la ligne
else
genligne (buffer);
}
// sinon, (fin de mail) on va juste générer la ligne passée en paramètre
else
genligne (buffer);
}