diff --git a/include/cubescript/cubescript.hh b/include/cubescript/cubescript.hh index d3adefc..f122442 100644 --- a/include/cubescript/cubescript.hh +++ b/include/cubescript/cubescript.hh @@ -886,105 +886,106 @@ private: std::string_view p_quoted_item{}; }; -LIBCUBESCRIPT_EXPORT cs_strref value_list_concat( + +LIBCUBESCRIPT_EXPORT char const *cs_parse_string( + cs_state &cs, std::string_view str, size_t &nlines +); + +inline char const *cs_parse_string( + cs_state &cs, std::string_view str +) { + size_t nlines; + return cs_parse_string(cs, str, nlines); +} + +LIBCUBESCRIPT_EXPORT char const *cs_parse_word( + cs_state &cs, std::string_view str +); + +LIBCUBESCRIPT_EXPORT cs_strref cs_concat_values( cs_state &cs, std::span vals, std::string_view sep = std::string_view{} ); -namespace util { - template - inline R escape_string(R writer, std::string_view str) { - *writer++ = '"'; - for (auto c: str) { - switch (c) { - case '\n': *writer++ = '^'; *writer++ = 'n'; break; - case '\t': *writer++ = '^'; *writer++ = 't'; break; - case '\f': *writer++ = '^'; *writer++ = 'f'; break; - case '"': *writer++ = '^'; *writer++ = '"'; break; - case '^': *writer++ = '^'; *writer++ = '^'; break; - default: *writer++ = c; break; - } +template +inline R cs_escape_string(R writer, std::string_view str) { + *writer++ = '"'; + for (auto c: str) { + switch (c) { + case '\n': *writer++ = '^'; *writer++ = 'n'; break; + case '\t': *writer++ = '^'; *writer++ = 't'; break; + case '\f': *writer++ = '^'; *writer++ = 'f'; break; + case '"': *writer++ = '^'; *writer++ = '"'; break; + case '^': *writer++ = '^'; *writer++ = '^'; break; + default: *writer++ = c; break; } - *writer++ = '"'; - return writer; } + *writer++ = '"'; + return writer; +} - template - inline R unescape_string(R writer, std::string_view str) { - for (auto it = str.begin(); it != str.end(); ++it) { - if (*it == '^') { - ++it; - if (it == str.end()) { - break; - } - switch (*it) { - case 'n': *writer++ = '\n'; break; - case 't': *writer++ = '\r'; break; - case 'f': *writer++ = '\f'; break; - case '"': *writer++ = '"'; break; - case '^': *writer++ = '^'; break; - default: *writer++ = *it; break; - } - } else if (*it == '\\') { - ++it; - if (it == str.end()) { - break; - } - char c = *it; - if ((c == '\r') || (c == '\n')) { - if ((c == '\r') && ((it + 1) != str.end())) { - if (it[1] == '\n') { - ++it; - } +template +inline R cs_unescape_string(R writer, std::string_view str) { + for (auto it = str.begin(); it != str.end(); ++it) { + if (*it == '^') { + ++it; + if (it == str.end()) { + break; + } + switch (*it) { + case 'n': *writer++ = '\n'; break; + case 't': *writer++ = '\r'; break; + case 'f': *writer++ = '\f'; break; + case '"': *writer++ = '"'; break; + case '^': *writer++ = '^'; break; + default: *writer++ = *it; break; + } + } else if (*it == '\\') { + ++it; + if (it == str.end()) { + break; + } + char c = *it; + if ((c == '\r') || (c == '\n')) { + if ((c == '\r') && ((it + 1) != str.end())) { + if (it[1] == '\n') { + ++it; } - continue; } - *writer++ = '\\'; - } else { - *writer++ = *it; + continue; } + *writer++ = '\\'; + } else { + *writer++ = *it; } - return writer; } + return writer; +} - LIBCUBESCRIPT_EXPORT char const *parse_string( - cs_state &cs, std::string_view str, size_t &nlines - ); - - inline char const *parse_string( - cs_state &cs, std::string_view str - ) { - size_t nlines; - return parse_string(cs, str, nlines); - } - - LIBCUBESCRIPT_EXPORT char const *parse_word(cs_state &cs, std::string_view str); - - template - inline R print_stack(R writer, cs_stack_state const &st) { - char buf[32] = {0}; - auto nd = st.get(); - while (nd) { - auto name = nd->id->get_name(); - *writer++ = ' '; - *writer++ = ' '; - if ((nd->index == 1) && st.gap()) { - *writer++ = '.'; - *writer++ = '.'; - } - snprintf(buf, sizeof(buf), "%d", nd->index); - char const *p = buf; - std::copy(p, p + strlen(p), writer); - *writer++ = ')'; - std::copy(name.begin(), name.end(), writer); - nd = nd->next; - if (nd) { - *writer++ = '\n'; - } +template +inline R cs_print_stack(R writer, cs_stack_state const &st) { + char buf[32] = {0}; + auto nd = st.get(); + while (nd) { + auto name = nd->id->get_name(); + *writer++ = ' '; + *writer++ = ' '; + if ((nd->index == 1) && st.gap()) { + *writer++ = '.'; + *writer++ = '.'; + } + snprintf(buf, sizeof(buf), "%d", nd->index); + char const *p = buf; + std::copy(p, p + strlen(p), writer); + *writer++ = ')'; + std::copy(name.begin(), name.end(), writer); + nd = nd->next; + if (nd) { + *writer++ = '\n'; } - return writer; } -} /* namespace util */ + return writer; +} } /* namespace cscript */ diff --git a/src/cs_gen.cc b/src/cs_gen.cc index 8173220..95d1693 100644 --- a/src/cs_gen.cc +++ b/src/cs_gen.cc @@ -22,7 +22,7 @@ std::string_view cs_gen_state::get_str() { cs_charbuf cs_gen_state::get_str_dup() { cs_charbuf buf{cs}; - util::unescape_string(std::back_inserter(buf), get_str()); + cs_unescape_string(std::back_inserter(buf), get_str()); return buf; } @@ -200,7 +200,7 @@ static inline void compileunescapestr(cs_gen_state &gs) { size_t bufs = (gs.code.capacity() - gs.code.size()) * sizeof(uint32_t); auto alloc = cs_allocator{gs.cs}; auto *buf = alloc.allocate(bufs + 1); - char *wbuf = util::unescape_string(&buf[0], str); + char *wbuf = cs_unescape_string(&buf[0], str); memset( &buf[wbuf - buf], 0, sizeof(uint32_t) - (wbuf - buf) % sizeof(uint32_t) diff --git a/src/cs_parser.cc b/src/cs_parser.cc index d0b6083..0512794 100644 --- a/src/cs_parser.cc +++ b/src/cs_parser.cc @@ -203,7 +203,7 @@ LIBCUBESCRIPT_EXPORT std::size_t cs_list_parser::count() { LIBCUBESCRIPT_EXPORT cs_strref cs_list_parser::get_item() const { if (!p_quoted_item.empty() && (p_quoted_item.front() == '"')) { cs_charbuf buf{*p_state}; - util::unescape_string(std::back_inserter(buf), p_item); + cs_unescape_string(std::back_inserter(buf), p_item); return cs_strref{*p_state, buf.str()}; } return cs_strref{*p_state, p_item}; diff --git a/src/cubescript.cc b/src/cubescript.cc index 3487168..6fc39ff 100644 --- a/src/cubescript.cc +++ b/src/cubescript.cc @@ -1093,7 +1093,7 @@ void cs_init_lib_base(cs_state &gcs) { result.set_str(e.what()); if (e.get_stack().get()) { cs_charbuf buf{cs}; - util::print_stack(std::back_inserter(buf), e.get_stack()); + cs_print_stack(std::back_inserter(buf), e.get_stack()); tback.set_str(buf.str()); } rc = false; diff --git a/src/lib_list.cc b/src/lib_list.cc index cb5c56a..3790d70 100644 --- a/src/lib_list.cc +++ b/src/lib_list.cc @@ -437,7 +437,7 @@ end: for (p.set_input(s); p.parse(); ++n) { auto qi = p.get_quoted_item(); if (!qi.empty() && (qi.front() == '"')) { - util::unescape_string(std::back_inserter(buf), p.get_raw_item()); + cs_unescape_string(std::back_inserter(buf), p.get_raw_item()); } else { buf.append(p.get_raw_item()); } diff --git a/src/lib_str.cc b/src/lib_str.cc index 9b2e19d..d8b8da4 100644 --- a/src/lib_str.cc +++ b/src/lib_str.cc @@ -79,13 +79,13 @@ void cs_init_lib_string(cs_state &cs) { cs.new_command("escape", "s", [](auto &ccs, auto args, auto &res) { cs_charbuf s{ccs}; - util::escape_string(std::back_inserter(s), args[0].get_str()); + cs_escape_string(std::back_inserter(s), args[0].get_str()); res.set_str(s.str()); }); cs.new_command("unescape", "s", [](auto &ccs, auto args, auto &res) { cs_charbuf s{ccs}; - util::unescape_string(std::back_inserter(s), args[0].get_str()); + cs_unescape_string(std::back_inserter(s), args[0].get_str()); res.set_str(s.str()); }); diff --git a/tools/repl.cc b/tools/repl.cc index c181061..4beb6a7 100644 --- a/tools/repl.cc +++ b/tools/repl.cc @@ -299,7 +299,7 @@ static bool do_call(cs_state &cs, std::string_view line, bool file = false) { ); if (e.get_stack().get()) { std::string str; - cscript::util::print_stack(std::back_inserter(str), e.get_stack()); + cscript::cs_print_stack(std::back_inserter(str), e.get_stack()); std::printf("%s\n", str.data()); } return false;