Skip to content

Commit eaf99d9

Browse files
jasnellrvagg
authored andcommitted
src: add node_encoding.cc
Continue moving bits of code out of node.cc ... add node_encoding.cc as a home for `ParseEncoding` and related functions. Backport-PR-URL: #21798 PR-URL: #21112 Reviewed-By: Anna Henningsen <anna@addaleax.net> Reviewed-By: Tiancheng "Timothy" Gu <timothygu99@gmail.com> Reviewed-By: Trivikram Kamat <trivikr.dev@gmail.com> Reviewed-By: Joyee Cheung <joyeec9h3@gmail.com>
1 parent 0321afe commit eaf99d9

File tree

3 files changed

+139
-123
lines changed

3 files changed

+139
-123
lines changed

node.gyp

+1
Original file line numberDiff line numberDiff line change
@@ -283,6 +283,7 @@
283283
'src/node_constants.cc',
284284
'src/node_contextify.cc',
285285
'src/node_debug_options.cc',
286+
'src/node_encoding.cc',
286287
'src/node_file.cc',
287288
'src/node_http2.cc',
288289
'src/node_http_parser.cc',

src/node.cc

-123
Original file line numberDiff line numberDiff line change
@@ -1532,129 +1532,6 @@ Local<Value> MakeCallback(Isolate* isolate,
15321532
.FromMaybe(Local<Value>()));
15331533
}
15341534

1535-
1536-
enum encoding ParseEncoding(const char* encoding,
1537-
enum encoding default_encoding) {
1538-
switch (encoding[0]) {
1539-
case 'u':
1540-
// utf8, utf16le
1541-
if (encoding[1] == 't' && encoding[2] == 'f') {
1542-
// Skip `-`
1543-
encoding += encoding[3] == '-' ? 4 : 3;
1544-
if (encoding[0] == '8' && encoding[1] == '\0')
1545-
return UTF8;
1546-
if (strncmp(encoding, "16le", 4) == 0)
1547-
return UCS2;
1548-
1549-
// ucs2
1550-
} else if (encoding[1] == 'c' && encoding[2] == 's') {
1551-
encoding += encoding[3] == '-' ? 4 : 3;
1552-
if (encoding[0] == '2' && encoding[1] == '\0')
1553-
return UCS2;
1554-
}
1555-
break;
1556-
case 'l':
1557-
// latin1
1558-
if (encoding[1] == 'a') {
1559-
if (strncmp(encoding + 2, "tin1", 4) == 0)
1560-
return LATIN1;
1561-
}
1562-
break;
1563-
case 'b':
1564-
// binary
1565-
if (encoding[1] == 'i') {
1566-
if (strncmp(encoding + 2, "nary", 4) == 0)
1567-
return LATIN1;
1568-
1569-
// buffer
1570-
} else if (encoding[1] == 'u') {
1571-
if (strncmp(encoding + 2, "ffer", 4) == 0)
1572-
return BUFFER;
1573-
}
1574-
break;
1575-
case '\0':
1576-
return default_encoding;
1577-
default:
1578-
break;
1579-
}
1580-
1581-
if (StringEqualNoCase(encoding, "utf8")) {
1582-
return UTF8;
1583-
} else if (StringEqualNoCase(encoding, "utf-8")) {
1584-
return UTF8;
1585-
} else if (StringEqualNoCase(encoding, "ascii")) {
1586-
return ASCII;
1587-
} else if (StringEqualNoCase(encoding, "base64")) {
1588-
return BASE64;
1589-
} else if (StringEqualNoCase(encoding, "ucs2")) {
1590-
return UCS2;
1591-
} else if (StringEqualNoCase(encoding, "ucs-2")) {
1592-
return UCS2;
1593-
} else if (StringEqualNoCase(encoding, "utf16le")) {
1594-
return UCS2;
1595-
} else if (StringEqualNoCase(encoding, "utf-16le")) {
1596-
return UCS2;
1597-
} else if (StringEqualNoCase(encoding, "latin1")) {
1598-
return LATIN1;
1599-
} else if (StringEqualNoCase(encoding, "binary")) {
1600-
return LATIN1; // BINARY is a deprecated alias of LATIN1.
1601-
} else if (StringEqualNoCase(encoding, "buffer")) {
1602-
return BUFFER;
1603-
} else if (StringEqualNoCase(encoding, "hex")) {
1604-
return HEX;
1605-
} else {
1606-
return default_encoding;
1607-
}
1608-
}
1609-
1610-
1611-
enum encoding ParseEncoding(Isolate* isolate,
1612-
Local<Value> encoding_v,
1613-
enum encoding default_encoding) {
1614-
CHECK(!encoding_v.IsEmpty());
1615-
1616-
if (!encoding_v->IsString())
1617-
return default_encoding;
1618-
1619-
node::Utf8Value encoding(isolate, encoding_v);
1620-
1621-
return ParseEncoding(*encoding, default_encoding);
1622-
}
1623-
1624-
Local<Value> Encode(Isolate* isolate,
1625-
const char* buf,
1626-
size_t len,
1627-
enum encoding encoding) {
1628-
CHECK_NE(encoding, UCS2);
1629-
Local<Value> error;
1630-
return StringBytes::Encode(isolate, buf, len, encoding, &error)
1631-
.ToLocalChecked();
1632-
}
1633-
1634-
Local<Value> Encode(Isolate* isolate, const uint16_t* buf, size_t len) {
1635-
Local<Value> error;
1636-
return StringBytes::Encode(isolate, buf, len, &error)
1637-
.ToLocalChecked();
1638-
}
1639-
1640-
// Returns -1 if the handle was not valid for decoding
1641-
ssize_t DecodeBytes(Isolate* isolate,
1642-
Local<Value> val,
1643-
enum encoding encoding) {
1644-
HandleScope scope(isolate);
1645-
1646-
return StringBytes::Size(isolate, val, encoding);
1647-
}
1648-
1649-
// Returns number of bytes written.
1650-
ssize_t DecodeWrite(Isolate* isolate,
1651-
char* buf,
1652-
size_t buflen,
1653-
Local<Value> val,
1654-
enum encoding encoding) {
1655-
return StringBytes::Write(isolate, buf, buflen, val, encoding, nullptr);
1656-
}
1657-
16581535
bool IsExceptionDecorated(Environment* env, Local<Value> er) {
16591536
if (!er.IsEmpty() && er->IsObject()) {
16601537
Local<Object> err_obj = er.As<Object>();

src/node_encoding.cc

+138
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,138 @@
1+
#include "node.h"
2+
#include "env.h"
3+
#include "env-inl.h"
4+
#include "string_bytes.h"
5+
#include "util.h"
6+
#include "util-inl.h"
7+
#include "v8.h"
8+
9+
namespace node {
10+
11+
using v8::HandleScope;
12+
using v8::Isolate;
13+
using v8::Local;
14+
using v8::Value;
15+
16+
enum encoding ParseEncoding(const char* encoding,
17+
enum encoding default_encoding) {
18+
switch (encoding[0]) {
19+
case 'u':
20+
// utf8, utf16le
21+
if (encoding[1] == 't' && encoding[2] == 'f') {
22+
// Skip `-`
23+
encoding += encoding[3] == '-' ? 4 : 3;
24+
if (encoding[0] == '8' && encoding[1] == '\0')
25+
return UTF8;
26+
if (strncmp(encoding, "16le", 4) == 0)
27+
return UCS2;
28+
29+
// ucs2
30+
} else if (encoding[1] == 'c' && encoding[2] == 's') {
31+
encoding += encoding[3] == '-' ? 4 : 3;
32+
if (encoding[0] == '2' && encoding[1] == '\0')
33+
return UCS2;
34+
}
35+
break;
36+
case 'l':
37+
// latin1
38+
if (encoding[1] == 'a') {
39+
if (strncmp(encoding + 2, "tin1", 4) == 0)
40+
return LATIN1;
41+
}
42+
break;
43+
case 'b':
44+
// binary
45+
if (encoding[1] == 'i') {
46+
if (strncmp(encoding + 2, "nary", 4) == 0)
47+
return LATIN1;
48+
49+
// buffer
50+
} else if (encoding[1] == 'u') {
51+
if (strncmp(encoding + 2, "ffer", 4) == 0)
52+
return BUFFER;
53+
}
54+
break;
55+
case '\0':
56+
return default_encoding;
57+
default:
58+
break;
59+
}
60+
61+
if (StringEqualNoCase(encoding, "utf8")) {
62+
return UTF8;
63+
} else if (StringEqualNoCase(encoding, "utf-8")) {
64+
return UTF8;
65+
} else if (StringEqualNoCase(encoding, "ascii")) {
66+
return ASCII;
67+
} else if (StringEqualNoCase(encoding, "base64")) {
68+
return BASE64;
69+
} else if (StringEqualNoCase(encoding, "ucs2")) {
70+
return UCS2;
71+
} else if (StringEqualNoCase(encoding, "ucs-2")) {
72+
return UCS2;
73+
} else if (StringEqualNoCase(encoding, "utf16le")) {
74+
return UCS2;
75+
} else if (StringEqualNoCase(encoding, "utf-16le")) {
76+
return UCS2;
77+
} else if (StringEqualNoCase(encoding, "latin1")) {
78+
return LATIN1;
79+
} else if (StringEqualNoCase(encoding, "binary")) {
80+
return LATIN1; // BINARY is a deprecated alias of LATIN1.
81+
} else if (StringEqualNoCase(encoding, "buffer")) {
82+
return BUFFER;
83+
} else if (StringEqualNoCase(encoding, "hex")) {
84+
return HEX;
85+
} else {
86+
return default_encoding;
87+
}
88+
}
89+
90+
91+
enum encoding ParseEncoding(Isolate* isolate,
92+
Local<Value> encoding_v,
93+
enum encoding default_encoding) {
94+
CHECK(!encoding_v.IsEmpty());
95+
96+
if (!encoding_v->IsString())
97+
return default_encoding;
98+
99+
node::Utf8Value encoding(isolate, encoding_v);
100+
101+
return ParseEncoding(*encoding, default_encoding);
102+
}
103+
104+
Local<Value> Encode(Isolate* isolate,
105+
const char* buf,
106+
size_t len,
107+
enum encoding encoding) {
108+
CHECK_NE(encoding, UCS2);
109+
Local<Value> error;
110+
return StringBytes::Encode(isolate, buf, len, encoding, &error)
111+
.ToLocalChecked();
112+
}
113+
114+
Local<Value> Encode(Isolate* isolate, const uint16_t* buf, size_t len) {
115+
Local<Value> error;
116+
return StringBytes::Encode(isolate, buf, len, &error)
117+
.ToLocalChecked();
118+
}
119+
120+
// Returns -1 if the handle was not valid for decoding
121+
ssize_t DecodeBytes(Isolate* isolate,
122+
Local<Value> val,
123+
enum encoding encoding) {
124+
HandleScope scope(isolate);
125+
126+
return StringBytes::Size(isolate, val, encoding);
127+
}
128+
129+
// Returns number of bytes written.
130+
ssize_t DecodeWrite(Isolate* isolate,
131+
char* buf,
132+
size_t buflen,
133+
Local<Value> val,
134+
enum encoding encoding) {
135+
return StringBytes::Write(isolate, buf, buflen, val, encoding, nullptr);
136+
}
137+
138+
} // namespace node

0 commit comments

Comments
 (0)