#include "stdafx.h"
#include "globals.h"

//то же что и для дир + меняем страшные символы '\' и '/' на нестрашную '.'
void SetSafeName(CString &str)
{
	SetSafeDir(str);
	str.Replace(_T('/'), _T('.'));
	str.Replace(_T('\\'), _T('.'));
}
//меняем страшные символы '>','<',':','|','?','*' на нестрашную '_'
//и все коды меньше пробела - на '_'
void SetSafeDir(CString &str)
{
	str.Replace(_T('>'), _T('_'));
	str.Replace(_T('<'), _T('_'));
	str.Replace(_T(':'), _T('_'));
	str.Replace(_T('|'), _T('_'));
	str.Replace(_T('?'), _T('_'));
	str.Replace(_T('*'), _T('_'));
	int len = str.GetLength();

	//а теперь заменим все символы с кодом меньше 32
	for (int i = 0; i < len; ++i)
	{
		if (str[i] < 32)
		{
			str.SetAt(i, _T('_'));
		}
	}
}

//вот бкшная таблица
//таблица соответствия верхней половины аскии кодов с 128 по 255, включая псевдографику
static const TCHAR koi8tbl[128] =
{
	//{200..237} этих символов на бк нету.
	_T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '),
	_T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '),
	_T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '),
	_T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '),
	//{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}
	_T('ю'), _T('а'), _T('б'), _T('ц'), _T('д'), _T('е'), _T('ф'), _T('г'),
	_T('х'), _T('и'), _T('й'), _T('к'), _T('л'), _T('м'), _T('н'), _T('о'),
	_T('п'), _T('я'), _T('р'), _T('с'), _T('т'), _T('у'), _T('ж'), _T('в'),
	_T('ь'), _T('ы'), _T('з'), _T('ш'), _T('э'), _T('щ'), _T('ч'), _T('ъ'),
	//{340..377}
	_T('Ю'), _T('А'), _T('Б'), _T('Ц'), _T('Д'), _T('Е'), _T('Ф'), _T('Г'),
	_T('Х'), _T('И'), _T('Й'), _T('К'), _T('Л'), _T('М'), _T('Н'), _T('О'),
	_T('П'), _T('Я'), _T('Р'), _T('С'), _T('Т'), _T('У'), _T('Ж'), _T('В'),
	_T('Ь'), _T('Ы'), _T('З'), _T('Ш'), _T('Э'), _T('Щ'), _T('Ч'), _T('Ъ')
};

TCHAR BKToUNICODE_Char(uint8_t b)
{
	if (b == 0)
	{
		return 0;
	}

	if (b < 32)
	{
		return _T(' ');
	}

	if (b >= 32 && b < 127)
	{
		return TCHAR(b);
	}

	if (b == 127)
	{
		return TCHAR(0x25a0);
	}

	if (b >= 128)
	{
		return koi8tbl[b - 128];
	}

	return 0; //этот return не должен выполниться в принципе.
}

CString BKToUNICODE(uint8_t *pBuff, int size)
{
	CString strRet;
	LPTSTR pstr = strRet.GetBufferSetLength(size + 1);
	int len = 0;

	while (len < size)
	{
		TCHAR tch = BKToUNICODE_Char(pBuff[len]);
		pstr[len++] = tch;

		if (tch == 0)
		{
			break;
		}
	}

	strRet.ReleaseBuffer(len - 1);
	return strRet;
}

CString &NormalizePath(CString &strPath)
{
	if (!strPath.IsEmpty())
	{
		strPath.TrimRight(_T('\\'));
		strPath += _T('\\');
	}

	return strPath;
}

CString GetFilePath(const CString &strFile)
{
	CString strDrive;
	CString strPath;
	_tsplitpath_s(strFile.GetString(), strDrive.GetBufferSetLength(_MAX_DIR), _MAX_DIR, strPath.GetBufferSetLength(MAX_FILE_PATH), MAX_FILE_PATH, nullptr, 0, nullptr, 0);
	strDrive.ReleaseBuffer();
	strPath.ReleaseBuffer();
	return NormalizePath(strDrive.Trim() + strPath.Trim());
}

CString GetFileTitle(const CString &strFile)
{
	CString strName;
	_tsplitpath_s(strFile.GetString(), nullptr, 0, nullptr, 0, strName.GetBufferSetLength(MAX_FILE_PATH), MAX_FILE_PATH, nullptr, 0);
	strName.ReleaseBuffer();
	return strName.Trim();
}

CString GetFileName(const CString &strFile)
{
	CString strName;
	CString strExt;
	_tsplitpath_s(strFile.GetString(), nullptr, 0, nullptr, 0, strName.GetBufferSetLength(MAX_FILE_PATH), MAX_FILE_PATH, strExt.GetBufferSetLength(_MAX_EXT), _MAX_EXT);
	strName.ReleaseBuffer();
	strExt.ReleaseBuffer();
	return strName.Trim() + strExt.Trim();
}

CString GetFileExt(const CString &strFile)
{
	CString strExt;
	_tsplitpath_s(strFile.GetString(), nullptr, 0, nullptr, 0, nullptr, 0, strExt.GetBufferSetLength(_MAX_EXT), _MAX_EXT);
	strExt.ReleaseBuffer();
	return strExt.Trim();
}


