]>
git.saurik.com Git - apple/javascriptcore.git/blob - API/JSStringRef.cpp
1 // -*- mode: c++; c-basic-offset: 4 -*-
3 * Copyright (C) 2006, 2007 Apple Inc. All rights reserved.
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
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.
14 * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
15 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
17 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
18 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
19 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
20 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
21 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
22 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
24 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 #include "JSStringRef.h"
30 #include <wtf/Platform.h>
33 #include <kjs/JSLock.h>
34 #include <kjs/JSType.h>
35 #include <kjs/internal.h>
36 #include <kjs/operations.h>
37 #include <kjs/ustring.h>
38 #include <kjs/value.h>
39 #include <wtf/unicode/UTF8.h>
42 using namespace WTF::Unicode
;
44 JSStringRef
JSStringCreateWithCharacters(const JSChar
* chars
, size_t numChars
)
47 return toRef(UString(reinterpret_cast<const KJS::UChar
*>(chars
), static_cast<int>(numChars
)).rep()->ref());
50 JSStringRef
JSStringCreateWithUTF8CString(const char* string
)
54 size_t length
= strlen(string
);
55 Vector
< ::UChar
, 1024> buffer(length
);
56 ::UChar
* p
= buffer
.data();
57 if (conversionOK
!= convertUTF8ToUTF16(&string
, string
+ length
, &p
, p
+ length
))
60 return toRef(UString(reinterpret_cast<KJS::UChar
*>(buffer
.data()), p
- buffer
.data()).rep()->ref());
63 JSStringRef
JSStringRetain(JSStringRef string
)
66 UString::Rep
* rep
= toJS(string
);
67 return toRef(rep
->ref());
70 void JSStringRelease(JSStringRef string
)
73 UString::Rep
* rep
= toJS(string
);
77 size_t JSStringGetLength(JSStringRef string
)
79 UString::Rep
* rep
= toJS(string
);
83 const JSChar
* JSStringGetCharactersPtr(JSStringRef string
)
85 UString::Rep
* rep
= toJS(string
);
86 return reinterpret_cast<const JSChar
*>(rep
->data());
89 size_t JSStringGetMaximumUTF8CStringSize(JSStringRef string
)
91 UString::Rep
* rep
= toJS(string
);
93 // Any UTF8 character > 3 bytes encodes as a UTF16 surrogate pair.
94 return rep
->size() * 3 + 1; // + 1 for terminating '\0'
97 size_t JSStringGetUTF8CString(JSStringRef string
, char* buffer
, size_t bufferSize
)
100 UString::Rep
* rep
= toJS(string
);
101 CString cString
= UString(rep
).UTF8String();
103 size_t length
= std::min(bufferSize
, cString
.size() + 1); // + 1 for terminating '\0'
104 memcpy(buffer
, cString
.c_str(), length
);
108 bool JSStringIsEqual(JSStringRef a
, JSStringRef b
)
112 UString::Rep
* aRep
= toJS(a
);
113 UString::Rep
* bRep
= toJS(b
);
115 return UString(aRep
) == UString(bRep
);
118 bool JSStringIsEqualToUTF8CString(JSStringRef a
, const char* b
)
120 JSStringRef bBuf
= JSStringCreateWithUTF8CString(b
);
121 bool result
= JSStringIsEqual(a
, bBuf
);
122 JSStringRelease(bBuf
);