BString& BString::RemoveChars(int32 fromCharOffset, int32 charCount) { int32 fromOffset = UTF8CountBytes(fPrivateData, fromCharOffset); return Remove(fromOffset, UTF8CountBytes(fPrivateData + fromOffset, charCount)); }
BString& BString::CopyCharsInto(BString& into, int32 fromCharOffset, int32 charCount) const { int32 fromOffset = UTF8CountBytes(fPrivateData, fromCharOffset); int32 length = UTF8CountBytes(fPrivateData + fromOffset, charCount); return CopyInto(into, fromOffset, length); }
BString& BString::InsertChars(const BString& string, int32 fromCharOffset, int32 charCount, int32 charPosition) { int32 fromOffset = UTF8CountBytes(string.String(), fromCharOffset); return Insert(string, fromOffset, UTF8CountBytes(string.String() + fromOffset, charCount), UTF8CountBytes(fPrivateData, charPosition)); }
BString& BString::ReplaceChars(const char* replaceThis, const char* withThis, int32 maxReplaceCount, int32 fromCharOffset) { return Replace(replaceThis, withThis, maxReplaceCount, UTF8CountBytes(fPrivateData, fromCharOffset)); }
const char * TextGapBuffer::Text() { const char *realText = RealText(); if (fPasswordMode) { const uint32 numChars = UTF8CountChars(realText, Length()); const uint32 bulletCharLen = UTF8CountBytes(B_UTF8_BULLET, 1); uint32 newSize = numChars * bulletCharLen + 1; if ((uint32)fScratchSize < newSize) { fScratchBuffer = (char *)realloc(fScratchBuffer, newSize); fScratchSize = newSize; } char *scratchPtr = fScratchBuffer; for (uint32 i = 0; i < numChars; i++) { memcpy(scratchPtr, B_UTF8_BULLET, bulletCharLen); scratchPtr += bulletCharLen; } scratchPtr = '\0'; return fScratchBuffer; } return realText; }
const char* BString::CharAt(int32 charIndex, int32* bytes) const { int32 offset = UTF8CountBytes(fPrivateData, charIndex); if (bytes != NULL) *bytes = UTF8NextCharLen(fPrivateData + offset); return fPrivateData + offset; }
const char * TextGapBuffer::GetString(int32 fromOffset, int32 *_numBytes) { const char *result = ""; if (_numBytes == NULL) return result; int32 numBytes = *_numBytes; if (numBytes < 1) return result; bool isStartBeforeGap = (fromOffset < fGapIndex); bool isEndBeforeGap = ((fromOffset + numBytes - 1) < fGapIndex); if (isStartBeforeGap == isEndBeforeGap) { result = fBuffer + fromOffset; if (!isStartBeforeGap) result += fGapCount; } else { if (fScratchSize < numBytes) { fScratchBuffer = (char *)realloc(fScratchBuffer, numBytes); fScratchSize = numBytes; } for (long i = 0; i < numBytes; i++) fScratchBuffer[i] = RealCharAt(fromOffset + i); result = fScratchBuffer; } // TODO: this could be improved. We are overwriting what we did some lines ago, // we could just avoid to do that. if (fPasswordMode) { uint32 numChars = UTF8CountChars(result, numBytes); uint32 charLen = UTF8CountBytes(B_UTF8_BULLET, 1); uint32 newSize = numChars * charLen; if ((uint32)fScratchSize < newSize) { fScratchBuffer = (char *)realloc(fScratchBuffer, newSize); fScratchSize = newSize; } result = fScratchBuffer; char *scratchPtr = fScratchBuffer; for (uint32 i = 0; i < numChars; i++) { memcpy(scratchPtr, B_UTF8_BULLET, charLen); scratchPtr += charLen; } *_numBytes = newSize; } return result; }
bool BString::CopyCharsInto(char* into, int32* intoLength, int32 fromCharOffset, int32 charCount) const { if (into == NULL) return false; int32 fromOffset = UTF8CountBytes(fPrivateData, fromCharOffset); int32 length = UTF8CountBytes(fPrivateData + fromOffset, charCount); length = min_clamp0(length, Length() - fromOffset); if (intoLength != NULL) { if (*intoLength < length) return false; *intoLength = length; } memcpy(into, fPrivateData + fromOffset, length); return true; }
BString& BString::AdoptChars(BString& string, int32 charCount) { return Adopt(string, UTF8CountBytes(string.String(), charCount)); }
BString& BString::TruncateChars(int32 newCharCount, bool lazy) { return Truncate(UTF8CountBytes(fPrivateData, newCharCount)); }
int BString::CompareChars(const char* string, int32 charCount) const { return Compare(string, UTF8CountBytes(fPrivateData, charCount)); }
BString& BString::InsertChars(const BString& string, int32 charCount, int32 charPosition) { return Insert(string, UTF8CountBytes(string.String(), charCount), UTF8CountBytes(fPrivateData, charPosition)); }
BString& BString::InsertChars(const char* string, int32 charPosition) { return Insert(string, UTF8CountBytes(fPrivateData, charPosition)); }
BString& BString::PrependChars(const BString& string, int32 charCount) { return Prepend(string, UTF8CountBytes(string.String(), charCount)); }
BString& BString::AppendChars(const char* string, int32 charCount) { return Append(string, UTF8CountBytes(string, charCount)); }
int32 BString::FindFirstChars(const char* string, int32 fromCharOffset) const { return FindFirst(string, UTF8CountBytes(fPrivateData, fromCharOffset)); }
int32 BString::FindLastChars(const char* string, int32 beforeCharOffset) const { return FindLast(string, UTF8CountBytes(fPrivateData, beforeCharOffset)); }
BString& BString::SetToChars(const BString& string, int32 charCount) { return SetTo(string, UTF8CountBytes(string.String(), charCount)); }
int32 BString::CountBytes(int32 fromCharOffset, int32 charCount) const { return UTF8CountBytes( fPrivateData + UTF8CountBytes(fPrivateData, fromCharOffset), charCount); }