summaryrefslogtreecommitdiff
path: root/src/string_decoder.h
diff options
context:
space:
mode:
authorAnna Henningsen <anna@addaleax.net>2018-02-01 02:28:39 +0100
committerRuben Bridgewater <ruben@bridgewater.de>2018-02-10 14:38:56 +0100
commit180af17b522f531eb15b917f4fde9570b6aa95ae (patch)
treeefba443aa3cdad07701fc9e36a5cd39264dc9886 /src/string_decoder.h
parentde848ac1e0483327a2ce8716c3f8567eaeacb660 (diff)
downloadnode-new-180af17b522f531eb15b917f4fde9570b6aa95ae.tar.gz
string_decoder: reimplement in C++
Implement string decoder in C++. The perks are a decent speed boost (for decoding, whereas creation show some performance degradation), that this can now be used more easily to add native decoding support to C++ streams and (arguably) more readable variable names. PR-URL: https://github.com/nodejs/node/pull/18537 Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl>
Diffstat (limited to 'src/string_decoder.h')
-rw-r--r--src/string_decoder.h50
1 files changed, 50 insertions, 0 deletions
diff --git a/src/string_decoder.h b/src/string_decoder.h
new file mode 100644
index 0000000000..9059eeaa9d
--- /dev/null
+++ b/src/string_decoder.h
@@ -0,0 +1,50 @@
+#ifndef SRC_STRING_DECODER_H_
+#define SRC_STRING_DECODER_H_
+
+#if defined(NODE_WANT_INTERNALS) && NODE_WANT_INTERNALS
+
+#include "node.h"
+
+namespace node {
+
+class StringDecoder {
+ public:
+ StringDecoder() { state_[kEncodingField] = BUFFER; }
+ inline void SetEncoding(enum encoding encoding);
+ inline enum encoding Encoding() const;
+
+ inline char* IncompleteCharacterBuffer();
+ inline unsigned MissingBytes() const;
+ inline unsigned BufferedBytes() const;
+
+ // Decode a string from the specified encoding.
+ // The value pointed to by `nread` will be modified to reflect that
+ // less data may have been read because it ended on an incomplete character
+ // and more data may have been read because a previously incomplete character
+ // was finished.
+ v8::MaybeLocal<v8::String> DecodeData(v8::Isolate* isolate,
+ const char* data,
+ size_t* nread);
+ // Flush an incomplete character. For character encodings like UTF8 this
+ // means printing replacement characters, buf for e.g. Base64 the returned
+ // string contains more data.
+ v8::MaybeLocal<v8::String> FlushData(v8::Isolate* isolate);
+
+ enum Fields {
+ kIncompleteCharactersStart = 0,
+ kIncompleteCharactersEnd = 4,
+ kMissingBytes = 4,
+ kBufferedBytes = 5,
+ kEncodingField = 6,
+ kNumFields = 7
+ };
+
+ private:
+ uint8_t state_[kNumFields] = {};
+};
+
+} // namespace node
+
+#endif // defined(NODE_WANT_INTERNALS) && NODE_WANT_INTERNALS
+
+#endif // SRC_STRING_DECODER_H_