PassRefPtr<StringImpl> StringImpl::foldCase() { UChar* data; PassRefPtr<StringImpl> newImpl = createUninitialized(m_length, data); int32_t length = m_length; // Do a faster loop for the case where all the characters are ASCII. UChar ored = 0; for (int i = 0; i < length; i++) { UChar c = m_data[i]; ored |= c; data[i] = toASCIILower(c); } if (!(ored & ~0x7F)) return newImpl; // Do a slower implementation for cases that include non-ASCII characters. bool error; int32_t realLength = Unicode::foldCase(data, length, m_data, m_length, &error); if (!error && realLength == length) return newImpl; newImpl = createUninitialized(realLength, data); Unicode::foldCase(data, realLength, m_data, m_length, &error); if (error) return this; return newImpl; }
PassRefPtr<StringImpl> StringImpl::secure(UChar aChar) { UChar* data; PassRefPtr<StringImpl> newImpl = createUninitialized(m_length, data); int32_t length = m_length; for (int i = 0; i < length; ++i) data[i] = aChar; return newImpl; }
PassRefPtr<UStringImpl> UStringImpl::create(const UChar* characters, unsigned length) { if (!characters || !length) return empty(); UChar* data; PassRefPtr<UStringImpl> string = createUninitialized(length, data); memcpy(data, characters, length * sizeof(UChar)); return string; }
PassRefPtr<UStringImpl> UStringImpl::create(const char* characters, unsigned length) { if (!characters || !length) return empty(); UChar* data; PassRefPtr<UStringImpl> string = createUninitialized(length, data); for (unsigned i = 0; i != length; ++i) { unsigned char c = characters[i]; data[i] = c; } return string; }
PassRefPtr<StringImpl> StringImpl::replace(StringImpl* pattern, StringImpl* replacement) { if (!pattern || !replacement) return this; int patternLength = pattern->length(); if (!patternLength) return this; int repStrLength = replacement->length(); int srcSegmentStart = 0; int matchCount = 0; // Count the matches while ((srcSegmentStart = find(pattern, srcSegmentStart)) >= 0) { ++matchCount; srcSegmentStart += patternLength; } // If we have 0 matches, we don't have to do any more work if (!matchCount) return this; UChar* data; PassRefPtr<StringImpl> newImpl = createUninitialized(m_length + matchCount * (repStrLength - patternLength), data); // Construct the new data int srcSegmentEnd; int srcSegmentLength; srcSegmentStart = 0; int dstOffset = 0; while ((srcSegmentEnd = find(pattern, srcSegmentStart)) >= 0) { srcSegmentLength = srcSegmentEnd - srcSegmentStart; memcpy(data + dstOffset, m_data + srcSegmentStart, srcSegmentLength * sizeof(UChar)); dstOffset += srcSegmentLength; memcpy(data + dstOffset, replacement->m_data, repStrLength * sizeof(UChar)); dstOffset += repStrLength; srcSegmentStart = srcSegmentEnd + patternLength; } srcSegmentLength = m_length - srcSegmentStart; memcpy(data + dstOffset, m_data + srcSegmentStart, srcSegmentLength * sizeof(UChar)); ASSERT(dstOffset + srcSegmentLength == static_cast<int>(newImpl->length())); return newImpl; }
PassRefPtr<StringImpl> StringImpl::replace(unsigned position, unsigned lengthToReplace, StringImpl* str) { position = min(position, length()); lengthToReplace = min(lengthToReplace, length() - position); unsigned lengthToInsert = str ? str->length() : 0; if (!lengthToReplace && !lengthToInsert) return this; UChar* data; PassRefPtr<StringImpl> newImpl = createUninitialized(length() - lengthToReplace + lengthToInsert, data); memcpy(data, characters(), position * sizeof(UChar)); if (str) memcpy(data + position, str->characters(), lengthToInsert * sizeof(UChar)); memcpy(data + position + lengthToInsert, characters() + position + lengthToReplace, (length() - position - lengthToReplace) * sizeof(UChar)); return newImpl; }
PassRefPtr<StringImpl> StringImpl::replace(UChar oldC, UChar newC) { if (oldC == newC) return this; unsigned i; for (i = 0; i != m_length; ++i) if (m_data[i] == oldC) break; if (i == m_length) return this; UChar* data; PassRefPtr<StringImpl> newImpl = createUninitialized(m_length, data); for (i = 0; i != m_length; ++i) { UChar ch = m_data[i]; if (ch == oldC) ch = newC; data[i] = ch; } return newImpl; }
void* createImpl (Context_& ctx, unsigned& ver, const Key& k) { return createUninitialized(); }