///
/// \file Traceur.cpp
/// Classe de gestion de messages de tracage d'execution.
/// 
/// @author Nicolas Janey
/// @author nicolas.janey@univ-fcomte.fr
/// @version 1.0, 01/01/10
///

#include <string.h>
#include <stdio.h>
#include <stdarg.h>

#include "Traceur.h"
#include "MakeDir.h"

///
/// Constructeur pour un nouveau Traceur.
///
/// @param te Le booleen indiquant une trace ecran.
/// @param tfn Le nom du fichier dans lequel la trace doit etre effectuee.
/// @param trp Le nom du repertoire dans lequel la trace doit etre effectuee.
/// @param tfi Le booleen indiquant si le fichier de trace doit etre reinitialise a vide.
/// @author Nicolas Janey
/// @author nicolas.janey@univ-fcomte.fr
/// @version 1.0, 25/02/10
///
Traceur::Traceur(int te,char *tfn,char *trp,int tfi) {
  traceEcran = te;
	traceFichierInit = tfi;
  if ( trp ) {
    makeDir(trp);
    strcpy(traceRepertoire,trp);
    strcat(traceRepertoire,"/"); }
    else
    strcpy(traceRepertoire,"./");
  if ( tfn ) {
    strcpy(traceFilename,tfn);
    strcpy(filename,traceRepertoire);
    strcat(filename,traceFilename);
    if ( traceFichierInit )
      f = fopen(filename,"wt");
      else
      f = fopen(filename,"at"); }
    else {
    f = NULL; }
}

///
/// Constructeur pour un nouveau Traceur.
///
/// @param te Le booleen indiquant une trace ecran.
/// @param tfn Le nom du fichier dans lequel la trace doit etre effectuee.
/// @param tfi Le booleen indiquant si le fichier de trace doit etre reinitialise a vide.
/// @author Nicolas Janey
/// @author nicolas.janey@univ-fcomte.fr
/// @version 1.0, 25/02/10
///
Traceur::Traceur(int te,char *tfn,int tfi) {
  traceEcran = te;
	traceFichierInit = tfi;
  strcpy(traceRepertoire,"./");
  if ( tfn ) {
    strcpy(traceFilename,tfn);
    strcpy(filename,traceRepertoire);
    strcat(filename,traceFilename);
    if ( traceFichierInit )
      f = fopen(filename,"wt");
      else
      f = fopen(filename,"at"); }
    else {
    f = NULL; }
}
	
///
/// Destructeur pour un Traceur.
///
/// @author Nicolas Janey
/// @author nicolas.janey@univ-fcomte.fr
/// @version 1.0, 25/02/10
///
Traceur::~Traceur(void) {
  if ( f )
    fclose(f);
}

///
/// Impression d'un message de trace
///
/// @param format La chaine de caracteres de description de l'affichage.
/// @author Nicolas Janey
/// @author nicolas.janey@univ-fcomte.fr
/// @version 1.0, 25/02/10
///
void Traceur::printff(const char *format,...) {
  va_list args;
  va_start(args,format);
  char buffer[65536];
  vsprintf(buffer,format,args);
  if ( traceEcran )
    printf("%s",buffer);
  if ( f )
    fprintf(f,"%s",buffer);
  va_end(args);
}

///
/// Impression d'un message de trace
///
/// @param notFirst Le booleen indiquant si l'affichage ecran doit etre realise.
/// @param format La chaine de caracteres de description de l'affichage.
/// @author Nicolas Janey
/// @author nicolas.janey@univ-fcomte.fr
/// @version 1.0, 25/02/10
///
void Traceur::printfff(int notFirst,const char *format,...) {
  va_list args;
  va_start(args,format);
  char buffer[65536];
  vsprintf(buffer,format,args);
  if ( traceEcran )
    if ( !notFirst )
      printf("%s",buffer);
  if ( f )
    fprintf(f,"%s",buffer);
  va_end(args);
}
