diff --git a/include/cubescript/cubescript.hh b/include/cubescript/cubescript.hh index 86ded0b..9e8a827 100644 --- a/include/cubescript/cubescript.hh +++ b/include/cubescript/cubescript.hh @@ -666,8 +666,12 @@ struct LIBCUBESCRIPT_EXPORT list_parser { string_ref get_item() const; - std::string_view get_raw_item() const { return p_item; } - std::string_view get_quoted_item() const { return p_quoted_item; } + std::string_view get_raw_item() const { + return std::string_view{p_ibeg, p_iend}; + } + std::string_view get_quoted_item() const { + return std::string_view{p_qbeg, p_qend}; + } void skip_until_item(); @@ -675,8 +679,8 @@ private: state *p_state; char const *p_input_beg, *p_input_end; - std::string_view p_item{}; - std::string_view p_quoted_item{}; + char const *p_ibeg{}, *p_iend{}; + char const *p_qbeg{}, *p_qend{}; }; diff --git a/src/cs_parser.cc b/src/cs_parser.cc index faf22e0..4f8d1e3 100644 --- a/src/cs_parser.cc +++ b/src/cs_parser.cc @@ -318,8 +318,10 @@ LIBCUBESCRIPT_EXPORT bool list_parser::parse() { case '"': { char const *qi = p_input_beg; p_input_beg = parse_string(*p_state, get_input()); - p_quoted_item = std::string_view{qi, p_input_beg}; - p_item = p_quoted_item.substr(1, p_quoted_item.size() - 2); + p_qbeg = qi; + p_qend = p_input_beg; + p_ibeg = p_qbeg + 1; + p_iend = p_qend - 1; break; } case '(': @@ -369,8 +371,10 @@ LIBCUBESCRIPT_EXPORT bool list_parser::parse() { } } endblock: - p_item = std::string_view{ibeg + 1, p_input_beg - 1}; - p_quoted_item = std::string_view{ibeg, p_input_beg}; + p_ibeg = ibeg + 1; + p_iend = p_input_beg - 1; + p_qbeg = ibeg; + p_qend = p_input_beg; break; } case ')': @@ -378,7 +382,8 @@ endblock: return false; default: { char const *e = parse_word(*p_state, get_input()); - p_quoted_item = p_item = std::string_view{p_input_beg, e}; + p_ibeg = p_qbeg = p_input_beg; + p_iend = p_qend = e; p_input_beg = e; break; } @@ -399,12 +404,12 @@ LIBCUBESCRIPT_EXPORT std::size_t list_parser::count() { } LIBCUBESCRIPT_EXPORT string_ref list_parser::get_item() const { - if (!p_quoted_item.empty() && (p_quoted_item.front() == '"')) { + if ((p_qbeg != p_qend) && (*p_qbeg == '"')) { charbuf buf{*p_state}; - unescape_string(std::back_inserter(buf), p_item); + unescape_string(std::back_inserter(buf), get_raw_item()); return string_ref{*p_state, buf.str()}; } - return string_ref{*p_state, p_item}; + return string_ref{*p_state, get_raw_item()}; } LIBCUBESCRIPT_EXPORT void list_parser::skip_until_item() {