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