/*****************************************************************************
			Eurecom OpenAirInterface 3
			Copyright(c) 2012 Eurecom

Source		log.h

Version		0.1

Date		2012/02/28

Product		NAS stack

Subsystem	Utilities

Author		Frederic Maurel

Description	Usefull logging functions

*****************************************************************************/
#ifndef __NAS_LOG_H__
#define __NAS_LOG_H__

/****************************************************************************/
/*********************  G L O B A L    C O N S T A N T S  *******************/
/****************************************************************************/

/* -----------------------
 * Logging severity levels
 * -----------------------
 *	OFF	: Disables logging trace utilities.
 *	DEBUG	: Only used for debug purpose. Should be removed from the code.
 *	INFO	: Informational trace
 *	WARNING	: The program displays the warning message and doesn't stop.
 *	ERROR	: The program displays the error message and usually exits or
 *		  runs appropriate procedure.
 *	FUNC	: Prints trace when entering/leaving to/from function. Usefull
 *		  to display the function's calling tree information at runtime.
 *	ON	: Enables logging traces excepted FUNC.
 *	ALL	: Turns on ALL logging traces.
 */
#define NAS_LOG_OFF	0x00	/* No trace				*/
#define NAS_LOG_DEBUG	0x01	/* Debug trace				*/
#define NAS_LOG_INFO	0x02	/* Informational trace			*/
#define NAS_LOG_WARNING	0x04	/* Warning trace			*/
#define NAS_LOG_ERROR	0x08	/* Error trace				*/
#define NAS_LOG_FUNC	0x10	/* Entering/Leaving function trace	*/
#define NAS_LOG_HEX	0x20	/* Dump trace				*/

#define NAS_LOG_ON	0x0F	/* All traces excepted FUNC and HEX	*/
#define NAS_LOG_ALL	0xFF	/* All traces				*/

/* Logging severity type */
typedef enum
{
    DEBUG,
    INFO,
    WARNING,
    ERROR,
    FUNC_IN,
    FUNC_OUT,
    LOG_SEVERITY_MAX
} log_severity_t;

/****************************************************************************/
/************************  G L O B A L    T Y P E S  ************************/
/****************************************************************************/

/****************************************************************************/
/********************  G L O B A L    V A R I A B L E S  ********************/
/****************************************************************************/

/****************************************************************************/
/******************  E X P O R T E D    F U N C T I O N S  ******************/
/****************************************************************************/

#define LOG_TRACE log_data(__FILE__, __LINE__); log_trace
#define LOG_DUMP(a, b) log_dump((a),(b));

#define LOG_FUNC_IN LOG_TRACE(FUNC_IN, "Entering %s()", __FUNCTION__)
#define LOG_FUNC_OUT LOG_TRACE(FUNC_OUT, "Leaving %s()", __FUNCTION__)
#define LOG_FUNC_RETURN(rETURNcODE)                                            \
do {                                                                           \
    LOG_TRACE(FUNC_OUT, "Leaving %s(rc = %ld)", __FUNCTION__,                  \
    (long) rETURNcODE);                                                        \
    return (rETURNcODE);                                                       \
} while(0)

void nas_log_init(char filter);
void log_data(const char* filename, int line);
void log_trace(log_severity_t severity, const char* data, ...);
void log_dump(const char* data, int len);

#endif /* __NAS_LOG_H__*/