HeapString HeapString::FormatV(const char* format, va_list args) { int len = 0; trio_vcprintf(CountAnsiHeapString, &len, format, args); HeapString dest; dest.AllocBuffer(len); trio_vsnprintf(dest.m_string, len + 1, format, args); return dest; }
HeapString HeapString::TrimLeft(const char* trimChars) const { HeapString dest; // Count trim characters. size_t trimCharsLen = 0; const char empty[] = { 0 }; for (const char* ptr = trimChars ? trimChars : empty; *ptr; ++ptr, ++trimCharsLen) { } const char* str = m_string; if (trimCharsLen == 0) { while (isspace(*str)) str++; } else { if (trimCharsLen == 1) { while (*str == *trimChars) str++; } else { const char* stringEnd = m_string + GetStringData()->stringLen; const char* lastStr = str; while (str != stringEnd) { for (const char* ptr = trimChars; *ptr; ++ptr) { if (*ptr == *str) { str++; break; } } if (lastStr == str) break; lastStr = str; } } } size_t count = GetStringData()->stringLen - (str - m_string); if (count > 0) { dest.AllocBuffer(count); memcpy(dest.m_string, str, count); } return dest; }
HeapString HeapString::Sub(size_t startPos, size_t count) const { size_t stringLen = GetStringData()->stringLen; if (startPos > stringLen || count == 0) return HeapString(); if (startPos + count > stringLen) count = stringLen - startPos; HeapString dest; dest.AllocBuffer(count); memcpy(dest.m_string, m_string + startPos, count * sizeof(char)); return dest; }
HeapString HeapString::Format(const char* format, ...) { va_list args; va_start(args, format); int len = 0; trio_vcprintf(CountAnsiHeapString, &len, format, args); HeapString dest; dest.AllocBuffer(len); trio_vsnprintf(dest.m_string, len + 1, format, args); va_end(args); return dest; }
HeapString HeapString::TrimRight(const char* trimChars) const { HeapString dest; // Count trim characters. size_t trimCharsLen = 0; const char empty[] = { 0 }; for (const char* ptr = trimChars ? trimChars : empty; *ptr; ++ptr, ++trimCharsLen) { } size_t stringLen = GetStringData()->stringLen; char* str = (char*)m_string + stringLen - 1; if (trimCharsLen == 0) { while (str != m_string && isspace(*str)) str--; } else { if (trimCharsLen == 1) { while (str != m_string && *str == *trimChars) str--; } else { const char* lastStr = str; while (str != m_string) { for (const char* ptr = trimChars; *ptr; ++ptr) { if (*ptr == *str) { str--; break; } } if (lastStr == str) break; lastStr = str; } } } size_t count = str - m_string + 1; dest.AllocBuffer(count); memcpy(dest.m_string, m_string, count); return dest; }
HeapString HeapString::Replace(char oldCh, char newCh) const { HeapString dest; dest.AllocBuffer(GetStringData()->stringLen); char* destPtr = dest.m_string; for (char* srcPtr = m_string; *srcPtr; ++srcPtr, ++destPtr) { char ch = *srcPtr; if (ch == oldCh) *destPtr = newCh; else *destPtr = ch; } return dest; }