1dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block/* 2dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * Copyright (C) 2003, 2006, 2008, 2009, 2010 Apple Inc. All rights reserved. 3dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * 4dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * Redistribution and use in source and binary forms, with or without 5dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * modification, are permitted provided that the following conditions 6dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * are met: 7dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * 1. Redistributions of source code must retain the above copyright 8dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * notice, this list of conditions and the following disclaimer. 9dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * 2. Redistributions in binary form must reproduce the above copyright 10dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * notice, this list of conditions and the following disclaimer in the 11dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * documentation and/or other materials provided with the distribution. 12dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * 13dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY 14dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 15dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 16dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR 17dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 18dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 19dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 20dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 21dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 23dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block */ 25dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 26dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#ifndef CString_h 27dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#define CString_h 28dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 29dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "PassRefPtr.h" 30dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "RefCounted.h" 31dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "Vector.h" 32dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 33dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blocknamespace WTF { 34dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 35dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockclass CStringBuffer : public RefCounted<CStringBuffer> { 36dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockpublic: 37dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block const char* data() { return m_vector.data(); } 38dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block size_t length() { return m_vector.size(); } 39dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 40dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockprivate: 41dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block friend class CString; 42dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 43a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch static PassRefPtr<CStringBuffer> create(size_t length) { return adoptRef(new CStringBuffer(length)); } 44a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch CStringBuffer(size_t length) : m_vector(length) { } 45dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block char* mutableData() { return m_vector.data(); } 46dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 47dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block Vector<char> m_vector; 48dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}; 49dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 50dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block// A container for a null-terminated char array supporting copy-on-write 51dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block// assignment. The contained char array may be null. 52dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockclass CString { 53dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockpublic: 54dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block CString() { } 55dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block CString(const char*); 56a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch CString(const char*, size_t length); 57dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block CString(CStringBuffer* buffer) : m_buffer(buffer) { } 58dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block static CString newUninitialized(size_t length, char*& characterBuffer); 59dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 606c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen const char* data() const 616c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen { 626c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen return m_buffer ? m_buffer->data() : 0; 636c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen } 64dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block char* mutableData(); 65a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch size_t length() const 666c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen { 676c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen return m_buffer ? m_buffer->length() - 1 : 0; 686c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen } 69dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 70dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block bool isNull() const { return !m_buffer; } 71dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 72dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block CStringBuffer* buffer() const { return m_buffer.get(); } 73dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 74dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockprivate: 75dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block void copyBufferIfNeeded(); 76a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch void init(const char*, size_t length); 77dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block RefPtr<CStringBuffer> m_buffer; 78dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}; 79dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 80dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockbool operator==(const CString& a, const CString& b); 81dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockinline bool operator!=(const CString& a, const CString& b) { return !(a == b); } 82dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 83dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} // namespace WTF 84dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 85dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockusing WTF::CString; 86dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 87dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#endif // CString_h 88