1 /*
2 * Copyright (C) 2008 Apple Inc. All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
6 * are met:
7 *
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
13 * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of
14 * its contributors may be used to endorse or promote products derived
15 * from this software without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
18 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
20 * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
21 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
22 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
23 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
24 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 */
28
29 #include "config.h"
30 #include "StringBuilder.h"
31
32 #include "StringBuffer.h"
33
34 namespace WebCore {
35
append(const String & string)36 void StringBuilder::append(const String& string)
37 {
38 if (string.isNull())
39 return;
40
41 if (m_totalLength == UINT_MAX)
42 m_totalLength = string.length();
43 else
44 m_totalLength += string.length();
45
46 if (!string.isEmpty())
47 m_strings.append(string);
48 }
49
append(UChar c)50 void StringBuilder::append(UChar c)
51 {
52 if (m_totalLength == UINT_MAX)
53 m_totalLength = 1;
54 else
55 m_totalLength += 1;
56
57 m_strings.append(String(&c, 1));
58 }
59
append(char c)60 void StringBuilder::append(char c)
61 {
62 if (m_totalLength == UINT_MAX)
63 m_totalLength = 1;
64 else
65 m_totalLength += 1;
66
67 m_strings.append(String(&c, 1));
68 }
69
toString() const70 String StringBuilder::toString() const
71 {
72 if (isNull())
73 return String();
74
75 unsigned count = m_strings.size();
76
77 if (!count)
78 return String(StringImpl::empty());
79 if (count == 1)
80 return m_strings[0];
81
82 UChar* buffer;
83 String result = String::createUninitialized(m_totalLength, buffer);
84
85 UChar* p = buffer;
86 for (unsigned i = 0; i < count; ++i) {
87 StringImpl* string = m_strings[i].impl();
88 unsigned length = string->length();
89 memcpy(p, string->characters(), length * 2);
90 p += length;
91 }
92
93 ASSERT(p == m_totalLength + buffer);
94
95 return result;
96 }
97
98 }
99