/* 
* 
* Copyright (C) 2013 UMPC
* 
* This file is part of CLaRiNet.
*  
* CLaRiNet is free software: you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
* 
* CLaRiNet is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
* GNU General Public License for more details.
* 
* You should have received a copy of the GNU General Public License
* along with CLaRiNet.  If not, see <http://www.gnu.org/licenses/>.
*/
#include <stdarg.h>
#include <stdio.h>

FILE *FichierTraces = NULL;
int Verbose = 0;

static char MessageErreur[10001] = "";	/* Buffer d'erreurs */
static int Index = 0;					/* Indice de la première position libre dans le buffer d'erreurs */

#include "Erreur.h"

/************************************************
	Ecriture d'un message dans le buffer d'erreurs
**************************************************/

void SetErreur (const char *format,		/* -> Format d'écriture */
				...)					/* -> Valeurs à écrire */

{
	va_list arglist;

	va_start(arglist, format);

	/* Rq : le buffer est alloué statiquement : en cas d'éventuelle tentative de
	   dépassement, les écritures sont tronquées */

	Index += vsnprintf(MessageErreur + Index, 10000 - Index, format, arglist);

	if(Verbose)
	{
		vfprintf(FichierTraces, format, arglist);
		fflush(FichierTraces);
	}

	return;
}

/******************************************
	Retourne de contenu du buffer d'erreurs
*******************************************/

const char *GetErreur()

{
	return (MessageErreur);
}

/***********************************************
	Vide le buffer des messages d'erreurs
************************************************/

void ClearErreur()

{
	sprintf(MessageErreur, "");
	Index = 0;
	return;
}

/******************************************************************************
	Activation ou désactivation des sorties sur fichier ou sortie standard
*******************************************************************************/

int TraceErreur (const int _Verbose,				/* -> Désactive (0) ou active l'écriture dans le fichier traces */
						   const char *NomFichierTraces)	/* -> Nom du fichier de traces */

{
#define _CRT_SECURE_NO_WARNINGS
	if (_Verbose)
	{

		if (Verbose)
		{
			fclose(FichierTraces);
			Verbose = 0;
			FichierTraces = NULL;
		}

		if (NomFichierTraces == NULL)
		{
			FichierTraces = NULL;
			Verbose = 1;
			return(0);
		}

		FichierTraces = fopen(NomFichierTraces, "a");
		if(FichierTraces == NULL) FichierTraces = fopen(NomFichierTraces, "r");
		if(FichierTraces == NULL)
		{
				SetErreur("TraceErreur - Impossible d'ouvrir de fichier de traces : %s.\n", NomFichierTraces);
				return(1);
		}
		else
			Verbose = 1;
			return(0);
	}
	else
	{
		if(Verbose)
		{
			fclose(FichierTraces);
			Verbose = 0;
			FichierTraces = NULL;

		}
		return(0);
	}
}

/******************************************************************************
	Ecriture sur fichier ou sortie standard
*******************************************************************************/

void EcritTrace(const char *format,		/* -> Format d'écriture */
				...)					/* -> Valeurs à écrire */
{
	va_list arglist;
	va_start(arglist, format);

	if (Verbose == 0) return;
	if (FichierTraces == NULL)
		vprintf(format, arglist);
	else
		vfprintf(FichierTraces, format, arglist);

//	fflush(FichierTraces);

	return;
}
