/*
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
*/
/* 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);
}