1b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org/* 243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * Copyright (C) 2003, 2006, 2008, 2009, 2010, 2012 Apple Inc. All rights reserved. 343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * 443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * Redistribution and use in source and binary forms, with or without 543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * modification, are permitted provided that the following conditions 643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * are met: 743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * 1. Redistributions of source code must retain the above copyright 843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * notice, this list of conditions and the following disclaimer. 943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * 2. Redistributions in binary form must reproduce the above copyright 1043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * notice, this list of conditions and the following disclaimer in the 1143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * documentation and/or other materials provided with the distribution. 1243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * 1343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY 1443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 1543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 1643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR 1743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 1843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 1943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 2043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 2143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */ 2543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 2643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 2743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#include "config.h" 2843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#include "CString.h" 2943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 30eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org#include "wtf/PartitionAlloc.h" 31eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org#include "wtf/WTF.h" 3243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#include <string.h> 3344bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org 34b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.orgusing namespace std; 3543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 366e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.orgnamespace WTF { 37b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 380511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.comPassRefPtr<CStringBuffer> CStringBuffer::createUninitialized(size_t length) 39c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org{ 40a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org RELEASE_ASSERT(length < (numeric_limits<unsigned>::max() - sizeof(CStringBuffer))); 41c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 420a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org // The +1 is for the terminating NUL character. 43ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org size_t size = sizeof(CStringBuffer) + length + 1; 44eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org CStringBuffer* stringBuffer = static_cast<CStringBuffer*>(partitionAllocGeneric(Partitions::getBufferPartition(), size)); 4543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return adoptRef(new (stringBuffer) CStringBuffer(length)); 46a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 4755ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org 486a2b0aa331a1ae1829a9b9637ad18cfc7ec9d840ager@chromium.orgvoid CStringBuffer::operator delete(void* ptr) 49eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org{ 50a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org partitionFreeGeneric(Partitions::getBufferPartition(), ptr); 5143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 5271affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org 5371affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgCString::CString(const char* str) 5443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen{ 55b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org if (!str) 565a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org return; 5783130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org 58b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org init(str, strlen(str)); 5983130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org} 60a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org 61b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.orgCString::CString(const char* str, size_t length) 62b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org{ 63b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org if (!str) { 645a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org ASSERT(!length); 655a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org return; 6683130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org } 67b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org 68b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org init(str, length); 6983130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org} 70a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org 71b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.orgvoid CString::init(const char* str, size_t length) 72b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org{ 73b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org ASSERT(str); 745a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org 7583130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org m_buffer = CStringBuffer::createUninitialized(length); 76b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org memcpy(m_buffer->mutableData(), str, length); 77b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org m_buffer->mutableData()[length] = '\0'; 78b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org} 79355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org 8083130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.orgchar* CString::mutableData() 81a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org{ 8283130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org copyBufferIfNeeded(); 8383130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org if (!m_buffer) 8483130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org return 0; 85a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org return m_buffer->mutableData(); 86a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org} 87a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org 88a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.orgCString CString::newUninitialized(size_t length, char*& characterBuffer) 89a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org{ 90a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org CString result; 91a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org result.m_buffer = CStringBuffer::createUninitialized(length); 92a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org char* bytes = result.m_buffer->mutableData(); 93a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org bytes[length] = '\0'; 94a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org characterBuffer = bytes; 95a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org return result; 96a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org} 9783130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org 9883130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.orgvoid CString::copyBufferIfNeeded() 9983130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org{ 10083130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org if (!m_buffer || m_buffer->hasOneRef()) 10183130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org return; 10283130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org 10383130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org RefPtr<CStringBuffer> buffer = m_buffer.release(); 104a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org size_t length = buffer->length(); 10583130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org m_buffer = CStringBuffer::createUninitialized(length); 106003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org memcpy(m_buffer->mutableData(), buffer->data(), length + 1); 1074e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org} 1084e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org 109a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.orgbool CString::isSafeToSendToAnotherThread() const 110a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org{ 111a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org return !m_buffer || m_buffer->hasOneRef(); 112a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org} 113a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org 11483130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.orgbool operator==(const CString& a, const CString& b) 11583130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org{ 11683130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org if (a.isNull() != b.isNull()) 11783130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org return false; 11883130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org if (a.length() != b.length()) 11983130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org return false; 12083130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org return !memcmp(a.data(), b.data(), a.length()); 12183130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org} 122b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org 123b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.orgbool operator==(const CString& a, const char* b) 124b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org{ 12599aa490225c81012235659d9a183226b286178c8yangguo@chromium.org if (a.isNull() != !b) 12699aa490225c81012235659d9a183226b286178c8yangguo@chromium.org return false; 1274e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org if (!b) 12899aa490225c81012235659d9a183226b286178c8yangguo@chromium.org return true; 12999aa490225c81012235659d9a183226b286178c8yangguo@chromium.org return !strcmp(a.data(), b); 13099aa490225c81012235659d9a183226b286178c8yangguo@chromium.org} 131a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org 132ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org} // namespace WTF 133ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org