1/* 2 * Copyright (C) 2006, 2007 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 * 1. Redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer. 9 * 2. Redistributions in binary form must reproduce the above copyright 10 * notice, this list of conditions and the following disclaimer in the 11 * documentation and/or other materials provided with the distribution. 12 * 13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY 14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR 17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24 */ 25 26#include "config.h" 27#include "JSStringRef.h" 28#include "JSStringRefPrivate.h" 29 30#include "InitializeThreading.h" 31#include "OpaqueJSString.h" 32#include <wtf/unicode/UTF8.h> 33 34using namespace JSC; 35using namespace WTF::Unicode; 36 37JSStringRef JSStringCreateWithCharacters(const JSChar* chars, size_t numChars) 38{ 39 initializeThreading(); 40 return OpaqueJSString::create(chars, numChars).leakRef(); 41} 42 43JSStringRef JSStringCreateWithUTF8CString(const char* string) 44{ 45 initializeThreading(); 46 if (string) { 47 size_t length = strlen(string); 48 Vector<UChar, 1024> buffer(length); 49 UChar* p = buffer.data(); 50 bool sourceIsAllASCII; 51 const LChar* stringStart = reinterpret_cast<const LChar*>(string); 52 if (conversionOK == convertUTF8ToUTF16(&string, string + length, &p, p + length, &sourceIsAllASCII)) { 53 if (sourceIsAllASCII) 54 return OpaqueJSString::create(stringStart, length).leakRef(); 55 return OpaqueJSString::create(buffer.data(), p - buffer.data()).leakRef(); 56 } 57 } 58 59 return OpaqueJSString::create().leakRef(); 60} 61 62JSStringRef JSStringCreateWithCharactersNoCopy(const JSChar* chars, size_t numChars) 63{ 64 initializeThreading(); 65 return OpaqueJSString::create(StringImpl::createWithoutCopying(chars, numChars)).leakRef(); 66} 67 68JSStringRef JSStringRetain(JSStringRef string) 69{ 70 string->ref(); 71 return string; 72} 73 74void JSStringRelease(JSStringRef string) 75{ 76 string->deref(); 77} 78 79size_t JSStringGetLength(JSStringRef string) 80{ 81 return string->length(); 82} 83 84const JSChar* JSStringGetCharactersPtr(JSStringRef string) 85{ 86 return string->characters(); 87} 88 89size_t JSStringGetMaximumUTF8CStringSize(JSStringRef string) 90{ 91 // Any UTF8 character > 3 bytes encodes as a UTF16 surrogate pair. 92 return string->length() * 3 + 1; // + 1 for terminating '\0' 93} 94 95size_t JSStringGetUTF8CString(JSStringRef string, char* buffer, size_t bufferSize) 96{ 97 if (!bufferSize) 98 return 0; 99 100 char* destination = buffer; 101 ConversionResult result; 102 if (string->is8Bit()) { 103 const LChar* source = string->characters8(); 104 result = convertLatin1ToUTF8(&source, source + string->length(), &destination, destination + bufferSize - 1); 105 } else { 106 const UChar* source = string->characters16(); 107 result = convertUTF16ToUTF8(&source, source + string->length(), &destination, destination + bufferSize - 1, true); 108 } 109 110 *destination++ = '\0'; 111 if (result != conversionOK && result != targetExhausted) 112 return 0; 113 114 return destination - buffer; 115} 116 117bool JSStringIsEqual(JSStringRef a, JSStringRef b) 118{ 119 return OpaqueJSString::equal(a, b); 120} 121 122bool JSStringIsEqualToUTF8CString(JSStringRef a, const char* b) 123{ 124 JSStringRef bBuf = JSStringCreateWithUTF8CString(b); 125 bool result = JSStringIsEqual(a, bBuf); 126 JSStringRelease(bBuf); 127 128 return result; 129} 130