v8
V8 is Google’s open source high-performance JavaScript and WebAssembly engine, written in C++.
Loading...
Searching...
No Matches
string-16.cc
Go to the documentation of this file.
1// Copyright 2016 the V8 project authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
6
7#include <algorithm>
8#include <cctype>
9#include <cinttypes>
10#include <cstdlib>
11#include <cstring>
12#include <limits>
13#include <string>
14
15#include "../../third_party/inspector_protocol/crdtp/cbor.h"
19
20namespace v8_inspector {
21
22namespace {
23
24bool isASCII(UChar c) { return !(c & ~0x7F); }
25
26bool isSpaceOrNewLine(UChar c) {
27 return isASCII(c) && c <= ' ' && (c == ' ' || (c <= 0xD && c >= 0x9));
28}
29
30int64_t charactersToInteger(const uint16_t* characters, size_t length,
31 bool* ok = nullptr) {
32 std::vector<char> buffer;
33 buffer.reserve(length + 1);
34 for (size_t i = 0; i < length; ++i) {
35 if (!isASCII(characters[i])) {
36 if (ok) *ok = false;
37 return 0;
38 }
39 buffer.push_back(static_cast<char>(characters[i]));
40 }
41 buffer.push_back('\0');
42
43 char* endptr;
44 int64_t result =
45 static_cast<int64_t>(std::strtoll(buffer.data(), &endptr, 10));
46 if (ok) *ok = !(*endptr);
47 return result;
48}
49} // namespace
50
51String16::String16(const UChar* characters, size_t size)
52 : m_impl(characters, size) {}
53String16::String16(const uint16_t* characters, size_t size)
54 : m_impl(reinterpret_cast<const UChar*>(characters), size) {}
55
56String16::String16(const UChar* characters) : m_impl(characters) {}
57
58String16::String16(const char* characters)
59 : String16(characters, std::strlen(characters)) {}
60
61String16::String16(const char* characters, size_t size)
62 : m_impl(characters, characters + size) {}
63String16::String16(std::string_view string)
64 : String16(string.data(), string.length()) {}
65
66String16::String16(const std::basic_string<UChar>& impl) : m_impl(impl) {}
67
68String16::String16(std::basic_string<UChar>&& impl) : m_impl(impl) {}
69
70// static
72 char arr[50];
74 std::string_view str = v8::internal::IntToStringView(number, buffer);
75 return String16(str);
76}
77
78// static
80 const size_t kBufferSize = 50;
81 char buffer[kBufferSize];
82#if defined(V8_OS_WIN)
83 v8::base::OS::SNPrintF(buffer, kBufferSize, "%Iu", number);
84#else
85 v8::base::OS::SNPrintF(buffer, kBufferSize, "%zu", number);
86#endif
87 return String16(buffer);
88}
89
90// static
92 char buffer[50];
93 v8::base::OS::SNPrintF(buffer, arraysize(buffer), "%" PRId64 "", number);
94 return String16(buffer);
95}
96
97// static
99 char arr[50];
101 std::string_view str = v8::internal::DoubleToStringView(number, buffer);
102 return String16(str);
103}
104
105// static
109 std::string_view str =
111 return String16(str);
112}
113
114int64_t String16::toInteger64(bool* ok) const {
115 return charactersToInteger(characters16(), length(), ok);
116}
117
118int String16::toInteger(bool* ok) const {
119 int64_t result = toInteger64(ok);
120 if (ok && *ok) {
121 *ok = result <= std::numeric_limits<int>::max() &&
122 result >= std::numeric_limits<int>::min();
123 }
124 return static_cast<int>(result);
125}
126
127std::pair<size_t, size_t> String16::getTrimmedOffsetAndLength() const {
128 if (!length()) return std::make_pair(0, 0);
129
130 size_t start = 0;
131 size_t end = length() - 1;
132
133 // skip white space from start
134 while (start <= end && isSpaceOrNewLine(characters16()[start])) ++start;
135
136 // only white space
137 if (start > end) return std::make_pair(0, 0);
138
139 // skip white space from end
140 while (end && isSpaceOrNewLine(characters16()[end])) --end;
141
142 return std::make_pair(start, end + 1 - start);
143}
144
146 std::pair<size_t, size_t> offsetAndLength = getTrimmedOffsetAndLength();
147 if (offsetAndLength.second == 0) return String16();
148 if (offsetAndLength.first == 0 && offsetAndLength.second == length() - 1) {
149 return *this;
150 }
151 return substring(offsetAndLength.first, offsetAndLength.second);
152}
153
155
157 m_buffer.insert(m_buffer.end(), s.characters16(),
158 s.characters16() + s.length());
159}
160
161void String16Builder::append(UChar c) { m_buffer.push_back(c); }
162
164 UChar u = c;
165 m_buffer.push_back(u);
166}
167
168void String16Builder::append(const UChar* characters, size_t length) {
169 m_buffer.insert(m_buffer.end(), characters, characters + length);
170}
171
172void String16Builder::append(const char* characters, size_t length) {
173 m_buffer.insert(m_buffer.end(), characters, characters + length);
174}
175
177 constexpr int kBufferSize = 11;
178 char buffer[kBufferSize];
179 int chars = v8::base::OS::SNPrintF(buffer, kBufferSize, "%d", number);
180 DCHECK_LE(0, chars);
181 m_buffer.insert(m_buffer.end(), buffer, buffer + chars);
182}
183
184void String16Builder::appendNumber(size_t number) {
185 constexpr int kBufferSize = 20;
186 char buffer[kBufferSize];
187#if defined(V8_OS_WIN)
188 int chars = v8::base::OS::SNPrintF(buffer, kBufferSize, "%Iu", number);
189#else
190 int chars = v8::base::OS::SNPrintF(buffer, kBufferSize, "%zu", number);
191#endif
192 DCHECK_LE(0, chars);
193 m_buffer.insert(m_buffer.end(), buffer, buffer + chars);
194}
195
197 constexpr int kBufferSize = 17;
198 char buffer[kBufferSize];
199 int chars =
200 v8::base::OS::SNPrintF(buffer, kBufferSize, "%016" PRIx64, number);
201 DCHECK_LE(0, chars);
202 m_buffer.insert(m_buffer.end(), buffer, buffer + chars);
203}
204
206 constexpr int kBufferSize = 9;
207 char buffer[kBufferSize];
208 int chars = v8::base::OS::SNPrintF(buffer, kBufferSize, "%08" PRIx32, number);
209 DCHECK_LE(0, chars);
210 m_buffer.insert(m_buffer.end(), buffer, buffer + chars);
211}
212
214 constexpr int kBufferSize = 3;
215 char buffer[kBufferSize];
216 int chars = v8::base::OS::SNPrintF(buffer, kBufferSize, "%02" PRIx8, number);
217 DCHECK_LE(0, chars);
218 m_buffer.insert(m_buffer.end(), buffer, buffer + chars);
219}
220
222 return String16(m_buffer.data(), m_buffer.size());
223}
224
225void String16Builder::reserveCapacity(size_t capacity) {
226 m_buffer.reserve(capacity);
227}
228
229String16 String16::fromUTF8(const char* stringStart, size_t length) {
230 return String16(UTF8ToUTF16(stringStart, length));
231}
232
233String16 String16::fromUTF16LE(const UChar* stringStart, size_t length) {
234#ifdef V8_TARGET_BIG_ENDIAN
235 // Need to flip the byte order on big endian machines.
236 String16Builder builder;
237 builder.reserveCapacity(length);
238 for (size_t i = 0; i < length; i++) {
239 const UChar utf16be_char =
240 stringStart[i] << 8 | (stringStart[i] >> 8 & 0x00FF);
241 builder.append(utf16be_char);
242 }
243 return builder.toString();
244#else
245 // No need to do anything on little endian machines.
246 return String16(stringStart, length);
247#endif // V8_TARGET_BIG_ENDIAN
248}
249
250String16 String16::fromUTF16LE(const uint16_t* stringStart, size_t length) {
251 return fromUTF16LE(reinterpret_cast<const UChar*>(stringStart), length);
252}
253
254std::string String16::utf8() const {
255 return UTF16ToUTF8(m_impl.data(), m_impl.size());
256}
257
258} // namespace v8_inspector
void append(const String16 &)
Definition string-16.cc:156
std::vector< UChar > m_buffer
Definition string-16.h:154
void appendUnsignedAsHex(uint64_t)
Definition string-16.cc:196
static V8_EXPORT String16 fromUTF8(const char *stringStart, size_t length)
Definition string-16.cc:229
size_t length() const
Definition string-16.h:58
String16 stripWhiteSpace() const
Definition string-16.cc:145
static String16 fromInteger(int)
Definition string-16.cc:71
int toInteger(bool *ok=nullptr) const
Definition string-16.cc:118
static String16 fromInteger64(int64_t)
Definition string-16.cc:91
static String16 fromDouble(double)
Definition string-16.cc:98
static V8_EXPORT String16 fromUTF16LE(const UChar *stringStart, size_t length)
Definition string-16.cc:233
std::basic_string< UChar > m_impl
Definition string-16.h:122
int64_t toInteger64(bool *ok=nullptr) const
Definition string-16.cc:114
V8_EXPORT std::string utf8() const
Definition string-16.cc:254
const uint16_t * characters16() const
Definition string-16.h:55
std::pair< size_t, size_t > getTrimmedOffsetAndLength() const
Definition string-16.cc:127
int start
int end
Precision precision
ZoneVector< RpoNumber > & result
STL namespace.
constexpr Vector< T > ArrayVector(T(&arr)[N])
Definition vector.h:354
constexpr int kDoubleToPrecisionMaxChars
Definition conversions.h:77
std::string_view IntToStringView(int n, base::Vector< char > buffer)
std::string_view DoubleToStringView(double v, base::Vector< char > buffer)
std::string_view DoubleToPrecisionStringView(double value, int p, base::Vector< char > buffer)
std::basic_string< UChar > UTF8ToUTF16(const char *stringStart, size_t length)
char16_t UChar
Definition string-16.h:22
std::string UTF16ToUTF8(const UChar *stringStart, size_t length)
uint32_t substring
#define DCHECK_LE(v1, v2)
Definition logging.h:490
#define arraysize(array)
Definition macros.h:67