/*
    Fichier entetemail.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 affiche les caractéristique de chaque
    fichier mail d'un répertoire.

    Par défaut, on analyse les mails du répertoire courant.
    On peut aussi indiquer un autre répertoire de recherche.
*/


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

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <dirent.h>
#include "messages.h"
#include "buflect.h"
#include "fmail.h"
#include "trtentete.h"


/* prototypes */
void aff_entete (char *nomfic);


/* variable globale au source
   (pour éviter un passage de paramètre) */


int optm = 0;  // option pour traiter les champs d'entête sur plusieurs lignes


/* programme principal */

int main (int nbarg, char *varg[])
{
    DIR *repert;
    struct dirent *entree;


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

    // récupération éventuelle de l'option -m
    if (--nbarg > 0)
    {
        // si option -m
        if (strcmp (varg [1], "-m") == 0)
        {
            // la mémoriser
            optm = 1;

            // et passer au paramètre suivant
            varg ++;
            nbarg --;
        }
    }

    // récupération éventuelle du nom du répertoire des mails
    // ce nom ne doit pas être constitué d'un - suivi d'un seul autre caractère
    if (nbarg == 1 && (varg [1][0] != '-' || varg [1][2] != '\0'))
    {
        // positionnement dans ce répertoire
        if (chdir (varg [1]) < 0)
        {
            // "Répertoire %s inexistant"
            aff_err_arg ("REPERT_INEXISTANT", varg [1]);
            return (0);
        }

        // un paramètre restant de moins
        nbarg --;
    }

    // si on a traité tous les paramètres
    if (nbarg == 0)
    {
        // accéder au répertoire
        repert = opendir (".");

        // lire un nom de fichier
        entree = readdir (repert);

        // tant qu'il y a des noms de fichier à lire
        while (entree)
        {
            // afficher l'entête du fichier après un controle son nom
            if (strlen (entree->d_name) == 8 ||
               (strlen (entree->d_name) == 10 && entree->d_name [8] == '.'))
                aff_entete (entree->d_name);

            // et lire le nom du fichier suivant
            entree = readdir (repert);
        }
    }
    else
        // "Syntaxe : %s [-m] [répertoire]"
        psyntaxe ("SYNT_ENTETEMAIL");

    // pour faire plaisir à gcc qui veut une fonction main de type int
    return (0);
}


/* lit l'entête d'un message et affiche certaines lignes */

void aff_entete (char *nomfic)
{
    int i;  // simple compteur


    // ouverture du fichier mail
    fmail = fopen (nomfic, "r");

    // arrêt si erreur imprévue
    if (fmail == 0)
    {
        // "Impossible d'ouvrir le fichier %s"
        aff_err_arg ("IMPOS_OUVR_FICH", nomfic);
        return;
    }

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

    // lecture et mémorisation des caractéristiques du message
    do
    {
        // affichage de la ligne précédée du nom de fichier
        majlignentete ();
        printf ("%s:%s", nomfic, buf_lect);

        // lire la ligne suivante
        lire_fmail ();

        // tant que cette ligne est la suite du champ courant
        while (*buf_lect == ' ' || *buf_lect == '\t')
        {
            // si option -m
            if (optm)
            {
                // affichage de la ligne
                majlignentete ();
                printf ("%s", buf_lect);
            }

            // lire la ligne suivante
            lire_fmail ();
        }

        // fin d'affichage de la ligne d'entête
         putchar ('\n');
    }
    while (buf_lect [0] != '\0');  // lecture entête terminée si ligne vide

    // libérer le fichier mail
    fclose (fmail);
}