/*
    Fichier groupeligne.c
    Auteur Bernard Chardonneau

    Logiciel libre, droits d'utilisation précisés en français
    dans le fichier : licence-fr.txt

    Traductions des droits d'utilisation dans les fichiers :
    licence-de.txt , licence-en.txt , licence-es.txt ,
    licence-it.txt , licence-nl.txt , licence-pt.txt ,
    licence-eo.txt , licence-eo-utf.txt

    Droits d'utilisation également sur la page web :
    http://libremail.tuxfamily.org/voir.php?page=droits


    Fonctions permettant de regrouper 2 lignes consécutives
    dans le source d'un mail lorsque le passage à la ligne
    doit être supprimé à l'affichage.
*/


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "buflect.h"
#include "fmail.h"
#include "encodage.h"
#include "trtligne.h"
#include "groupeligne.h"


/* prototype */
void genligne (char *buffer);



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