#include "pch.h"
#include "ConvW2k.h"

// таблица соответствия верхней половины аскии кодов с 128 по 255, включая псевдографику
const std::array<wchar_t, KOI8TBL_SIZE> koi8tbl =   // {200..237} этих символов на бк нету.
{
	L' ',   L' ',   L' ',   L' ',   L' ',   L' ',   L' ',   L' ',
	L' ',   L' ',   L' ',   L' ',   L' ',   L' ',   L' ',   L' ',
	L' ',   L' ',   L' ',   L' ',   L' ',   L' ',   L' ',   L' ',
	L' ',   L' ',   L' ',   L' ',   L' ',   L' ',   L' ',   L' ',
	// {240..277}
	0xb6,   0x2534, 0x2665, 0x2510, 0x2561, 0x251c, 0x2514, 0x2550,
	0x2564, 0x2660, 0x250c, 0x252c, 0x2568, 0x2193, 0x253c, 0x2551,
	0x2524, 0x2190, 0x256c, 0x2191, 0x2663, 0x2500, 0x256b, 0x2502,
	0x2666, 0x2518, 0x256a, 0x2565, 0x2567, 0x255e, 0x2192, 0x2593,
	// {300..337}
	L'ю',   L'а',   L'б',   L'ц',   L'д',   L'е',   L'ф',   L'г',
	L'х',   L'и',   L'й',   L'к',   L'л',   L'м',   L'н',   L'о',
	L'п',   L'я',   L'р',   L'с',   L'т',   L'у',   L'ж',   L'в',
	L'ь',   L'ы',   L'з',   L'ш',   L'э',   L'щ',   L'ч',   L'ъ',
	// {340..377}
	L'Ю',   L'А',   L'Б',   L'Ц',   L'Д',   L'Е',   L'Ф',   L'Г',
	L'Х',   L'И',   L'Й',   L'К',   L'Л',   L'М',   L'Н',   L'О',
	L'П',   L'Я',   L'Р',   L'С',   L'Т',   L'У',   L'Ж',   L'В',
	L'Ь',   L'Ы',   L'З',   L'Ш',   L'Э',   L'Щ',   L'Ч',   L'Ъ'
};

uint8_t UNICODEtoBK_ch(wchar_t uchr)
{
	if (uchr == L'\t')
	{
		return CHR_TAB;
	}

	if (uchr == L'\n')
	{
		return CHR_N;
	}

	if (uchr < CHR_SPACE) // если символ меньше пробела,
	{
		return CHR_SPACE;  // то будет пробел
	}

	if ((CHR_SPACE <= uchr) && (uchr < 127)) // если буквы-цифры- знаки препинания
	{
		return uint8_t(uchr); // то буквы-цифры- знаки препинания
	}

	if (uchr == CHR_USCQR) // если такое
	{
		return CHR_127; // то это. это единственное исключение в нижней половине аски кодов
	}

	// если всякие другие символы
	// то ищем в таблице нужный нам символ, а его номер - будет кодом кои8

	if (uchr == L'ё')
	{
		uchr = L'е'; // меняем ё на е, т.к. на БК нету такой буквы
	}
	else if (uchr == L'Ё')
	{
		uchr = L'Е'; // меняем ё на е, т.к. на БК нету такой буквы
	}

	for (uint8_t i = 32; i < KOI8TBL_SIZE; ++i)
	{
		if (koi8tbl[i] == uchr)
		{
			return (i + 0200);
		}
	}

	return CHR_SPACE; // если такого символа нету в таблице - будет пробел
}

void UNICODEtoBK(std::wstring &ustr, uint8_t *pBuff, size_t bufSize, bool bFillBuf)
{
	const size_t len = ustr.length();
	size_t bn = 0;

	for (size_t n = 0; n < len; ++n)
	{
		pBuff[bn++] = UNICODEtoBK_ch(ustr[n]);

		if (bn >= bufSize)
		{
			break;
		}
	}

	if (bFillBuf)
	{
		while (bn < bufSize)
		{
			pBuff[bn++] = CHR_SPACE;
		}
	}
}
