1 /* 2 * Copyright (c) 2021 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16 #ifndef FOUNDATION_ACE_NAPI_NATIVE_ENGINE_IMPL_JERRYSCRIPT_NATIVE_VALUE_JERRYSCRIPT_NATIVE_STRING_H 17 #define FOUNDATION_ACE_NAPI_NATIVE_ENGINE_IMPL_JERRYSCRIPT_NATIVE_VALUE_JERRYSCRIPT_NATIVE_STRING_H 18 19 #include "jerryscript_native_value.h" 20 21 class JerryScriptNativeString : public JerryScriptNativeValue, public NativeString { 22 public: 23 JerryScriptNativeString(JerryScriptNativeEngine* engine, const char* value, size_t length); 24 JerryScriptNativeString(JerryScriptNativeEngine* engine, const char16_t* value, size_t length); 25 JerryScriptNativeString(JerryScriptNativeEngine* engine, jerry_value_t value); 26 ~JerryScriptNativeString() override; 27 28 void* GetInterface(int interfaceId) override; 29 30 void GetCString(char* buffer, size_t size, size_t* length) override; 31 size_t GetLength() override; EncodeWriteUtf8(char * buffer,size_t bufferSize,int32_t * nchars)32 size_t EncodeWriteUtf8(char* buffer, size_t bufferSize, int32_t* nchars) override { return 0; } EncodeWriteChinese(std::string & buffer,const char * encoding)33 void EncodeWriteChinese(std::string& buffer, const char* encoding) override { return; } 34 void GetCString16(char16_t* buffer, size_t size, size_t* length) override; 35 36 private: 37 char16_t* Utf8ToUtf16(const char* utf8Str, size_t u8len, char16_t* u16str, size_t u16len); 38 static inline size_t Utf8CodePointLen(uint8_t ch); 39 uint32_t Utf8ToUtf32CodePoint(const char* src, size_t length); 40 static inline void Utf8ShiftAndMask(uint32_t* codePoint, const uint8_t byte); 41 int Utf8ToUtf16Length(const char* str8, size_t str8Len); 42 size_t Utf32CodePointUtf8Length(char32_t srcChar); 43 int Utf16ToUtf8Length(const char16_t* str16, size_t str16Len); 44 char* Char16ToChar8(const char16_t* str16, size_t str16Len); 45 void StrncpyStr16ToStr8(const char16_t* utf16Str, size_t str16Len, char* utf8Str, size_t str8Len); 46 void Utf32CodePointToUtf8(uint8_t* dstP, char32_t srcChar, size_t bytes); 47 jerry_value_t CreateStringFromUtf16(const char16_t* value, size_t length); 48 constexpr static char32_t ONE_BYTE_UTF8 = 0x00000080; 49 constexpr static char32_t TWO_BYTES_UTF8 = 0x00000800; 50 constexpr static char32_t THREE_BYTES_UTF8 = 0x00010000; 51 52 constexpr static char32_t UNICODE_RESERVED_START = 55296; 53 constexpr static char32_t UNICODE_RESERVED_END = 0x0000DFFF; 54 constexpr static char32_t UNICODE_MAX_NUM = 0x0010FFFF; 55 constexpr static uint32_t UTF8_OFFSET = 6; 56 57 constexpr static char32_t UTF8_BYTE_MASK = 0x000000BF; 58 constexpr static char32_t UTF8_BYTE_MARK = 0x00000080; 59 constexpr static char32_t UTF8_FIRST_BYTE_MARK[] = { 60 0x00000000, 0x00000000, 0x000000C0, 0x000000E0, 0x000000F0 61 }; 62 constexpr static int UTF8_BYTES_ONE = 1; 63 constexpr static int UTF8_BYTES_TWO = 2; 64 constexpr static int UTF8_BYTES_THREE = 3; 65 constexpr static int UTF8_BYTES_FOUR = 4; 66 }; 67 68 #endif /* FOUNDATION_ACE_NAPI_NATIVE_ENGINE_IMPL_JERRYSCRIPT_NATIVE_VALUE_JERRYSCRIPT_NATIVE_STRING_H */ 69