#ifndef TZ_LOG_H
#define TZ_LOG_H

#include <stdio.h>

#ifdef USE_TOOLCHAIN_GNU
#define sprintf TEE_LogPrintf
#define snprintf TEE_LogPrintf
#endif

#define TRUSTLET_TAG_D "[D]MLDAP "
#define TRUSTLET_TAG_I "[I]MLDAP "
#define TRUSTLET_TAG_E "[E]MLDAP "
#define PRINT_LEN 255
#define FILE_LEN 24

#ifdef USE_QSEE
#include "qsee_log.h"
#define QSEE_LOG  qsee_log
#define PLATFORM_PRINT(TAG, STR) qsee_log(QSEE_LOG_MSG_ERROR, "%s", STR)
#endif

#ifdef USE_MOBICORE
#include "tlStd.h"
#include "TlApi/TlApi.h"
#include "TlApi/TlApiMcSystem.h"
#define PLATFORM_PRINT(TAG, STR) tlDbgPrintf(TAG"%s\n", STR)
#endif

#ifdef USE_BLOWFISH
//#include "syslog.h"
#define PLATFORM_PRINT(TAG, STR) \
{ \
	char resultStr[PRINT_LEN]; \
	snprintf(resultStr, PRINT_LEN, TAG"%s\n", STR); \
	strprint(resultStr); \
}
#endif

#ifdef SWD_DEBUG
#define FORMAT_MESSAGE(BUF, FMT, ...) { \
	const char* file = __FILE__; \
	char trip_dot[4] = ""; \
	int fileOffset = 0; \
	if (strlen(file) > FILE_LEN) \
	{ \
		fileOffset = strlen(file) - FILE_LEN; \
		strncpy(trip_dot, "...", 4); \
	} \
	snprintf(BUF, PRINT_LEN, "%3s%24s:%4d: "FMT, trip_dot, file + fileOffset, __LINE__, ##__VA_ARGS__); \
}
#else
#define FORMAT_MESSAGE(BUF, FMT, ...) { \
	snprintf(BUF, PRINT_LEN, FMT, ##__VA_ARGS__); \
}
#endif

#define PRINT_MESSAGE(TAG, FMT, ...) { \
	char str[PRINT_LEN]; \
	FORMAT_MESSAGE(str, FMT, ##__VA_ARGS__); \
	PLATFORM_PRINT(TAG, str); \
}

#ifdef USE_QSEE
#define LOGI(fmt, ...)	PRINT_MESSAGE(QSEE_LOG_MSG_DEBUG, fmt, ##__VA_ARGS__)
#define LOGE(fmt, ...)	PRINT_MESSAGE(QSEE_LOG_MSG_ERROR, fmt, ##__VA_ARGS__)
#ifdef SWD_DEBUG
#define LOGD(fmt, ...)	PRINT_MESSAGE(QSEE_LOG_MSG_DEBUG, fmt, ##__VA_ARGS__)
#else
#define LOGD(fmt, ...)
#endif
#endif

#if defined(USE_MOBICORE) //|| defined(USE_BLOWFISH)
#define LOGI(fmt, ...)	PRINT_MESSAGE(TRUSTLET_TAG_I, fmt, ##__VA_ARGS__)
#define LOGE(fmt, ...)	PRINT_MESSAGE(TRUSTLET_TAG_E, fmt, ##__VA_ARGS__)
#ifdef SWD_DEBUG
#define LOGD(fmt, ...)	PRINT_MESSAGE(TRUSTLET_TAG_D, fmt, ##__VA_ARGS__)
#else
#define LOGD(fmt, ...)
#endif
#endif

#ifdef USE_BLOWFISH
#define LOGI printf	//printf("%s\n", str);
#define LOGE printf	//printf("%s\n", str);
#ifdef SWD_DEBUG
#define LOGD(fmt, ...)	printf("[D]MLDAP "fmt, ##__VA_ARGS__)
#else
#define LOGD(fmt, ...)
#endif
#define memcpy		TEE_MemMove
#define memset		TEE_MemFill
#define memcmp		TEE_MemCompare

#endif

#endif