#include "stdafx.h"
#include "MyString.h"
#include "Additional_functions.h"
//#include <string.h>

sMyString::sMyString(const sMyString& vMyString)
{
	this->sMyString::sMyString();
	*this = vMyString;
}

sMyString::operator sMyString() const
{
	return *this;
}

void sMyString::fTempData2()
{
	if (!fNull((unsigned int)vTempData2) && !((*(char *)vTempData2) == 0xdd))
	{
		delete vTempData2;
	}
	vTempData2 = NULL;
	if (vBoolData)
	{
		vTempData2 = (char *)fCpyStr(vData);
	}
	else if (vBoolTempData)
	{
		vTempData2 = (char *)fCpyStr(vTempData);
	}
}

sMyString::operator char *() const
{
	if (vTempData2)
	{
		return vTempData2;
	}
	return NULL;
}

void sMyString::operator = (sMyString& vMyString)
{
	if (vMyString.vLen > 0)
	{
		vBoolData = vBoolData;
	}
	vStr = (char *)fCpyStr(!fNull((unsigned int)vMyString.vData) ? vMyString.vData : (!fNull((unsigned int)vMyString.vTempData) ? vMyString.vTempData : NULL));
	if (vBoolData == true)
	{
		//delete vData;
		fFreeString2(vData);
		vData = NULL;
		vBoolData = false;
		/*if (vData)
		{
			free(vData);
		}*/
	}
	if (vMyString.vTempData)
	{
		//vMyString.~sMyString();
		if (vMyString.vBoolData == true)
		{
			fFreeString2(vMyString.vData);
			vMyString.vData = NULL;
			vMyString.vBoolData = false;
		}
		fFreeString2(vMyString.vTempData);
		vMyString.vTempData = NULL;
		delete vMyString;
	}
	if (vStr)
	{
		vBoolData = true;
		vData = vStr;
	}
	if (vData)
	{
		vLen = strlen(vData);
	}
	else
	{
		vLen = 0;
	}
	fTempData2();
	//return *this;
	//return sMyString(vStr);
}

void sMyString::operator = (char *vMyString)
{
	vStr = (char *)fCpyStr(vMyString);
	if (vBoolData == true)
	{
		//delete vData;
		fFreeString2(vData);
		vData = NULL;
		vBoolData = false;
	}
	if (vBoolTempData == true)
	{
		fFreeString2(vTempData);
		vTempData = NULL;
		vBoolTempData = false;
	}
	if (vStr)
	{
		vBoolData = true;
		vData = vStr;
	}
	if (vData)
	{
		vLen = strlen(vData);
	}
	else
	{
		vLen = 0;
	}
	fTempData2();
	//return *this;
	//return sMyString(vStr);
}

/*void sMyString::operator + (const sMyString& vMyString)
{
	vStr = (char *)fAddString2(vData,vMyString.vData,0);
	if (vData)
	{
		delete vData;
	}
	vData = vStr;
	vLen = strlen(vData);
}*/

sMyString operator + (char* vMyString1, sMyString& vMyString2)
{
	char *vStr = (char *)fAddString2(!fNull((unsigned int)vMyString1) ? vMyString1 : 
									!fNull((unsigned int)vMyString2.vData) ? vMyString2.vData : (fNull((unsigned int)vMyString2.vTempData) ? vMyString2.vTempData : NULL),
									0);
	if (vMyString2.vTempData)
	{
		if (vMyString2.vBoolData == true)
		{
			fFreeString2(vMyString2.vData);
			vMyString2.vData = NULL;
			vMyString2.vBoolData = false;
		}
		if (vMyString2.vBoolTempData == true)
		{
			fFreeString2(vMyString2.vTempData);
			vMyString2.vTempData = NULL;
			vMyString2.vBoolTempData = false;
		}
		delete vMyString2;
	}
	sMyString *vMyString = new sMyString();
	vMyString->vTempData = vStr;
	if (vMyString->vTempData)
	{
		vMyString->vLenTemp = strlen(vMyString->vTempData);
		vMyString->vBoolTempData = true;
	}
	else
	{
		vMyString->vLenTemp = 0;
	}
	vMyString->fTempData2();
	return *vMyString;
}

sMyString operator + (sMyString& vMyString1, char* vMyString2)
{
	char *vStr = (char *)fAddString2(!fNull((unsigned int)vMyString1.vData) ? vMyString1.vData : (!fNull((unsigned int)vMyString1.vTempData) ? vMyString1.vTempData : NULL),
									!fNull((unsigned int)vMyString2) ? vMyString2 :	0,
									0);
	if (vMyString1.vTempData)
	{
		if (vMyString1.vBoolData == true)
		{
			fFreeString2(vMyString1.vData);
			vMyString1.vData = NULL;
			vMyString1.vBoolData = false;
		}
		if (vMyString1.vBoolTempData == true)
		{
			fFreeString2(vMyString1.vTempData);
			vMyString1.vTempData = NULL;
			vMyString1.vBoolTempData = false;
		}
		delete vMyString1;
	}
	sMyString *vMyString = new sMyString();
	vMyString->vTempData = vStr;
	if (vMyString->vTempData)
	{
		vMyString->vLenTemp = strlen(vMyString->vTempData);
		vMyString->vBoolTempData = true;
	}
	else
	{
		vMyString->vLenTemp = 0;
	}
	vMyString->fTempData2();
	return *vMyString;
}

sMyString operator + (sMyString& vMyString1, sMyString& vMyString2)
{
	char *vStr = (char *)fAddString2(!fNull((unsigned int)vMyString1.vData) ? vMyString1.vData : (!fNull((unsigned int)vMyString1.vTempData) ? vMyString1.vTempData : NULL),
									!fNull((unsigned int)vMyString2.vData) ? vMyString2.vData : (fNull((unsigned int)vMyString2.vTempData) ? vMyString2.vTempData : NULL),
									0);
	if (vMyString1.vTempData)
	{
		if (vMyString1.vBoolData == true)
		{
			fFreeString2(vMyString1.vData);
			vMyString1.vData = NULL;
			vMyString1.vBoolData = false;
		}
		if (vMyString1.vBoolTempData == true)
		{
			fFreeString2(vMyString1.vTempData);
			vMyString1.vTempData = NULL;
			vMyString1.vBoolTempData = false;
		}
		delete vMyString1;
		//vMyString1.~sMyString();
		/*if (vMyString1)
		{
			free(vMyString1);
		}*/
	}
	if (vMyString2.vTempData)
	{
		if (vMyString2.vBoolData == true)
		{
			fFreeString2(vMyString2.vData);
			vMyString2.vData = NULL;
			vMyString2.vBoolData = false;
		}
		if (vMyString2.vBoolTempData == true)
		{
			fFreeString2(vMyString2.vTempData);
			vMyString2.vTempData = NULL;
			vMyString2.vBoolTempData = false;
		}
		delete vMyString2;
		//vMyString2.~sMyString();
		/*if (vMyString2)
		{
			free(vMyString2);
		}*/
	}
	sMyString *vMyString = new sMyString();//(sMyString*) malloc(sizeof(sMyString));//new sMyString();
	vMyString->vTempData = vStr;
	if (vMyString->vTempData)
	{
		vMyString->vLenTemp = strlen(vMyString->vTempData);
		vMyString->vBoolTempData = true;
	}
	else
	{
		vMyString->vLenTemp = 0;
	}
	vMyString->fTempData2();
	return *vMyString;
}

/*void sMyString::operator + (char *vMyString)
{
	vStr = (char *)fAddString2(vData,vMyString,0);
	if (vData)
	{
		delete vData;
	}
	vData = vStr;
	vLen = strlen(vData);
}*/

bool sMyString::operator == (const sMyString& vMyString)
{
	if (vMyString.vBoolData)
	{
		return fCmpStr(vData,vMyString.vData);
	}
	if (vMyString.vBoolTempData)
	{
		return fCmpStr(vData,vMyString.vTempData);
	}
	return FALSE;
}

bool sMyString::operator == (char* vMyString)
{
	if (vBoolData)
	{
		return fCmpStr(vMyString,vData);
	}
	if (vBoolTempData)
	{
		return fCmpStr(vMyString,vTempData);
	}
	return FALSE;
}

bool sMyString::operator != (const sMyString& vMyString)
{
	if (vMyString.vBoolData)
	{
		return !fCmpStr(vData,vMyString.vData);
	}
	if (vMyString.vBoolTempData)
	{
		return !fCmpStr(vData,vMyString.vTempData);
	}
	return FALSE;
}

bool sMyString::operator != (char* vMyString)
{
	if (vBoolData)
	{
		return !fCmpStr(vMyString,vData);
	}
	if (vBoolTempData)
	{
		return !fCmpStr(vMyString,vTempData);
	}
	return FALSE;
}

sMyString::sMyString()
{
	vTempData = NULL;
	vLenTemp = 0;
	vBoolTempData = false;
	vData = NULL;
	vLen = 0;
	vBoolData = false;
	vTempData2 = NULL;
}

sMyString::sMyString(char* pStr)
{
	vData = NULL;
	vBoolData = false;
	vBoolTempData = false;
	vStr = (char *)fCpyStr(pStr);
	if (vStr)
	{
		vBoolData = true;
		vData = vStr;
	}
	if (vData)
	{
		vLen = strlen(vData);
	}
	else
	{
		vLen = 0;
	}
	vTempData = NULL;
	vLenTemp = 0;
	vTempData2 = NULL;
	fTempData2();
}

sMyString::sMyString(int vInt)
{
	vData = NULL;
	vBoolData = false;
	vStr = (char *)fCharToString(vInt);
	if (vStr)
	{
		vBoolData = true;
		vData = vStr;
	}
	if (vData)
	{
		vLen = strlen(vData);
	}
	else
	{
		vLen = 0;
	}
	vTempData = NULL;
	vLenTemp = 0;
	vTempData2 = NULL;
	fTempData2();
}

sMyString::~sMyString()
{
	if (vBoolData == true)
	{
		fFreeString2(vData);
	}
	if (vBoolTempData == true)
	{
		fFreeString2(vTempData);
	}
	fFreeString2(vTempData2);
	//delete vData;
	//delete vTempData;
	/*if (!fNull((unsigned int)vData))
	{
		fFreeString2(vData);
	}
	/*if (!fNull((unsigned int)vTempData))
	{
		fFreeString2(vTempData);
	}*/
	vData = NULL;
	vTempData = NULL;
	vBoolData = false;
	vBoolTempData = false;
	vTempData2 = NULL;
}