/*! * \file log.c * \brief Módulo com interface para gerar arquivo de log. * * \date 07/05/12 16:23 * \version 0.0.1 * \author Alessandro Elias, ae11@inf.ufpr.br * \author Ruanito Diego Santos, rds@inf.ufpr.br */ #include #include #include #include #include #define _DECLARE_VAR_STREAMLOG_ 1 /* declaracao global de FILE *g_StreamLog */ #include "log.h" #undef _DECLARE_VAR_STREAMLOG_ /* deixe para outros modulos extern FILE *StreamLog */ #include "mycommdef.h" #include "mydebug.h" static char *g_pLogFileName = NULL; /*!< Variável global contém o nome do arquivo de log. */ /* ______________________________________________________________________ */ /*! \brief Obtém nome do arquivo de log. * * \return Retorna ponteiro para o buffer contento nome do arquivo. * Antes de finalizar o programa este ponteiro deve ser liberado. * * \remarks Esta função garante que a cada instância de teste, * somente um arquivo de log correspondete ao número daquela * instância será gerado. O número máximo de arquivos é MAX_LOGS. * * \sa MAX_LOGS, PERRLN, WaitReturn, */ char *GetLogFileName(void) { char *buff = NULL; int i, exist, nlen; int sizebuff = sizeof(FILE_NAME) + SIZE_OF_COMPLEMENT + sizeof(FILE_EXTENTION) + 1; /* calcula tamanho do buffer mais '\0' */ /* aloque memoria */ buff = (char*)malloc(sizebuff); if( buff == NULL ) { PERRLN("Erro, não será possível gerar log. 'GetFileName'"); WaitReturn(); return NULL; } /* construa o nome do arquivo no formato: * FILE_NAMExxx.FILE_EXTENTION * log.xxx.txt * onde xxx = ao numero do arquivo, * varia de 001 a MAX_LOGS (001 a 999). */ strcpy(buff, FILE_NAME); nlen = strlen(buff); exist = 0; for( i=1; i <= MAX_LOGS && !exist; i++ ) { snprintf(buff+nlen, sizebuff-nlen, "%03d%s", i, FILE_EXTENTION); /* gera nome do arquivo de log */ exist = access(buff, F_OK); /* verifica se arquivo ja exist. */ } if( i == MAX_LOGS+1 ) { fprintf(stderr, "Erro existe muitos arquivos de logs.\nRemova algun(s) para que possa ser gerado novo log.\n"); free(buff); buff = NULL; WaitReturn(); }else *(buff+sizebuff-1) = '\0'; /* garanta que o buffer tera string null terminada. */ g_pLogFileName = buff; /* salve ponteiro para a variavel global. */ return buff; /* retorna buffer com nome do arquivo de log. */ }/* GetLogFileName */ /*! * \brief Abre arquivo de log. * * \return TRUE se log foi aberto com sucesso, FALSO caso contrário. * * \sa GetLogFileName, PERRLN, WaitReturn */ bool OpenLog(void) { char *p; if( (p = GetLogFileName()) == NULL ) return FALSE; if((g_StreamLog = fopen(p, "w")) == NULL ) { PERRLN("Erro 'OPenLog'"); WaitReturn(); return FALSE; } return TRUE; }/* OpenLog */ /*! * \brief Constrói uma string da mesma forma que printf, e grava no arquivo de log. * * \param [in] format - formato da string, mesmo padrão que printf. * \param ... - número de parâmetros variável. * * \return número de char's escrito no arquivo, 0 em caso de erro. * * \sa PERRLN, WaitReturn */ int LogMessage(const char *format, ...) { int n; va_list ap; /* verifique se obtemos o stream do log com sucesso. */ if( !g_pLogFileName ) return 0; /* se nao retorne */ va_start(ap, format); /* aponte para o primeiro parametro depois de format */ n = vfprintf(g_StreamLog, format, ap); va_end(ap); if( n < 1 ) { PERRLN("Erro SEVERO 'LogMessage'"); WaitReturn(); } return n; }/* LogMessage */ /*! * \brief Fecha arquivo de log e libera memória. */ void CloseLog(void) { if( g_StreamLog ) fclose(g_StreamLog); if(g_pLogFileName ) free(g_pLogFileName); g_StreamLog = NULL; g_pLogFileName = NULL; }/* CloseLog */