/*
    Fichier trtbordure.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


    Bibliothèque de fonctions permettant de mémoriser les bordures
    de sections des messages en mode multipart et de vérifier si on
    est positionné sur l'une de ces bordures
*/


#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include "buflect.h"
#include "messages.h"
#include "trtbordure.h"



/* récupère la valeur du champ boundary d'un mail en mode
   multipart et la recopie dans  bordure [nbordures + 1]
   retourne 1 si champ boundary trouvé dans la ligne, 0 sinon */


int mem_boundary ()
{
    int i, j;  // compteurs


    // initialisation
    i = 1;

    // chercher le mot  boundary  dans la ligne et sortir s'il n'y est pas
    while (tolower (buf_lect [i]) != 'b' || tolower (buf_lect [i+1]) != 'o')
        if (! buf_lect [++i])
            return (0);

    // se positionner après le caractère  =
    while (buf_lect [i++] != '=')
        if (! buf_lect [i])
            return (0);

    // vérifier si l'on peut encore mémoriser une bordure
    if (nbordures >= max_bordures)
    {
        // "Trop de sections dans le mail"
        // "Recompiler avec max_bordures plus grand dans trtbordure.h"
        affiche_err ("DEBORD_SECTIONS-1");
        affiche_err ("DEBORD_SECTIONS-2");

        exit (-1);
    }

    // sauter les blancs après le = s'il y en a
    while (buf_lect [i] == ' ')
        i++;

    // initialisation
    j = 0;

    // si la bordure est entre  "
    if (buf_lect [i] == '"')
    {
        // se positionner sur le caractère après "
        i++;

        // récupérer la bordure jusqu'au prochain " non précédé d'un '\'
        while (buf_lect [i] != '"' || buf_lect [i-1] == '\\')
        {
            // bordure [nbordures][j++] = buf_lect [i++];
            bordure [nbordures][j] = buf_lect [i];
            i++;
            j++;

            // sortie dégradée si fin de bordure sans "
            if (! buf_lect [i])
                return (1);
        }
    }
    // sinon
    else
    {
        // récupérer la bordure jusqu'en fin de ligne ou jusqu'au prochain ;
        while (buf_lect [i] != '\0' && buf_lect [i] != ';')
        {
            // bordure [nbordures][j++] = buf_lect [i++];
            bordure [nbordures][j] = buf_lect [i];
            i++;
            j++;
        }
    }

    // terminaison de la chaine et prise en compte de la nouvelle bordure
    // bordure [nbordures++][j] = '\0';
    bordure [nbordures][j] = '\0';
    nbordures++;

    // on a trouvé le champ boundary
    return (1);
}



/* indique si la ligne courante représente une bordure de section */

int surbordure ()
{
    int i;   // compteur


    // si aucune bordure mémorisée
    if (! nbordures)
        // "Erreur système : appel de surbordure() sans bordure mémorisée"
        errfatale ("AUCUNE_BORDURE", "");

    // une bordure commence par 2 caractères -
    if (buf_lect [0] != '-' || buf_lect [1] != '-')
        return (0);

    // initialisation boucle de comparaison
    i = 0;

    // comparer les caractères de la ligne à ceux de la dernière bordure
    while (buf_lect [i+2] == bordure [nbordures-1][i])
    {
        // terminé si aucune différence trouvée en fin de ligne
        if (bordure [nbordures-1][i] == '\0')
            return (1);
        else
            // sinon, passer aux caractères suivants
            i++;
    }

    // différence trouvée

    // si on est arrivé à la fin de la bordure mémorisée
    if (bordure [nbordures-1][i] == '\0')
    {
        // si dans la ligne, on a  des -- après la bordure
        if (buf_lect [i+2] == '-')
        {
            // on supprime cette bordure de la liste (fin de section)
            nbordures --;
            return (1);
        }
        // sinon, si dans la ligne la bordure est suivie d'un espace
        else if (buf_lect [i+2] == ' ' && buf_lect [i+3] == '\0')
            // c'est vraiement vicieux, mais on accepte la bordure quand même
            return (1);
        // sinon
        else
            // on n'a pas trouvé la bordure
            return (0);
    }
    // sinon si la bordure enregistrée se termine par un ;
    else if (bordure [nbordures-1][i] == ';' && ! bordure [nbordures-1][i+1])
        // autre cas vicieux mais accepté
        return (1);
    // sinon
    else
        // bordure non trouvée
        return (0);
}