2006-08-15 Anders Carlsson <acarlsson@apple.com>
authorandersca <andersca@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 15 Aug 2006 20:49:22 +0000 (20:49 +0000)
committerandersca <andersca@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 15 Aug 2006 20:49:22 +0000 (20:49 +0000)
        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

WebCore/ChangeLog
WebCore/platform/PlatformString.h
WebCore/platform/String.cpp
WebCore/platform/StringImpl.cpp
WebCore/platform/StringImpl.h

index 9a4493b527395589887dc2c2b8b26e4419c316b6..1f0e52b36317b547ee082c5d426558dd73a04cd9 100644 (file)
@@ -1,3 +1,28 @@
+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.
index d1dae8fc813329422df6cd3680b46f6c53bcb861..e370ee95442608a661b24b1f6c2cd10196155095 100644 (file)
@@ -58,7 +58,8 @@ public:
 
     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; }
index 35ab9cad5975b0b7962051fdd82a030f7cd1bbff..2546ecde8fa6ebbddb4a71388489a53342894f13 100644 (file)
@@ -235,6 +235,13 @@ const UChar* String::characters() const
     return m_impl->characters();
 }
 
+const UChar* String::charactersWithNullTermination()
+{
+    if (!m_impl)
+        return 0;
+    return m_impl->charactersWithNullTermination();
+}
+
 DeprecatedString String::deprecatedString() const
 {
     if (!m_impl)
index 5636c1deeba0ed77f357d922d7a57bd7510883e8..8acb2b2d6d54daf005f7620b6a0b6e3787803dd7 100644 (file)
@@ -87,6 +87,7 @@ void StringImpl::init(const char* str, unsigned len)
 {
     m_hash = 0;
     m_inTable = false;
+    m_hasTerminatingNullCharacter = false;
     m_length = len;
     if (!m_length || !str) {
         m_data = 0;
@@ -106,6 +107,7 @@ void StringImpl::init(const UChar* str, unsigned len)
 {
     m_hash = 0;
     m_inTable = false;
+    m_hasTerminatingNullCharacter = false;
     m_length = len;
     if (!m_length || !str) {
         m_data = 0;
@@ -123,6 +125,18 @@ StringImpl::~StringImpl()
     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);
@@ -135,6 +149,7 @@ void StringImpl::append(const StringImpl* str)
         deleteUCharVector(m_data);
         m_data = c;
         m_length = newlen;
+        m_hasTerminatingNullCharacter = false;
     }
 }
 
@@ -152,6 +167,7 @@ void StringImpl::append(UChar c)
     deleteUCharVector(m_data);
     m_data = nc;
     m_length++;
+    m_hasTerminatingNullCharacter = false;
 }
 
 void StringImpl::insert(const StringImpl* str, unsigned pos)
@@ -170,6 +186,7 @@ void StringImpl::insert(const StringImpl* str, unsigned pos)
         deleteUCharVector(m_data);
         m_data = c;
         m_length = newlen;
+        m_hasTerminatingNullCharacter = false;
     }
 }
 
@@ -184,6 +201,7 @@ void StringImpl::truncate(int len)
     deleteUCharVector(m_data);
     m_data = c;
     m_length = len;
+    m_hasTerminatingNullCharacter = false;
 }
 
 void StringImpl::remove(unsigned pos, int len)
@@ -203,6 +221,7 @@ void StringImpl::remove(unsigned pos, int len)
     deleteUCharVector(m_data);
     m_data = c;
     m_length = newLen;
+    m_hasTerminatingNullCharacter = false;
 }
 
 StringImpl* StringImpl::split(unsigned pos)
index fb3c80676fbf4a804167bbf5c8276fc6aa23b163..90227667bb4347ad60c2a7a947b1bca310fba820 100644 (file)
@@ -56,7 +56,7 @@ private:
     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);
@@ -68,6 +68,8 @@ public:
     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*);
@@ -139,6 +141,7 @@ private:
     
     mutable unsigned m_hash;
     bool m_inTable;
+    bool m_hasTerminatingNullCharacter;
 };
 
 bool equal(const StringImpl*, const StringImpl*);