#include "APICast.h"
#include "JSStringRef.h"
#include <kjs/JSLock.h>
#include <kjs/JSType.h>
#include <kjs/internal.h>
#include <kjs/operations.h>
#include <kjs/ustring.h>
#include <kjs/value.h>
using namespace KJS;
JSStringRef JSStringCreateWithCharacters(const JSChar* chars, size_t numChars)
{
JSLock lock;
return toRef(UString(reinterpret_cast<const UChar*>(chars), numChars).rep()->ref());
}
JSStringRef JSStringCreateWithUTF8CString(const char* string)
{
JSLock lock;
return toRef(UString(string).rep()->ref());
}
JSStringRef JSStringRetain(JSStringRef string)
{
UString::Rep* rep = toJS(string);
return toRef(rep->ref());
}
void JSStringRelease(JSStringRef string)
{
JSLock lock;
UString::Rep* rep = toJS(string);
rep->deref();
}
size_t JSStringGetLength(JSStringRef string)
{
UString::Rep* rep = toJS(string);
return rep->size();
}
const JSChar* JSStringGetCharactersPtr(JSStringRef string)
{
UString::Rep* rep = toJS(string);
return reinterpret_cast<const JSChar*>(rep->data());
}
size_t JSStringGetMaximumUTF8CStringSize(JSStringRef string)
{
UString::Rep* rep = toJS(string);
return rep->size() * 3 + 1; }
size_t JSStringGetUTF8CString(JSStringRef string, char* buffer, size_t bufferSize)
{
JSLock lock;
UString::Rep* rep = toJS(string);
CString cString = UString(rep).UTF8String();
size_t length = std::min(bufferSize, cString.size() + 1); memcpy(buffer, cString.c_str(), length);
return length;
}
bool JSStringIsEqual(JSStringRef a, JSStringRef b)
{
UString::Rep* aRep = toJS(a);
UString::Rep* bRep = toJS(b);
return UString(aRep) == UString(bRep);
}
bool JSStringIsEqualToUTF8CString(JSStringRef a, const char* b)
{
JSStringRef bBuf = JSStringCreateWithUTF8CString(b);
bool result = JSStringIsEqual(a, bBuf);
JSStringRelease(bBuf);
return result;
}
#if defined(__APPLE__)
JSStringRef JSStringCreateWithCFString(CFStringRef string)
{
JSLock lock;
CFIndex length = CFStringGetLength(string);
if (const UniChar* buffer = CFStringGetCharactersPtr(string)) {
UString::Rep* rep = UString(reinterpret_cast<const UChar*>(buffer), length).rep()->ref();
return toRef(rep);
}
UniChar* buffer = static_cast<UniChar*>(fastMalloc(sizeof(UniChar) * length));
CFStringGetCharacters(string, CFRangeMake(0, length), buffer);
UString::Rep* rep = UString(reinterpret_cast<UChar*>(buffer), length, false).rep()->ref();
return toRef(rep);
}
CFStringRef JSStringCopyCFString(CFAllocatorRef alloc, JSStringRef string)
{
UString::Rep* rep = toJS(string);
return CFStringCreateWithCharacters(alloc, reinterpret_cast<const JSChar*>(rep->data()), rep->size());
}
#endif // __APPLE__