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


    Ce programme liste les mails du serveur dont le nom de l'expéditeur
    indiqué diffère d'un petit nombre de caractères d'un nom d'expéditeur
    figurant dans une liste.

    La liste des noms d'expéditeurs à tester est mémorisée dans un
    fichier.

    Un fichier de configuration est utilisé pour se connecter à la
    boite aux lettres.
*/


#define appli   // pour la déclaration de variables globales à l'application

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "messages.h"
#include "buflect.h"
#include "ficonf.h"
#include "pop.h"
#include "testchamp.h"
#include "simexped.h"
#include "szchemin.h"


/* variables globales au source
   (pour éviter des tonnes de passages de paramètres) */


char **listexped;      // mémorise les noms d'expéditeurs à tester
int  sz_listexped;     // nombre d'expéditeurs mémorisés dans listexped


/* programme principal */

int main (int nbarg, char *varg[])
{
    // fichier contenant la liste des chaines à tester
    char fichliste [szchemin + 12];
    char *car_fichliste; // pointeur sur un caractère de ce fichier
    FILE *fconf;         // descripteur du fichier de configuration
    int  numes, nbmes;   // muméro du mail courant et nombre de mails
    int  nbdiff;         // nombre de différences dans le nom d'expéditeur
    int  nbmaxdiff;      // nombre max de différences dans le nom d'expéditeur
    char bufFrom [120];  // buffer contenant l'expéditeur du mail


    // récupération du nom de l'exécutable
    memcom (*varg);

    // se positionner sur le premier argument de listesimexped
    nbarg --;
    varg ++;

    // si nombre de différence maximal passé en paramètre
    if (nbarg == 2 && atoi (*varg) > 0)
    {
        // récupérer ce nombre
        nbmaxdiff = atoi (*varg);

        // sauter l'argument traité
        nbarg --;
        varg ++;
    }
    // sinon
    else
        // une seule différence par défaut
        nbmaxdiff = 1;

    // contrôle du nombre d'arguments restants
    if (nbarg == 1)
    {
        // ouvrir le fichier de configuration
        fconf = ouvre_ficonf (*varg);

        if (fconf)
        {
            // connexion sur le compte mail du serveur pop
            if (connect_pop (fconf))
            {
                // récupérer le nom du répertoire racine de la messagerie
                fgets (fichliste, szchemin, fconf);

                // fabriquer le chemin d'accès au fichier contenant les
                // noms d'expéditeurs à tester : <racine>/simexped
                car_fichliste = fichliste + strlen (fichliste);
                *(car_fichliste - 1) = '/';
                strcpy (car_fichliste, ficdir ("FIC_SIMEXPED"));

                // charger en mémoire les noms d'expéditeurs à tester
                listexped = charge_valchamp (fichliste, &sz_listexped);

                // si la liste n'est pas vide
                if (sz_listexped)
                {
                    // récupération du nombre de mails
                    nbmes = nbmails ();

                    // vérification des différents mails
                    for (numes = 1; numes <= nbmes; numes++)
                    {
                        // recupérer l'expéditeur du mail
                        recup_exped (numes, bufFrom);

                        // compter les différences par rapport
                        // au nom d'expéditeur le plus proche
                        nbdiff = simexped (bufFrom, listexped, sz_listexped);

                        // s'il y a des différences, mais pas trop
                        if (nbdiff && nbdiff <= nbmaxdiff)
                            // afficher le nombre de différences et l'expéditeur
                            printf ("%d %s\n", nbdiff, bufFrom);
                    }
                }

                // se déconnecter proprement du serveur pop
                deconnect_pop ();
            }

            // on n'a plus besoin du fichier de configuration
            fclose (fconf);
        }
    }
    else
        // "Syntaxe : %s [nbmaxdiff] fich_configuration"
        psyntaxe ("SYNT_LISTESIMEXP");

    return (0);
}