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