#ifndef __LOG_H__
#define __LOG_H__

#include <stdio.h>
#include <stdint.h>

#ifndef NULL
#define NULL ((void*)0)
#endif

#define TRUSTLET_TAG_D "[D]SKPM "
#define TRUSTLET_TAG_I "[I]SKPM "
#define TRUSTLET_TAG_E "[E]SKPM "
#define PRINT_LEN 1024
#define FILE_LEN 18

#ifdef USE_QSEE
#include "qsee_log.h"
#if defined(MSM8952) || defined(MSM8956)
#define PLATFORM_PRINT(TAG, STR) QSEE_LOG(TAG, "%s", STR)
#else
#define PLATFORM_PRINT(TAG, STR) qsee_printf(TAG"%s", STR)
#endif
#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

#if defined(USE_BLOWFISH)
#define PLATFORM_PRINT(TAG, STR) printf(TAG"%s\n", STR)
#endif

#define FORMAT_MESSAGE(BUF, FMT, ...) \
{ \
    const char* file = __FILE__; \
    int fileOffset = strlen(file) - FILE_LEN; \
    snprintf(BUF, PRINT_LEN, "~%.*s:%4d: "FMT, FILE_LEN, file + (fileOffset >= 0 ? fileOffset : 0), __LINE__, ##__VA_ARGS__); \
}

#define PRINT_MESSAGE(TAG, FMT, ...) \
{ \
    char str[PRINT_LEN]; \
    FORMAT_MESSAGE(str, FMT, ##__VA_ARGS__); \
    PLATFORM_PRINT(TAG, str); \
}

#if defined(USE_MOBICORE) || defined(USE_QSEE) || defined(USE_BLOWFISH)
#if defined(MSM8952) || defined(MSM8956)
#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 DEBUG_LOW
#define LOGD(fmt, ...) PRINT_MESSAGE(QSEE_LOG_MSG_DEBUG, fmt, ##__VA_ARGS__)
#else
#define LOGD(fmt, ...)
#endif /* DEBUG_LOW */
#else /* defined(MSM8952 || MSM8956)  */
#define LOGI(fmt, ...) PRINT_MESSAGE(TRUSTLET_TAG_I, fmt, ##__VA_ARGS__)
#define LOGE(fmt, ...) PRINT_MESSAGE(TRUSTLET_TAG_E, fmt, ##__VA_ARGS__)
#ifdef DEBUG_LOW
#define LOGD(fmt, ...) PRINT_MESSAGE(TRUSTLET_TAG_D, fmt, ##__VA_ARGS__)
#else
#define LOGD(fmt, ...)
#endif
#endif /* defined(MSM8952 || MSM8956)  */
#endif

#endif /* __LOG_H__ */

