226 lines
13 KiB
C
226 lines
13 KiB
C
/*----------------------------------------------------------------------------*/
|
|
/* log.h */
|
|
/*----------------------------------------------------------------------------*/
|
|
|
|
/*----------------------------------------------------------------------------*/
|
|
/* This file is part of liblog. */
|
|
/* */
|
|
/* Drummer is free software: you can redistribute it and/or modify it */
|
|
/* under the terms of the GNU Lesser General Public License as published */
|
|
/* by the Free Software Foundation, either version 3 of the License, or */
|
|
/* (at your option) any later version. */
|
|
/* */
|
|
/* Drummer 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 Lesser General Public License for more details. */
|
|
/* */
|
|
/* You should have received a copy of the GNU Lesser General Public */
|
|
/* License along with Drummer. If not, see */
|
|
/* <https://www.gnu.org/licenses/>. */
|
|
/*----------------------------------------------------------------------------*/
|
|
|
|
/*----------------------------------------------------------------------------*/
|
|
/* Includes */
|
|
/*----------------------------------------------------------------------------*/
|
|
|
|
#ifndef _LIBLOG_H_
|
|
#define _LIBLOG_H_
|
|
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <stdarg.h>
|
|
#include <stdbool.h>
|
|
#include <errno.h>
|
|
#include <time.h>
|
|
#include <sys/time.h>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*----------------------------------------------------------------------------*/
|
|
/* Pre definitions */
|
|
/*----------------------------------------------------------------------------*/
|
|
|
|
|
|
|
|
/*----------------------------------------------------------------------------*/
|
|
/* Global definitions */
|
|
/*----------------------------------------------------------------------------*/
|
|
|
|
#define LGD_LOG_WRITER_DEFAULT LG_Log_Write
|
|
|
|
|
|
|
|
/*----------------------------------------------------------------------------*/
|
|
/* Definitions */
|
|
/*----------------------------------------------------------------------------*/
|
|
|
|
/*----------------------------------------------------------------------------*/
|
|
/* LGD_API definition */
|
|
/*----------------------------------------------------------------------------*/
|
|
|
|
# ifdef _LIBLOG_C_
|
|
# define LGD_API
|
|
# else
|
|
# define LGD_API extern
|
|
# endif
|
|
|
|
|
|
|
|
/*----------------------------------------------------------------------------*/
|
|
/* Status definition */
|
|
/*----------------------------------------------------------------------------*/
|
|
|
|
typedef short LGT_Status;
|
|
|
|
#define LGS_OK ( LGT_Status) 0
|
|
#define LGS_KO ( LGT_Status) 1
|
|
|
|
|
|
|
|
|
|
|
|
#define LGD_LOG_TYPE_NB 5
|
|
|
|
typedef short LGT_Log_Type_Id;
|
|
|
|
#define LGD_LOG_TYPE_ID_UNKNOWN ( LGT_Log_Type_Id) 0
|
|
#define LGD_LOG_TYPE_ID_TRACE ( LGT_Log_Type_Id) 1
|
|
#define LGD_LOG_TYPE_ID_INFO ( LGT_Log_Type_Id) 2
|
|
#define LGD_LOG_TYPE_ID_WARNING ( LGT_Log_Type_Id) 3
|
|
#define LGD_LOG_TYPE_ID_ERROR ( LGT_Log_Type_Id) 4
|
|
|
|
typedef char *LGT_Log_Type_Name;
|
|
|
|
#define LGD_LOG_TYPE_NAME_UNKNOWN ( LGT_Log_Type_Name) "???"
|
|
#define LGD_LOG_TYPE_NAME_TRACE ( LGT_Log_Type_Name) "TRA"
|
|
#define LGD_LOG_TYPE_NAME_INFO ( LGT_Log_Type_Name) "INF"
|
|
#define LGD_LOG_TYPE_NAME_WARNING ( LGT_Log_Type_Name) "WRN"
|
|
#define LGD_LOG_TYPE_NAME_ERROR ( LGT_Log_Type_Name) "ERR"
|
|
|
|
typedef short LGT_Log_Level;
|
|
|
|
#define LGD_LOG_LEVEL_UNKNOWN ( LGT_Log_Level) 0
|
|
#define LGD_LOG_LEVEL_DEFAULT ( LGT_Log_Level) 1
|
|
|
|
#define LG_LOG_TRACE_0( Level, Fmt) LG_Log( LGD_LOG_TYPE_ID_TRACE, (Level), LGD_MODULE_NAME, __FILE__, __LINE__, true, (Fmt))
|
|
#define LG_LOG_TRACE_1( Level, Fmt, Arg1) LG_Log( LGD_LOG_TYPE_ID_TRACE, (Level), LGD_MODULE_NAME, __FILE__, __LINE__, true, (Fmt), (Arg1))
|
|
#define LG_LOG_TRACE_2( Level, Fmt, Arg1, Arg2) LG_Log( LGD_LOG_TYPE_ID_TRACE, (Level), LGD_MODULE_NAME, __FILE__, __LINE__, true, (Fmt), (Arg1), (Arg2))
|
|
#define LG_LOG_TRACE_3( Level, Fmt, Arg1, Arg2, Arg3) LG_Log( LGD_LOG_TYPE_ID_TRACE, (Level), LGD_MODULE_NAME, __FILE__, __LINE__, true, (Fmt), (Arg1), (Arg2), (Arg3))
|
|
#define LG_LOG_TRACE_4( Level, Fmt, Arg1, Arg2, Arg3, Arg4) LG_Log( LGD_LOG_TYPE_ID_TRACE, (Level), LGD_MODULE_NAME, __FILE__, __LINE__, true, (Fmt), (Arg1), (Arg2), (Arg3), (Arg4))
|
|
#define LG_LOG_TRACE_5( Level, Fmt, Arg1, Arg2, Arg3, Arg4, Arg5) LG_Log( LGD_LOG_TYPE_ID_TRACE, (Level), LGD_MODULE_NAME, __FILE__, __LINE__, true, (Fmt), (Arg1), (Arg2), (Arg3), (Arg4), (Arg5))
|
|
#define LG_LOG_TRACE_6( Level, Fmt, Arg1, Arg2, Arg3, Arg4, Arg5, Arg6) LG_Log( LGD_LOG_TYPE_ID_TRACE, (Level), LGD_MODULE_NAME, __FILE__, __LINE__, true, (Fmt), (Arg1), (Arg2), (Arg3), (Arg4), (Arg5), (Arg6))
|
|
|
|
#define LG_LOG_INFO_0( Fmt) LG_Log( LGD_LOG_TYPE_ID_INFO, LGD_LOG_LEVEL_DEFAULT, LGD_MODULE_NAME, __FILE__, __LINE__, true, (Fmt))
|
|
#define LG_LOG_INFO_1( Fmt, Arg1) LG_Log( LGD_LOG_TYPE_ID_INFO, LGD_LOG_LEVEL_DEFAULT, LGD_MODULE_NAME, __FILE__, __LINE__, true, (Fmt), (Arg1))
|
|
#define LG_LOG_INFO_2( Fmt, Arg1, Arg2) LG_Log( LGD_LOG_TYPE_ID_INFO, LGD_LOG_LEVEL_DEFAULT, LGD_MODULE_NAME, __FILE__, __LINE__, true, (Fmt), (Arg1), (Arg2))
|
|
#define LG_LOG_INFO_3( Fmt, Arg1, Arg2, Arg3) LG_Log( LGD_LOG_TYPE_ID_INFO, LGD_LOG_LEVEL_DEFAULT, LGD_MODULE_NAME, __FILE__, __LINE__, true, (Fmt), (Arg1), (Arg2), (Arg3))
|
|
#define LG_LOG_INFO_4( Fmt, Arg1, Arg2, Arg3, Arg4) LG_Log( LGD_LOG_TYPE_ID_INFO, LGD_LOG_LEVEL_DEFAULT, LGD_MODULE_NAME, __FILE__, __LINE__, true, (Fmt), (Arg1), (Arg2), (Arg3), (Arg4))
|
|
#define LG_LOG_INFO_5( Fmt, Arg1, Arg2, Arg3, Arg4, Arg5) LG_Log( LGD_LOG_TYPE_ID_INFO, LGD_LOG_LEVEL_DEFAULT, LGD_MODULE_NAME, __FILE__, __LINE__, true, (Fmt), (Arg1), (Arg2), (Arg3), (Arg4), (Arg5))
|
|
#define LG_LOG_INFO_6( Fmt, Arg1, Arg2, Arg3, Arg4, Arg5, Arg6) LG_Log( LGD_LOG_TYPE_ID_INFO, LGD_LOG_LEVEL_DEFAULT, LGD_MODULE_NAME, __FILE__, __LINE__, true, (Fmt), (Arg1), (Arg2), (Arg3), (Arg4), (Arg5), (Arg6))
|
|
|
|
#define LG_LOG_WARNING_0( Fmt) LG_Log( LGD_LOG_TYPE_ID_WARNING, LGD_LOG_LEVEL_DEFAULT, LGD_MODULE_NAME, __FILE__, __LINE__, true, (Fmt))
|
|
#define LG_LOG_WARNING_1( Fmt, Arg1) LG_Log( LGD_LOG_TYPE_ID_WARNING, LGD_LOG_LEVEL_DEFAULT, LGD_MODULE_NAME, __FILE__, __LINE__, true, (Fmt), (Arg1))
|
|
#define LG_LOG_WARNING_2( Fmt, Arg1, Arg2) LG_Log( LGD_LOG_TYPE_ID_WARNING, LGD_LOG_LEVEL_DEFAULT, LGD_MODULE_NAME, __FILE__, __LINE__, true, (Fmt), (Arg1), (Arg2))
|
|
#define LG_LOG_WARNING_3( Fmt, Arg1, Arg2, Arg3) LG_Log( LGD_LOG_TYPE_ID_WARNING, LGD_LOG_LEVEL_DEFAULT, LGD_MODULE_NAME, __FILE__, __LINE__, true, (Fmt), (Arg1), (Arg2), (Arg3))
|
|
#define LG_LOG_WARNING_4( Fmt, Arg1, Arg2, Arg3, Arg4) LG_Log( LGD_LOG_TYPE_ID_WARNING, LGD_LOG_LEVEL_DEFAULT, LGD_MODULE_NAME, __FILE__, __LINE__, true, (Fmt), (Arg1), (Arg2), (Arg3), (Arg4))
|
|
#define LG_LOG_WARNING_5( Fmt, Arg1, Arg2, Arg3, Arg4, Arg5) LG_Log( LGD_LOG_TYPE_ID_WARNING, LGD_LOG_LEVEL_DEFAULT, LGD_MODULE_NAME, __FILE__, __LINE__, true, (Fmt), (Arg1), (Arg2), (Arg3), (Arg4), (Arg5))
|
|
#define LG_LOG_WARNING_6( Fmt, Arg1, Arg2, Arg3, Arg4, Arg5, Arg6) LG_Log( LGD_LOG_TYPE_ID_WARNING, LGD_LOG_LEVEL_DEFAULT, LGD_MODULE_NAME, __FILE__, __LINE__, true, (Fmt), (Arg1), (Arg2), (Arg3), (Arg4), (Arg5), (Arg6))
|
|
|
|
#define LG_LOG_ERROR_0( Fmt) LG_Log( LGD_LOG_TYPE_ID_ERROR, LGD_LOG_LEVEL_DEFAULT, LGD_MODULE_NAME, __FILE__, __LINE__, true, (Fmt))
|
|
#define LG_LOG_ERROR_1( Fmt, Arg1) LG_Log( LGD_LOG_TYPE_ID_ERROR, LGD_LOG_LEVEL_DEFAULT, LGD_MODULE_NAME, __FILE__, __LINE__, true, (Fmt), (Arg1))
|
|
#define LG_LOG_ERROR_2( Fmt, Arg1, Arg2) LG_Log( LGD_LOG_TYPE_ID_ERROR, LGD_LOG_LEVEL_DEFAULT, LGD_MODULE_NAME, __FILE__, __LINE__, true, (Fmt), (Arg1), (Arg2))
|
|
#define LG_LOG_ERROR_3( Fmt, Arg1, Arg2, Arg3) LG_Log( LGD_LOG_TYPE_ID_ERROR, LGD_LOG_LEVEL_DEFAULT, LGD_MODULE_NAME, __FILE__, __LINE__, true, (Fmt), (Arg1), (Arg2), (Arg3))
|
|
#define LG_LOG_ERROR_4( Fmt, Arg1, Arg2, Arg3, Arg4) LG_Log( LGD_LOG_TYPE_ID_ERROR, LGD_LOG_LEVEL_DEFAULT, LGD_MODULE_NAME, __FILE__, __LINE__, true, (Fmt), (Arg1), (Arg2), (Arg3), (Arg4))
|
|
#define LG_LOG_ERROR_5( Fmt, Arg1, Arg2, Arg3, Arg4, Arg5) LG_Log( LGD_LOG_TYPE_ID_ERROR, LGD_LOG_LEVEL_DEFAULT, LGD_MODULE_NAME, __FILE__, __LINE__, true, (Fmt), (Arg1), (Arg2), (Arg3), (Arg4), (Arg5))
|
|
#define LG_LOG_ERROR_6( Fmt, Arg1, Arg2, Arg3, Arg4, Arg5, Arg6) LG_Log( LGD_LOG_TYPE_ID_ERROR, LGD_LOG_LEVEL_DEFAULT, LGD_MODULE_NAME, __FILE__, __LINE__, true, (Fmt), (Arg1), (Arg2), (Arg3), (Arg4), (Arg5), (Arg6))
|
|
|
|
#define LG_STACK_TRACE( Level) LG_Stack_Trace( (Level), LGD_MODULE_NAME, __FILE__, __LINE__, true)
|
|
|
|
|
|
|
|
|
|
/*---------------------------------------------------------------------------------*/
|
|
/* LGT_Base */
|
|
/*---------------------------------------------------------------------------------*/
|
|
|
|
typedef LGT_Status (*LGT_Log_Writer_Ptr)( LGT_Log_Type_Id, char *, va_list);
|
|
|
|
typedef struct LGT_Base
|
|
{
|
|
FILE *Log_Stream_Out_Ptr;
|
|
char *Log_Type_Name_Tab[ LGD_LOG_TYPE_NB];
|
|
LGT_Log_Writer_Ptr Log_Writer_Ptr;
|
|
} LGT_Base;
|
|
|
|
|
|
|
|
LGD_API LGT_Base LGG_Base;
|
|
|
|
|
|
|
|
|
|
|
|
/*----------------------------------------------------------------------------*/
|
|
/* Public Prototypes */
|
|
/*----------------------------------------------------------------------------*/
|
|
|
|
/*----------------------------------------------------------------------------*/
|
|
/* LG_Library_Open */
|
|
/*----------------------------------------------------------------------------*/
|
|
/* (I) Log_Stream_Out_Ptr: Log output stream */
|
|
/* (I) Log_Writer_Ptr: Log writer pointer */
|
|
/* (I) Header_Print_Flag: Start by printing an header */
|
|
/*----------------------------------------------------------------------------*/
|
|
|
|
LGD_API LGT_Status LG_Library_Open( FILE *, LGT_Log_Writer_Ptr, bool);
|
|
|
|
|
|
|
|
/*----------------------------------------------------------------------------*/
|
|
/* LG_Library_Close */
|
|
/*----------------------------------------------------------------------------*/
|
|
/* (I) Footer_Print_Flag: End by printing an header */
|
|
/*----------------------------------------------------------------------------*/
|
|
|
|
LGD_API LGT_Status LG_Library_Close( bool);
|
|
|
|
|
|
|
|
/*----------------------------------------------------------------------------*/
|
|
/* LG_Log */
|
|
/*----------------------------------------------------------------------------*/
|
|
|
|
LGD_API LGT_Status LG_Log( LGT_Log_Type_Id, LGT_Log_Level, char *, char *, long, bool, char *, ...);
|
|
|
|
|
|
|
|
/*----------------------------------------------------------------------------*/
|
|
/* LG_Log_Write */
|
|
/*----------------------------------------------------------------------------*/
|
|
|
|
LGD_API LGT_Status LG_Log_Write( LGT_Log_Type_Id, char *, va_list);
|
|
|
|
|
|
|
|
/*------------------------------------------------------------------------------*/
|
|
/* LG_Stack_Trace_Print */
|
|
/*------------------------------------------------------------------------------*/
|
|
|
|
LGD_API LGT_Status LG_Stack_Trace( LGT_Log_Level, char *, char *, long, bool);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*----------------------------------------------------------------------------*/
|
|
|
|
#endif // ifndef _LIBLOG_H_
|