Skip to content

Commit 2387c41

Browse files
jasnelltargos
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. PR-URL: #21112 Reviewed-By: Anna Henningsen <[email protected]> Reviewed-By: Tiancheng "Timothy" Gu <[email protected]> Reviewed-By: Trivikram Kamat <[email protected]> Reviewed-By: Joyee Cheung <[email protected]>
1 parent 69cc26a commit 2387c41

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
@@ -332,6 +332,7 @@
332332
'src/node_contextify.cc',
333333
'src/node_debug_options.cc',
334334
'src/node_domain.cc',
335+
'src/node_encoding.cc',
335336
'src/node_errors.h',
336337
'src/node_file.cc',
337338
'src/node_http2.cc',

src/node.cc

-123
Original file line numberDiff line numberDiff line change
@@ -769,129 +769,6 @@ Local<Value> MakeCallback(Isolate* isolate,
769769
.FromMaybe(Local<Value>()));
770770
}
771771

772-
773-
enum encoding ParseEncoding(const char* encoding,
774-
enum encoding default_encoding) {
775-
switch (encoding[0]) {
776-
case 'u':
777-
// utf8, utf16le
778-
if (encoding[1] == 't' && encoding[2] == 'f') {
779-
// Skip `-`
780-
encoding += encoding[3] == '-' ? 4 : 3;
781-
if (encoding[0] == '8' && encoding[1] == '\0')
782-
return UTF8;
783-
if (strncmp(encoding, "16le", 4) == 0)
784-
return UCS2;
785-
786-
// ucs2
787-
} else if (encoding[1] == 'c' && encoding[2] == 's') {
788-
encoding += encoding[3] == '-' ? 4 : 3;
789-
if (encoding[0] == '2' && encoding[1] == '\0')
790-
return UCS2;
791-
}
792-
break;
793-
case 'l':
794-
// latin1
795-
if (encoding[1] == 'a') {
796-
if (strncmp(encoding + 2, "tin1", 4) == 0)
797-
return LATIN1;
798-
}
799-
break;
800-
case 'b':
801-
// binary
802-
if (encoding[1] == 'i') {
803-
if (strncmp(encoding + 2, "nary", 4) == 0)
804-
return LATIN1;
805-
806-
// buffer
807-
} else if (encoding[1] == 'u') {
808-
if (strncmp(encoding + 2, "ffer", 4) == 0)
809-
return BUFFER;
810-
}
811-
break;
812-
case '\0':
813-
return default_encoding;
814-
default:
815-
break;
816-
}
817-
818-
if (StringEqualNoCase(encoding, "utf8")) {
819-
return UTF8;
820-
} else if (StringEqualNoCase(encoding, "utf-8")) {
821-
return UTF8;
822-
} else if (StringEqualNoCase(encoding, "ascii")) {
823-
return ASCII;
824-
} else if (StringEqualNoCase(encoding, "base64")) {
825-
return BASE64;
826-
} else if (StringEqualNoCase(encoding, "ucs2")) {
827-
return UCS2;
828-
} else if (StringEqualNoCase(encoding, "ucs-2")) {
829-
return UCS2;
830-
} else if (StringEqualNoCase(encoding, "utf16le")) {
831-
return UCS2;
832-
} else if (StringEqualNoCase(encoding, "utf-16le")) {
833-
return UCS2;
834-
} else if (StringEqualNoCase(encoding, "latin1")) {
835-
return LATIN1;
836-
} else if (StringEqualNoCase(encoding, "binary")) {
837-
return LATIN1; // BINARY is a deprecated alias of LATIN1.
838-
} else if (StringEqualNoCase(encoding, "buffer")) {
839-
return BUFFER;
840-
} else if (StringEqualNoCase(encoding, "hex")) {
841-
return HEX;
842-
} else {
843-
return default_encoding;
844-
}
845-
}
846-
847-
848-
enum encoding ParseEncoding(Isolate* isolate,
849-
Local<Value> encoding_v,
850-
enum encoding default_encoding) {
851-
CHECK(!encoding_v.IsEmpty());
852-
853-
if (!encoding_v->IsString())
854-
return default_encoding;
855-
856-
node::Utf8Value encoding(isolate, encoding_v);
857-
858-
return ParseEncoding(*encoding, default_encoding);
859-
}
860-
861-
Local<Value> Encode(Isolate* isolate,
862-
const char* buf,
863-
size_t len,
864-
enum encoding encoding) {
865-
CHECK_NE(encoding, UCS2);
866-
Local<Value> error;
867-
return StringBytes::Encode(isolate, buf, len, encoding, &error)
868-
.ToLocalChecked();
869-
}
870-
871-
Local<Value> Encode(Isolate* isolate, const uint16_t* buf, size_t len) {
872-
Local<Value> error;
873-
return StringBytes::Encode(isolate, buf, len, &error)
874-
.ToLocalChecked();
875-
}
876-
877-
// Returns -1 if the handle was not valid for decoding
878-
ssize_t DecodeBytes(Isolate* isolate,
879-
Local<Value> val,
880-
enum encoding encoding) {
881-
HandleScope scope(isolate);
882-
883-
return StringBytes::Size(isolate, val, encoding);
884-
}
885-
886-
// Returns number of bytes written.
887-
ssize_t DecodeWrite(Isolate* isolate,
888-
char* buf,
889-
size_t buflen,
890-
Local<Value> val,
891-
enum encoding encoding) {
892-
return StringBytes::Write(isolate, buf, buflen, val, encoding, nullptr);
893-
}
894-
895772
bool IsExceptionDecorated(Environment* env, Local<Value> er) {
896773
if (!er.IsEmpty() && er->IsObject()) {
897774
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+
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)