1 #include "node_string.h"
2 #include "node/inspector/protocol/Protocol.h"
3
4 #include <unicode/unistr.h>
5
6 namespace node {
7 namespace inspector {
8 namespace protocol {
9 namespace StringUtil {
10
11 size_t kNotFound = std::string::npos;
12
13 // NOLINTNEXTLINE(runtime/references) V8 API requirement
builderAppendQuotedString(StringBuilder & builder,const String & string)14 void builderAppendQuotedString(StringBuilder& builder, const String& string) {
15 builder.put('"');
16 if (!string.empty()) {
17 icu::UnicodeString utf16 = icu::UnicodeString::fromUTF8(
18 icu::StringPiece(string.data(), string.length()));
19 escapeWideStringForJSON(
20 reinterpret_cast<const uint16_t*>(utf16.getBuffer()), utf16.length(),
21 &builder);
22 }
23 builder.put('"');
24 }
25
parseJSON(const String & string)26 std::unique_ptr<Value> parseJSON(const String& string) {
27 if (string.empty())
28 return nullptr;
29
30 icu::UnicodeString utf16 =
31 icu::UnicodeString::fromUTF8(icu::StringPiece(string.data(),
32 string.length()));
33 return parseJSONCharacters(
34 reinterpret_cast<const uint16_t*>(utf16.getBuffer()), utf16.length());
35 }
36
parseJSON(v8_inspector::StringView string)37 std::unique_ptr<Value> parseJSON(v8_inspector::StringView string) {
38 if (string.length() == 0)
39 return nullptr;
40 if (string.is8Bit())
41 return parseJSONCharacters(string.characters8(), string.length());
42 return parseJSONCharacters(string.characters16(), string.length());
43 }
44
StringViewToUtf8(v8_inspector::StringView view)45 String StringViewToUtf8(v8_inspector::StringView view) {
46 if (view.length() == 0)
47 return "";
48 if (view.is8Bit()) {
49 return std::string(reinterpret_cast<const char*>(view.characters8()),
50 view.length());
51 }
52 const uint16_t* source = view.characters16();
53 const UChar* unicodeSource = reinterpret_cast<const UChar*>(source);
54 static_assert(sizeof(*source) == sizeof(*unicodeSource),
55 "sizeof(*source) == sizeof(*unicodeSource)");
56
57 size_t result_length = view.length() * sizeof(*source);
58 std::string result(result_length, '\0');
59 icu::UnicodeString utf16(unicodeSource, view.length());
60 // ICU components for std::string compatibility are not enabled in build...
61 bool done = false;
62 while (!done) {
63 icu::CheckedArrayByteSink sink(&result[0], result_length);
64 utf16.toUTF8(sink);
65 result_length = sink.NumberOfBytesAppended();
66 result.resize(result_length);
67 done = !sink.Overflowed();
68 }
69 return result;
70 }
71
fromDouble(double d)72 String fromDouble(double d) {
73 std::ostringstream stream;
74 stream.imbue(std::locale::classic()); // Ignore current locale
75 stream << d;
76 return stream.str();
77 }
78
toDouble(const char * buffer,size_t length,bool * ok)79 double toDouble(const char* buffer, size_t length, bool* ok) {
80 std::istringstream stream(std::string(buffer, length));
81 stream.imbue(std::locale::classic()); // Ignore current locale
82 double d;
83 stream >> d;
84 *ok = !stream.fail();
85 return d;
86 }
87
parseMessage(const std::string & message,bool binary)88 std::unique_ptr<Value> parseMessage(const std::string& message, bool binary) {
89 if (binary) {
90 return Value::parseBinary(
91 reinterpret_cast<const uint8_t*>(message.data()),
92 message.length());
93 }
94 return parseJSON(message);
95 }
96
jsonToMessage(String message)97 ProtocolMessage jsonToMessage(String message) {
98 return message;
99 }
100
binaryToMessage(std::vector<uint8_t> message)101 ProtocolMessage binaryToMessage(std::vector<uint8_t> message) {
102 return std::string(reinterpret_cast<const char*>(message.data()),
103 message.size());
104 }
105
fromUTF8(const uint8_t * data,size_t length)106 String fromUTF8(const uint8_t* data, size_t length) {
107 return std::string(reinterpret_cast<const char*>(data), length);
108 }
109
fromUTF16(const uint16_t * data,size_t length)110 String fromUTF16(const uint16_t* data, size_t length) {
111 icu::UnicodeString utf16(reinterpret_cast<const char16_t*>(data), length);
112 std::string result;
113 return utf16.toUTF8String(result);
114 }
115
CharactersUTF8(const String & s)116 const uint8_t* CharactersUTF8(const String& s) {
117 return reinterpret_cast<const uint8_t*>(s.data());
118 }
119
CharacterCount(const String & s)120 size_t CharacterCount(const String& s) {
121 icu::UnicodeString utf16 =
122 icu::UnicodeString::fromUTF8(icu::StringPiece(s.data(), s.length()));
123 return utf16.countChar32();
124 }
125
126 } // namespace StringUtil
127 } // namespace protocol
128 } // namespace inspector
129 } // namespace node
130
131