/*
    Fichier simexped.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 récupérer le nom
    d'expéditeur d'un mail, puis de le comparer à des noms
    d'expéditeurs d'une liste pour compter les différences.
*/


#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include "buflect.h"
#include "messages.h"
#include "pop.h"
#include "simexped.h"
#include "trtentete.h"


// lit l'entête d'un mail et récupère le champ expéditeur

void recup_exped (int numes, char *bufFrom)
{
    char bufw [120]; // buffer d'envoi d'une requête
    int  debexped;   // position du premier caractère significatif du exped


    // initialisations
    bufFrom [0] = '\0';

    // demande de lecture de l'entête du message
    sprintf (bufw, "TOP %d 1", numes);
    env_pop (bufw);

    // lire la première ligne de l'entête du message
    lire_pop ();

    // terminé pour ce mail si erreur d'envoi coté serveur
    if (memcmp (buf_lect, "-ERR ", 5) == 0)
    {
        // Erreur serveur pour l'accès au mail
        aff_err_argnum ("ERREUR_SERVEUR", numes);
        return;
    }

    // lecture entête du message et mémorisation de l'expéditeur du mail
    do
    {
        // si on a trouvé le champ exped
        if (start ("From"))
        {
            // recherche du premier caractère significatif du exped
            debexped = 6;

            while (buf_lect [debexped] == ' ')
                debexped++;

            // tronquer si nécessaire l'expéditeur
            if (strlen (buf_lect + debexped) >= 120)
                 buf_lect [debexped + 120] = '\0';

            // mémorisation de l'expéditeur
            strcpy (bufFrom, buf_lect + debexped);
        }

        // lire la ligne suivante de l'entête du message
        lire_pop ();
    }
    // lecture terminée si ligne limitée à un .
    while (buf_lect [0] != '.' || buf_lect [1] != '\0');
}



/* recherche si le champ du mail passée en paramètre
   contient l'une des chaines de la liste */


int simexped (char *bufFrom, char **liste, int sz_liste)
{
    char exped [120]; // expéditeur à tester
    char *chainetest; // chaine de la liste à tester
    int  nbdiff;      // nombre de différences
    int  mindiff;     // nombre de différences pour la chaine qui en a le moins
    int  i, j;        // compteurs


    // initialisation
    i = 0;

    // mémorisation de l'expéditeur

    // s'il commence par "
    if (*bufFrom == '"')
    {
        // on mémorise ce qu'il y a entre les deux "
        while (bufFrom [i + 1] != '"' && bufFrom [i + 1])
        {
            exped [i] = bufFrom [i + 1];
            i++;
        }

        // terminer la chaine de caractères
        exped [i] = '\0';
    }
    // sinon
    else
    {
        // chercher après le premier espace
        while (bufFrom [i] && bufFrom [i++] != ' ')
            ;
        // le champ adresse de l'expéditeur
        while (bufFrom [i] && bufFrom [i++] != '@')
            ;

        // le nom de l'expéditeur est jusqu'à l'espace qui précède
        while (i > 0 && bufFrom [i] != ' ')
            i--;

        // précaution pour le cas oùil y aurait plusieurs espaces
        while (i > 0 && bufFrom [i] == ' ')
            i--;

        // on mémorise l'expéditeur en commençant par la fin
        exped [i] = '\0';

        while (i--)
            exped [i] = bufFrom [i];
    }

    // initialisation
    mindiff = strlen (exped);

    // on compare la chaine exped avec toutes les chaines de la liste
    // sauf si on a trouvé la chaine exped telle quelle dans la liste
    for (j = 0; j < sz_liste && mindiff; j++)
    {
        // on ne compare que des chaines de longueur identique
        if (strlen (exped) == strlen (liste [j]))
        {
            // sélectionner la chaine à comparer
            chainetest = liste [j];

            // initialisation
            i = 0;
            nbdiff = 0;

            // tant que la chaine expéditeur n'a pas été parcourue
            while (exped [i])
            {
                // comparer 2 caractères à la même position
                // on accepte les différences de casse (par sécurité)
                if (tolower (exped [i]) != tolower (chainetest [i]))
                    // comptabiliser les différences
                    nbdiff ++;

                // passer au caractère suivant des 2 chaines
                i++;
            }

            // si moins de différences que pour une chaine précédente
            if (mindiff > nbdiff)
                // mémoriser la nouvelle valeur de nbdiff
                mindiff = nbdiff;
        }
    }

    // retourner le résultat de la meilleure comparaisons
    return (mindiff);
}