/* 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