#ifndef _PCALLCTX_UTF8_H
#define _PCALLCTX_UTF8_H

#include "reader/support_utf8.h"

static ATTR_USERES void* pcallctx_malloc(void * alloc_param, size_t size)
{
    return rAllocMemory((pCP_CALL_CTX)alloc_param, size, MP_WORK);
}

static void pcallctx_std_free(void * alloc_param, void * ptr)
{
    rFreeMemory((pCP_CALL_CTX)alloc_param, ptr, MP_WORK);
}


/* Функция копирования строки UTF8 в строку TCHAR с терминальным символом.
dest - буфер для результата. Должен быть размера, достаточного, чтобы поместилась строка TCHAR символов, заканчивающаяся терминальным символом.
src - буфер исходной UTF8 строки, заканчивающейся терминальным символом.

Функция копирует символы, включая терминальный. Если копирование успешно, результатом будет указатель на dest. Иначе результат равен NULL.

Работает через malloc и free.
*/
static SUP_INLINE ATTR_USERES TCHAR * pcallctx_utf82cpy(pCP_CALL_CTX pCallCtx, TCHAR * dest, const char * src)
{
    return _utf82cpy(pcallctx_malloc, pcallctx_std_free, pCallCtx, dest, src, TRUE);
}

/*функция определяет число символов TCHAR, необходимых для записи UTF8-строки, переданной в src. Не считая нулевой символ.

Работает через malloc и free.
*/
static SUP_INLINE ATTR_USERES size_t pcallctx_utf82len(const char * src) //-V524 - да, функции одинаковые, но логика использования разная. Так лучше. 
{
    return _utf82len(src, TRUE);
}

/*перевод строки из TCHAR в UTF8.
Копирует строку из src в формате TCHAR, в UTF8 строку, заканчивающуюся терминальным символом, в dest.
Возвращает NULL при неудаче и dest при успехе.

Работает через malloc и free.
*/
static SUP_INLINE ATTR_USERES char * pcallctx_2utf8cpy(pCP_CALL_CTX pCallCtx, char* dest, const TCHAR* src)
{
    return _2utf8cpy(pcallctx_malloc, pcallctx_std_free, pCallCtx, dest, src, TRUE);
}

/*перевод строки TCHAR из консольной кодировки в TCHAR для отображения.
Копирует строку из src в формате TCHAR, в UTF8 строку, заканчивающуюся терминальным символом, в dest.
Возвращает NULL при неудаче и dest при успехе.

Работает через malloc и free.
*/
static SUP_INLINE ATTR_USERES TCHAR * pcallctx_console_2utf8cpy(pCP_CALL_CTX pCallCtx, TCHAR* dest, const TCHAR* src)
{
    return console_2utf8cpy(pcallctx_malloc, pcallctx_std_free, pCallCtx, dest, src);
}

/*
Функция возвращает длину строки src в кодировке UTF8, без терминального символа.
Работает через malloc и free.
*/
static SUP_INLINE ATTR_USERES size_t pcallctx_2utf8len(pCP_CALL_CTX pCallCtx, const TCHAR * src)
{
    return _2utf8len(pcallctx_malloc, pcallctx_std_free, pCallCtx, src, TRUE);
}

/* Функция копирует строку из TCHAR* в utf8, предварительно создавая буфер */
static SUP_INLINE ATTR_USERES char * pcallctx_tchar2utf8(pCP_CALL_CTX pCallCtx, const TCHAR * tstr)
{
    char * ret = rAllocMemory(pCallCtx, pcallctx_2utf8len(pCallCtx, tstr) + 1, MP_WORK);
    if (!ret)
    {
	return NULL;
    }
    if (pcallctx_2utf8cpy(pCallCtx, ret, tstr) == NULL) {
	rFreeMemory(pCallCtx, ret, MP_WORK);
	return NULL;
    }
    return ret;
}

#endif /*_PCALLCTX_UTF8_H*/
