Reviewed by Darin.
* platform/PlatformString.h:
* platform/String.cpp:
(WebCore::String::charactersWithNullTermination):
Add new function which calls StringImpl::charactersWithNullTermination.
* platform/StringImpl.cpp:
(WebCore::StringImpl::init):
(WebCore::StringImpl::append):
(WebCore::StringImpl::insert):
(WebCore::StringImpl::truncate):
(WebCore::StringImpl::remove):
Set m_hasTerminatingNullCharacter to false;
(WebCore::StringImpl::charactersWithNullTermination):
If the string already has a terminating null character, simply return it. Otherwise,
realloc to make room for one and set m_hasTerminatingNullCharacter to true;
* platform/StringImpl.h:
(WebCore::StringImpl::StringImpl):
Add m_hasTerminatingNullCharacter.
git-svn-id: https://svn.webkit.org/repository/webkit/trunk@15883
268f45cc-cd09-0410-ab3c-
d52691b4dbfc
+2006-08-15 Anders Carlsson <acarlsson@apple.com>
+
+ Reviewed by Darin.
+
+ * platform/PlatformString.h:
+ * platform/String.cpp:
+ (WebCore::String::charactersWithNullTermination):
+ Add new function which calls StringImpl::charactersWithNullTermination.
+
+ * platform/StringImpl.cpp:
+ (WebCore::StringImpl::init):
+ (WebCore::StringImpl::append):
+ (WebCore::StringImpl::insert):
+ (WebCore::StringImpl::truncate):
+ (WebCore::StringImpl::remove):
+ Set m_hasTerminatingNullCharacter to false;
+
+ (WebCore::StringImpl::charactersWithNullTermination):
+ If the string already has a terminating null character, simply return it. Otherwise,
+ realloc to make room for one and set m_hasTerminatingNullCharacter to true;
+
+ * platform/StringImpl.h:
+ (WebCore::StringImpl::StringImpl):
+ Add m_hasTerminatingNullCharacter.
+
2006-08-15 Adele Peterson <adele@apple.com>
Reviewed by Adam.
unsigned length() const;
const UChar* characters() const;
-
+ const UChar* charactersWithNullTermination();
+
UChar operator[](unsigned i) const; // if i >= length(), returns 0
bool contains(UChar c) const { return find(c) != -1; }
return m_impl->characters();
}
+const UChar* String::charactersWithNullTermination()
+{
+ if (!m_impl)
+ return 0;
+ return m_impl->charactersWithNullTermination();
+}
+
DeprecatedString String::deprecatedString() const
{
if (!m_impl)
{
m_hash = 0;
m_inTable = false;
+ m_hasTerminatingNullCharacter = false;
m_length = len;
if (!m_length || !str) {
m_data = 0;
{
m_hash = 0;
m_inTable = false;
+ m_hasTerminatingNullCharacter = false;
m_length = len;
if (!m_length || !str) {
m_data = 0;
deleteUCharVector(m_data);
}
+UChar* StringImpl::charactersWithNullTermination()
+{
+ if (m_hasTerminatingNullCharacter)
+ return m_data;
+
+ m_data = static_cast<UChar*>(fastRealloc(m_data, (m_length + 1) * sizeof(UChar)));
+ m_data[m_length] = 0;
+ m_hasTerminatingNullCharacter = true;
+
+ return m_data;
+}
+
void StringImpl::append(const StringImpl* str)
{
assert(!m_inTable);
deleteUCharVector(m_data);
m_data = c;
m_length = newlen;
+ m_hasTerminatingNullCharacter = false;
}
}
deleteUCharVector(m_data);
m_data = nc;
m_length++;
+ m_hasTerminatingNullCharacter = false;
}
void StringImpl::insert(const StringImpl* str, unsigned pos)
deleteUCharVector(m_data);
m_data = c;
m_length = newlen;
+ m_hasTerminatingNullCharacter = false;
}
}
deleteUCharVector(m_data);
m_data = c;
m_length = len;
+ m_hasTerminatingNullCharacter = false;
}
void StringImpl::remove(unsigned pos, int len)
deleteUCharVector(m_data);
m_data = c;
m_length = newLen;
+ m_hasTerminatingNullCharacter = false;
}
StringImpl* StringImpl::split(unsigned pos)
void init(const UChar*, unsigned len);
protected:
- StringImpl() : m_length(0), m_data(0), m_hash(0), m_inTable(false) { }
+ StringImpl() : m_length(0), m_data(0), m_hash(0), m_inTable(false), m_hasTerminatingNullCharacter(false) { }
public:
StringImpl(const UChar*, unsigned len);
StringImpl(const char*, unsigned len);
const UChar* characters() const { return m_data; }
unsigned length() const { return m_length; }
+ UChar* charactersWithNullTermination();
+
unsigned hash() const { if (m_hash == 0) m_hash = computeHash(m_data, m_length); return m_hash; }
static unsigned computeHash(const UChar*, unsigned len);
static unsigned computeHash(const char*);
mutable unsigned m_hash;
bool m_inTable;
+ bool m_hasTerminatingNullCharacter;
};
bool equal(const StringImpl*, const StringImpl*);