Skip to content

Commit efdc1a4

Browse files
jasnelladdaleax
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 9459dfa commit efdc1a4

File tree

3 files changed

+139
-123
lines changed

3 files changed

+139
-123
lines changed

node.gyp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -333,6 +333,7 @@
333333
'src/node_contextify.cc',
334334
'src/node_debug_options.cc',
335335
'src/node_domain.cc',
336+
'src/node_encoding.cc',
336337
'src/node_errors.h',
337338
'src/node_file.cc',
338339
'src/node_http2.cc',

src/node.cc

Lines changed: 0 additions & 123 deletions
Original file line numberDiff line numberDiff line change
@@ -770,129 +770,6 @@ Local<Value> MakeCallback(Isolate* isolate,
770770
.FromMaybe(Local<Value>()));
771771
}
772772

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

src/node_encoding.cc

Lines changed: 138 additions & 0 deletions
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)