#include "StdAfx.h"
#include "MyFile.h"

//нижняя таблица для конвертации ibm 2 bk
const BYTE CMyFile::m_LowRow[32] =
{
	10, 127, 127, 162, 184, 180, 169,  46,
	127,  9,  10,  43,  43,   0, 127,  36,
	190, 177, 179,  33, 160,  36,  95, 179,
	179, 173, 190, 177,  95, 181, 179, 173
};


//таблица соответствия верхней половины аскии кодов с 128 по 255, включая псевдографику
const WCHAR CMyFile::m_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('Ъ')
};


CMyFile::CMyFile(const CString &strName)
	: m_f(NULL)
	, m_nFileLength(0)
	, m_strFileName(strName)
{
	m_nTabWidth = 8;
}


CMyFile::~CMyFile(void)
{
	Close();
}

BOOL CMyFile::Open(BOOL bWrite)
{
	return FALSE;
}

void CMyFile::Close()
{
	if (m_f)
	{
		fclose(m_f);
		m_f = NULL;
		m_nFileLength = 0;
	}
}

WCHAR CMyFile::ReadChar()
{
	return 0;
}

BYTE CMyFile::ReadByte()
{
	BYTE b = 0;

	if (m_f)
	{
		fread(&b, sizeof(BYTE), 1, m_f);
	}

	return b;
}

WORD CMyFile::ReadWord()
{
	WORD w = 0;

	if (m_f)
	{
		fread(&w, sizeof(WORD), 1, m_f);
	}

	return w;
}

BOOL CMyFile::WriteChar(WCHAR ch)
{
	return FALSE;
}

BOOL CMyFile::WriteByte(BYTE b)
{
	size_t n = 0;

	if (m_f)
	{
		n = fwrite(&b, sizeof(BYTE), 1, m_f);
	}

	return (n != 0);
}

fpos_t CMyFile::GetPos()
{
	if (m_f)
	{
		return ftell(m_f);
	}

	return 0;
}

int CMyFile::SetPos(fpos_t pos, DWORD mode)
{
	if (m_f)
	{
		return fseek(m_f, pos, mode);
	}

	return 0;
}

BOOL CMyFile::isEOF()
{
	if (m_f)
	{
		//long pos = ftell(m_f);
		//return (pos >= m_nFileLength);
		return (BOOL)feof(m_f);
	}

	return TRUE;
}

WCHAR CMyFile::BKToUNICODE_Byte(BYTE b)
{
	if (b == 0)
	{
		return 0;
	}

	if (b < 32)
	{
		return (WCHAR)b; //на БК коды меньше пробела - обычно управляющие символы. и требуют обработки по своему.
	}
	else if (b >= 32 && b < 127)
	{
		return (WCHAR)b;
	}
	else if (b == 127)
	{
		return (WCHAR)0x25a0;
	}
	else if (b >= 128)
	{
		return m_koi8tbl[b - 128];
	}

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

/*
преобразование юникодного символа, в бкшный кои8.
вход:
tch - преобразуемый символ
выход:
кои8 символ
*/
BYTE CMyFile::UNICODEtoBK_Byte(WCHAR tch)
{
	BYTE b;

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

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

		for (int i = 32; i < 128; ++i)
		{
			if (m_koi8tbl[i] == tch)
			{
				b = LOBYTE(i) + 0200;
				break;
			}
		}
	}

	return b;
}
