#include "StdAfx.h"
#include "ImgUtil.h"


CString g_ImageErrorStr[] =
{
	_T("Успешно."),
	_T("Недостаточно памяти."),
	_T("Невозможно открыть файл."),
	_T("Невозможно создать файл."),
	_T("Файл не открыт."),
	_T("Ошибка позиционирования в файле."),
	_T("Ошибка чтения файла."),
	_T("Ошибка записи в файл."),
	_T("Невозможно создать директорию."),
	_T("Ошибки в формате файловой системы."),
	_T("") //на будущее
};

/*
преобразование имени файла из кои8 в юникод. с удалением запрещённых символов
*/
CString BKToUNICODE(BYTE *pBuff, int size, const TCHAR table[])
{
	CString strRet = _T("");
	TCHAR tch;

	for (int i = 0; i < size; ++i)
	{
		tch = BKToUNICODE_Byte(pBuff[i], table);

		if (tch == 0)
		{
			break;
		}

		strRet += tch;
	}

	return strRet;
}

TCHAR BKToUNICODE_Byte(BYTE b, const TCHAR table[])
{
	if (b == 0)
	{
		return 0;
	}

	if (b < 32)
	{
		return _T(' ');
	}
	else if (b >= 32 && b < 127)
	{
		return (TCHAR)b;
	}
	else if (b == 127)
	{
		return (TCHAR)0x25a0;
	}
	else if (b >= 128)
	{
		return table[b - 128];
	}

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


/*
преобразование юникодной строки в бкшный кои8.
вход:
ustr - преобразуемая строка
pBuff - буфер, куда выводится результат
bufSize - размер буфера
bFillBuf - флаг. если строка короче размера буфера, буфер до конца забивается пробелами. (конца строки - 0 нету.)
*/
void UNICODEtoBK(const CString &ustr, BYTE *pBuff, int bufSize, BOOL bFillBuf)
{
	int len = ustr.GetLength();
	int n = 0;
	int bn = 0;
	TCHAR ch;
	BYTE b;

	while (n < len)
	{
		ch = ustr.GetAt(n++); //берём очередной символ

		if (ch < 32) //если символ меньше пробела,
		{
			b = 32;    //то будет пробел
		}
		else if ((32 <= ch) && (ch < 127)) //если буквы-цифры- знаки препинания
		{
			b = LOBYTE(ch); // то буквы-цифры- знаки препинания
		}
		else if (ch == 0x25a0) //если такое
		{
			b = 127; //то это. это единственное исключение в нижней половине аски кодов
		}
		else //если всякие другие символы
		{
			//то ищем в таблице нужный нам символ, а его номер - будет кодом кои8
			b = 32; //если такого символа нету в таблице - будет пробел

			for (int i = 0; i < 128; ++i)
			{
				if (koi8tbl10[i] == ch)
				{
					b = LOBYTE(i) + 0200;
					break;
				}
			}
		}

		pBuff[bn++] = b;

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

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


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

	if (l)
	{
		str.Replace(_T('>'), rch);
		str.Replace(_T('<'), rch);
		str.Replace(_T(':'), rch);
		str.Replace(_T('|'), rch);
		str.Replace(_T('?'), rch);
		str.Replace(_T('*'), rch);

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

//получим номер окончания слова в зависимости от числа num (предполагаем, что нет отрицательных чисел)
unsigned int GetWordEndIdx(unsigned int num)
{
	static const unsigned int nn[10] = { 2, 0, 1, 1, 1, 2, 2, 2, 2, 2 };

	//исключение 10..19, здесь всегда 2
	if ((num >= 10) && (num <= 19))
	{
		return 2;
	}

	//все остальные окончания определяются по одной крайней правой цифре.
	//вот её и получим
	num %= 10;
	return nn[num];
}
