1643ca7872b450ea4efacab6188849e5aac2ba161Steve Block/* 2643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * Copyright (C) 2009 Google Inc. All rights reserved. 3643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * 4643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * Redistribution and use in source and binary forms, with or without 5643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * modification, are permitted provided that the following conditions are 6643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * met: 7643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * 8643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * * Redistributions of source code must retain the above copyright 9643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * notice, this list of conditions and the following disclaimer. 10643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * * Redistributions in binary form must reproduce the above 11643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * copyright notice, this list of conditions and the following disclaimer 12643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * in the documentation and/or other materials provided with the 13643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * distribution. 14643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * * Neither the name of Google Inc. nor the names of its 15643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * contributors may be used to endorse or promote products derived from 16643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * this software without specific prior written permission. 17643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * 18643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 21643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 22643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 23643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 24643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 28643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29643ca7872b450ea4efacab6188849e5aac2ba161Steve Block */ 30643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 31643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "config.h" 32643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "WebCString.h" 33643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 34643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "TextEncoding.h" 35dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include <wtf/text/CString.h> 36643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 37643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "WebString.h" 38643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 39643ca7872b450ea4efacab6188849e5aac2ba161Steve Blocknamespace WebKit { 40643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 41dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockclass WebCStringPrivate : public WTF::CStringBuffer { 42643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}; 43643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 4406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsenint WebCString::compare(const WebCString& other) const 4506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen{ 4606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen // A null string is always less than a non null one. 4706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen if (isNull() != other.isNull()) 4806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return isNull() ? -1 : 1; 4906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 5006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen if (isNull()) 5106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return 0; // Both WebStrings are null. 5206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 5306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return strcmp(m_private->data(), other.m_private->data()); 5406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen} 5506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 56643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid WebCString::reset() 57643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 58643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (m_private) { 59643ca7872b450ea4efacab6188849e5aac2ba161Steve Block m_private->deref(); 60643ca7872b450ea4efacab6188849e5aac2ba161Steve Block m_private = 0; 61643ca7872b450ea4efacab6188849e5aac2ba161Steve Block } 62643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 63643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 64643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid WebCString::assign(const WebCString& other) 65643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 66643ca7872b450ea4efacab6188849e5aac2ba161Steve Block assign(const_cast<WebCStringPrivate*>(other.m_private)); 67643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 68643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 69643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid WebCString::assign(const char* data, size_t length) 70643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 71643ca7872b450ea4efacab6188849e5aac2ba161Steve Block char* newData; 72dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block RefPtr<WTF::CStringBuffer> buffer = 73dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block WTF::CString::newUninitialized(length, newData).buffer(); 74643ca7872b450ea4efacab6188849e5aac2ba161Steve Block memcpy(newData, data, length); 75643ca7872b450ea4efacab6188849e5aac2ba161Steve Block assign(static_cast<WebCStringPrivate*>(buffer.get())); 76643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 77643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 78643ca7872b450ea4efacab6188849e5aac2ba161Steve Blocksize_t WebCString::length() const 79643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 80643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (!m_private) 81643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return 0; 82643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // NOTE: The buffer's length includes the null byte. 83643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return const_cast<WebCStringPrivate*>(m_private)->length() - 1; 84643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 85643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 86643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockconst char* WebCString::data() const 87643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 88643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (!m_private) 89643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return 0; 90643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return const_cast<WebCStringPrivate*>(m_private)->data(); 91643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 92643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 93643ca7872b450ea4efacab6188849e5aac2ba161Steve BlockWebString WebCString::utf16() const 94643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 95643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return WebCore::UTF8Encoding().decode(data(), length()); 96643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 97643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 98643ca7872b450ea4efacab6188849e5aac2ba161Steve BlockWebCString WebCString::fromUTF16(const WebUChar* data, size_t length) 99643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 100643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return WebCore::UTF8Encoding().encode( 101643ca7872b450ea4efacab6188849e5aac2ba161Steve Block data, length, WebCore::QuestionMarksForUnencodables); 102643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 103643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 104643ca7872b450ea4efacab6188849e5aac2ba161Steve BlockWebCString WebCString::fromUTF16(const WebUChar* data) 105643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 106643ca7872b450ea4efacab6188849e5aac2ba161Steve Block size_t len = 0; 107643ca7872b450ea4efacab6188849e5aac2ba161Steve Block while (data[len] != WebUChar(0)) 108643ca7872b450ea4efacab6188849e5aac2ba161Steve Block len++; 109643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return fromUTF16(data, len); 110643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 111643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 112dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockWebCString::WebCString(const WTF::CString& s) 113643ca7872b450ea4efacab6188849e5aac2ba161Steve Block : m_private(static_cast<WebCStringPrivate*>(s.buffer())) 114643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 115643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (m_private) 116643ca7872b450ea4efacab6188849e5aac2ba161Steve Block m_private->ref(); 117643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 118643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 119dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockWebCString& WebCString::operator=(const WTF::CString& s) 120643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 121643ca7872b450ea4efacab6188849e5aac2ba161Steve Block assign(static_cast<WebCStringPrivate*>(s.buffer())); 122643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return *this; 123643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 124643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 125dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockWebCString::operator WTF::CString() const 126643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 127643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return m_private; 128643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 129643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 130643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid WebCString::assign(WebCStringPrivate* p) 131643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 132643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // Take care to handle the case where m_private == p 133643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (p) 134643ca7872b450ea4efacab6188849e5aac2ba161Steve Block p->ref(); 135643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (m_private) 136643ca7872b450ea4efacab6188849e5aac2ba161Steve Block m_private->deref(); 137643ca7872b450ea4efacab6188849e5aac2ba161Steve Block m_private = p; 138643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 139643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 140643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} // namespace WebKit 141