#include "String.h"

//not optimized at all (
STRING String::ReplaceAll(STRING originalString, STRING subStringToReplace, STRING newValue)
{
	STRING entry = StrStr(originalString, subStringToReplace);
	if ( 0 == entry )
		//simply return copy of original
		return StrDup(originalString);
	
	//we have first entry 
	UINT leftSize = PtrToUint(entry) - PtrToUint(originalString);
	UINT originalLength = StrLen(originalString);
	UINT subLength = StrLen(subStringToReplace);
	UINT newValueSize = StrLen(newValue);
	UINT rightSize = originalLength - leftSize - subLength;
	UINT resultSize = leftSize + rightSize + newValueSize;
	
	STRING result = (STRING) System::SafeAllocMemory(resultSize + 1); //+1 for null character
	System::MemCpy((BYTE*)result,(BYTE*)originalString,leftSize);
	System::MemCpy((BYTE*)(result + leftSize), (BYTE*)newValue, newValueSize);
	System::MemCpy((BYTE*)(result + leftSize + newValueSize),(BYTE*) (entry + subLength), rightSize);
	
	ReplaceAll(result, subStringToReplace, newValue);
	return result;
}

void String::StrCpy(STRING dest, STRING source)
{
#ifdef WINDOWS
	lstrcpyA(dest, source);
#else
	strcpy(dest, source);
#endif
}


UINT String::StrLen(STRING string)
{
#ifdef WINDOWS
	return lstrlenA(string);
#else
	return strlen(string);
#endif
}

void String::StrCat(STRING dest, STRING src)
{
#ifdef WINDOWS
	lstrcatA(dest,src);
#else
	strcat(dest,src);
#endif
}

void String::Sprintf1(STRING buffer, STRING format, void* arg1)
{

#ifdef WINDOWS
	wsprintfA(buffer, format, arg1);
#else
	sprintf(buffer,format,arg1);
#endif
}

void String::Sprintf2(STRING buffer, STRING format, void* arg1, void* arg2)
{
#ifdef WINDOWS
	wsprintfA(buffer, format, arg1, arg2);
#else
	sprintf(buffer,format,arg1,arg2);
#endif
}


void String::StrNCpy(STRING dest, STRING source, UINT count)
{
#ifdef WINDOWS
	lstrcpynA( dest, source, count);
#else
	strncpy(dest, source, count);
#endif
}

STRING String::StrDup(STRING str)
{
	STRING result = (STRING)System::SafeAllocMemory(StrLen(str) + 1);
	StrCpy(result, str);
	return result;
}

STRING String::StrStr(STRING str1, STRING str2)
{
	UINT len1 = StrLen(str1);
	UINT len2 = StrLen(str2);
	if ( len1 < len2 )
		return 0;
	if ( len1 == len2 &&  0 == System::MemCmp((BYTE*)str1,(BYTE*)str2,len1) )
		return str1;
	UINT delta = len1 - len2;
	for ( UINT i = 0; i <= delta; i++)
		if ( 0 == System::MemCmp( (BYTE*)(str1 + i), (BYTE*)str2, len2) )
			return (str1 + i);
	
	return 0;
}

bool String::EndsWith(STRING string, STRING suffix)
{
	if ( 0 == string || 0 == suffix)
		return false;
	UINT stringLen = String::StrLen(string);
	UINT suffixLen = String::StrLen(suffix);
	if ( suffixLen > stringLen)
		return false;
	STRING suffixStart = string + (stringLen - suffixLen);
	return  0 == System::MemCmp((BYTE*)suffixStart, (BYTE*)suffix, suffixLen + 1);
}

int String::LastIndexOf(STRING stringToSearch, STRING originalString){

	if ( stringToSearch == 0 || originalString == 0)
		return 0;
	UINT originalLength = StrLen(originalString);
	UINT stringLen = StrLen(stringToSearch);
	if ( originalLength < stringLen)
		return - 1;
	UINT startPos = originalLength - stringLen;
	while ( startPos >= 0){
		if ( System::MemCmp((BYTE*)(startPos + originalString), (BYTE*)stringToSearch, stringLen) )
			return startPos;
		startPos--;
	}
	return - 1; //nothing found
}
