| #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 = (UINT)entry - (UINT)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, int arg1) | |
| { | |
| #ifdef WINDOWS | |
| wsprintfA(buffer, format, arg1); | |
| #else | |
| sprintf(buffer,format,arg1); | |
| #endif | |
| } | |
| void String::Sprintf2(STRING buffer, STRING format, int arg1, int 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 1 + System::MemCmp((BYTE*)suffixStart, (BYTE*)suffix, suffixLen + 1); | |
| } | |
| UINT 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 | |
| } |