| #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 |
| } |