diff --git a/runtime/Cpp/runtime/src/ANTLRFileStream.cpp b/runtime/Cpp/runtime/src/ANTLRFileStream.cpp index 072035019..62061bb83 100755 --- a/runtime/Cpp/runtime/src/ANTLRFileStream.cpp +++ b/runtime/Cpp/runtime/src/ANTLRFileStream.cpp @@ -9,9 +9,6 @@ using namespace antlr4; -ANTLRFileStream::ANTLRFileStream(): ANTLRInputStream(std::string()) { -} - void ANTLRFileStream::loadFromFile(const std::string &fileName) { _fileName = fileName; if (_fileName.empty()) { diff --git a/runtime/Cpp/runtime/src/ANTLRFileStream.h b/runtime/Cpp/runtime/src/ANTLRFileStream.h index 7a791e720..1beb36ca2 100755 --- a/runtime/Cpp/runtime/src/ANTLRFileStream.h +++ b/runtime/Cpp/runtime/src/ANTLRFileStream.h @@ -14,8 +14,9 @@ namespace antlr4 { // TODO: this class needs testing. class ANTLR4CPP_PUBLIC ANTLRFileStream : public ANTLRInputStream { public: - ANTLRFileStream(); ANTLRFileStream(const std::string &) = delete; + ANTLRFileStream(const char *data, size_t length) = delete; + ANTLRFileStream(std::istream &stream) = delete; // Assumes a file name encoded in UTF-8 and file content in the same encoding (with or w/o BOM). virtual void loadFromFile(const std::string &fileName); diff --git a/runtime/Cpp/runtime/src/ANTLRInputStream.cpp b/runtime/Cpp/runtime/src/ANTLRInputStream.cpp index 9fa20be8a..e92560ff9 100755 --- a/runtime/Cpp/runtime/src/ANTLRInputStream.cpp +++ b/runtime/Cpp/runtime/src/ANTLRInputStream.cpp @@ -17,47 +17,41 @@ using namespace antlrcpp; using misc::Interval; -#if __cplusplus >= 201703L -ANTLRInputStream::ANTLRInputStream(std::string_view input) { +ANTLRInputStream::ANTLRInputStream() { InitializeInstanceFields(); - load(input); +} + +#if __cplusplus >= 201703L +ANTLRInputStream::ANTLRInputStream(const std::string_view &input): ANTLRInputStream() { + load(input.data(), input.length()); } #endif -ANTLRInputStream::ANTLRInputStream(const std::string &input) { - InitializeInstanceFields(); - load(input); +ANTLRInputStream::ANTLRInputStream(const std::string &input): ANTLRInputStream() { + load(input.data(), input.size()); } -ANTLRInputStream::ANTLRInputStream(const char data_[], size_t numberOfActualCharsInArray) - : ANTLRInputStream(std::string(data_, numberOfActualCharsInArray)) { +ANTLRInputStream::ANTLRInputStream(const char *data, size_t length) { + load(data, length); } -ANTLRInputStream::ANTLRInputStream(std::istream &stream) { - InitializeInstanceFields(); +ANTLRInputStream::ANTLRInputStream(std::istream &stream): ANTLRInputStream() { load(stream); } -#if __cplusplus >= 201703L -void ANTLRInputStream::load(std::string_view input) { - // Remove the UTF-8 BOM if present. - constexpr std::string_view bom = "\xef\xbb\xbf"; - if (input.compare(0, 3, bom) == 0) - input.remove_prefix(3); - _data = antlrcpp::utf8_to_utf32(input.data(), input.data() + input.size()); - p = 0; -} -#else void ANTLRInputStream::load(const std::string &input) { + load(input.data(), input.size()); +} + +void ANTLRInputStream::load(const char *data, size_t length) { // Remove the UTF-8 BOM if present. const char bom[4] = "\xef\xbb\xbf"; - if (input.compare(0, 3, bom, 3) == 0) - _data = antlrcpp::utf8_to_utf32(input.data() + 3, input.data() + input.size()); + if (strncmp(data, bom, 3) == 0) + _data = antlrcpp::utf8_to_utf32(data + 3, data + length); else - _data = antlrcpp::utf8_to_utf32(input.data(), input.data() + input.size()); + _data = antlrcpp::utf8_to_utf32(data, data + length); p = 0; } -#endif void ANTLRInputStream::load(std::istream &stream) { if (!stream.good() || stream.eof()) // No fail, bad or EOF. @@ -66,7 +60,7 @@ void ANTLRInputStream::load(std::istream &stream) { _data.clear(); std::string s((std::istreambuf_iterator(stream)), std::istreambuf_iterator()); - load(s); + load(s.data(), s.length()); } void ANTLRInputStream::reset() { diff --git a/runtime/Cpp/runtime/src/ANTLRInputStream.h b/runtime/Cpp/runtime/src/ANTLRInputStream.h index 2b28b2092..fdf857e3e 100755 --- a/runtime/Cpp/runtime/src/ANTLRInputStream.h +++ b/runtime/Cpp/runtime/src/ANTLRInputStream.h @@ -25,18 +25,18 @@ namespace antlr4 { /// What is name or source of this char stream? std::string name; + ANTLRInputStream(); + #if __cplusplus >= 201703L - ANTLRInputStream(std::string_view input = ""); + ANTLRInputStream(const std::string_view &input); #endif - ANTLRInputStream(const std::string &input = ""); - ANTLRInputStream(const char data_[], size_t numberOfActualCharsInArray); + + ANTLRInputStream(const std::string &input); + ANTLRInputStream(const char *data, size_t length); ANTLRInputStream(std::istream &stream); -#if __cplusplus >= 201703L - virtual void load(std::string_view input); -#else virtual void load(const std::string &input); -#endif + virtual void load(const char *data, size_t length); virtual void load(std::istream &stream); /// Reset the stream so that it's in the same state it was