From a07045fcc7b5e51385584bd80a89e4a08ba21c16 Mon Sep 17 00:00:00 2001 From: Martin Michelsen Date: Wed, 24 Apr 2024 21:13:22 -0700 Subject: [PATCH] add strip_multiline_comments --- src/Strings.hh | 30 ++++++++++++++++++++++++++++++ src/StringsTest.cc | 17 ++++++++++++++++- 2 files changed, 46 insertions(+), 1 deletion(-) diff --git a/src/Strings.hh b/src/Strings.hh index ebc770e..289ecc0 100644 --- a/src/Strings.hh +++ b/src/Strings.hh @@ -73,6 +73,36 @@ void strip_whitespace(StrT& s) { } } +template +void strip_multiline_comments(StrT& s, bool allow_unterminated = false) { + bool is_in_comment = false; + size_t write_offset = 0; + for (size_t z = 0; z < s.size();) { + if (!is_in_comment) { + if ((s[z] == '/') && (z + 1 < s.size()) && (s[z + 1] == '*')) { + is_in_comment = true; + z += 2; + } else { + s[write_offset++] = s[z++]; + } + } else { + if ((s[z] == '*') && (z + 1 < s.size()) && (s[z + 1] == '/')) { + is_in_comment = false; + z += 2; + } else { + if (s[z++] == '\n') { + s[write_offset++] = '\n'; + } + } + } + } + s.resize(write_offset); + + if (!allow_unterminated && is_in_comment) { + throw std::runtime_error("unterminated multiline comment"); + } +} + std::string escape_quotes(const std::string& s); std::string escape_url(const std::string& s, bool escape_slash = false); diff --git a/src/StringsTest.cc b/src/StringsTest.cc index 213eda1..aa13c6b 100644 --- a/src/StringsTest.cc +++ b/src/StringsTest.cc @@ -490,7 +490,6 @@ int main(int, char**) { string s = "abcdef"; strip_whitespace(s); - fprintf(stderr, "%s\n", s.c_str()); expect_eq(s, "abcdef"); s = "abcdef\r\n"; @@ -514,6 +513,22 @@ int main(int, char**) { expect_eq(s, ""); } + { + fprintf(stderr, "-- strip_multiline_comments\n"); + + string s = "abc/*def*/ghi"; + strip_multiline_comments(s); + expect_eq(s, "abcghi"); + + s = "/*abc*/def\r\n"; + strip_multiline_comments(s); + expect_eq(s, "def\r\n"); + + s = "abc\n/*def\nghi*/\njkl"; + strip_multiline_comments(s); + expect_eq(s, "abc\n\n\njkl"); + } + { fprintf(stderr, "-- string_printf\n"); string result = string_printf("%s %" PRIu64 " 0x%04hX", "lolz",