drop the util namespace
parent
4b6c284ea1
commit
4b766a380f
|
@ -886,105 +886,106 @@ private:
|
||||||
std::string_view p_quoted_item{};
|
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<cs_value> vals,
|
cs_state &cs, std::span<cs_value> vals,
|
||||||
std::string_view sep = std::string_view{}
|
std::string_view sep = std::string_view{}
|
||||||
);
|
);
|
||||||
|
|
||||||
namespace util {
|
template<typename R>
|
||||||
template<typename R>
|
inline R cs_escape_string(R writer, std::string_view str) {
|
||||||
inline R escape_string(R writer, std::string_view str) {
|
*writer++ = '"';
|
||||||
*writer++ = '"';
|
for (auto c: str) {
|
||||||
for (auto c: str) {
|
switch (c) {
|
||||||
switch (c) {
|
case '\n': *writer++ = '^'; *writer++ = 'n'; break;
|
||||||
case '\n': *writer++ = '^'; *writer++ = 'n'; break;
|
case '\t': *writer++ = '^'; *writer++ = 't'; break;
|
||||||
case '\t': *writer++ = '^'; *writer++ = 't'; break;
|
case '\f': *writer++ = '^'; *writer++ = 'f'; break;
|
||||||
case '\f': *writer++ = '^'; *writer++ = 'f'; break;
|
case '"': *writer++ = '^'; *writer++ = '"'; break;
|
||||||
case '"': *writer++ = '^'; *writer++ = '"'; break;
|
case '^': *writer++ = '^'; *writer++ = '^'; break;
|
||||||
case '^': *writer++ = '^'; *writer++ = '^'; break;
|
default: *writer++ = c; break;
|
||||||
default: *writer++ = c; break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
*writer++ = '"';
|
|
||||||
return writer;
|
|
||||||
}
|
}
|
||||||
|
*writer++ = '"';
|
||||||
|
return writer;
|
||||||
|
}
|
||||||
|
|
||||||
template<typename R>
|
template<typename R>
|
||||||
inline R unescape_string(R writer, std::string_view str) {
|
inline R cs_unescape_string(R writer, std::string_view str) {
|
||||||
for (auto it = str.begin(); it != str.end(); ++it) {
|
for (auto it = str.begin(); it != str.end(); ++it) {
|
||||||
if (*it == '^') {
|
if (*it == '^') {
|
||||||
++it;
|
++it;
|
||||||
if (it == str.end()) {
|
if (it == str.end()) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
switch (*it) {
|
switch (*it) {
|
||||||
case 'n': *writer++ = '\n'; break;
|
case 'n': *writer++ = '\n'; break;
|
||||||
case 't': *writer++ = '\r'; break;
|
case 't': *writer++ = '\r'; break;
|
||||||
case 'f': *writer++ = '\f'; break;
|
case 'f': *writer++ = '\f'; break;
|
||||||
case '"': *writer++ = '"'; break;
|
case '"': *writer++ = '"'; break;
|
||||||
case '^': *writer++ = '^'; break;
|
case '^': *writer++ = '^'; break;
|
||||||
default: *writer++ = *it; break;
|
default: *writer++ = *it; break;
|
||||||
}
|
}
|
||||||
} else if (*it == '\\') {
|
} else if (*it == '\\') {
|
||||||
++it;
|
++it;
|
||||||
if (it == str.end()) {
|
if (it == str.end()) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
char c = *it;
|
char c = *it;
|
||||||
if ((c == '\r') || (c == '\n')) {
|
if ((c == '\r') || (c == '\n')) {
|
||||||
if ((c == '\r') && ((it + 1) != str.end())) {
|
if ((c == '\r') && ((it + 1) != str.end())) {
|
||||||
if (it[1] == '\n') {
|
if (it[1] == '\n') {
|
||||||
++it;
|
++it;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
continue;
|
|
||||||
}
|
}
|
||||||
*writer++ = '\\';
|
continue;
|
||||||
} else {
|
|
||||||
*writer++ = *it;
|
|
||||||
}
|
}
|
||||||
|
*writer++ = '\\';
|
||||||
|
} else {
|
||||||
|
*writer++ = *it;
|
||||||
}
|
}
|
||||||
return writer;
|
|
||||||
}
|
}
|
||||||
|
return writer;
|
||||||
|
}
|
||||||
|
|
||||||
LIBCUBESCRIPT_EXPORT char const *parse_string(
|
template<typename R>
|
||||||
cs_state &cs, std::string_view str, size_t &nlines
|
inline R cs_print_stack(R writer, cs_stack_state const &st) {
|
||||||
);
|
char buf[32] = {0};
|
||||||
|
auto nd = st.get();
|
||||||
inline char const *parse_string(
|
while (nd) {
|
||||||
cs_state &cs, std::string_view str
|
auto name = nd->id->get_name();
|
||||||
) {
|
*writer++ = ' ';
|
||||||
size_t nlines;
|
*writer++ = ' ';
|
||||||
return parse_string(cs, str, nlines);
|
if ((nd->index == 1) && st.gap()) {
|
||||||
}
|
*writer++ = '.';
|
||||||
|
*writer++ = '.';
|
||||||
LIBCUBESCRIPT_EXPORT char const *parse_word(cs_state &cs, std::string_view str);
|
}
|
||||||
|
snprintf(buf, sizeof(buf), "%d", nd->index);
|
||||||
template<typename R>
|
char const *p = buf;
|
||||||
inline R print_stack(R writer, cs_stack_state const &st) {
|
std::copy(p, p + strlen(p), writer);
|
||||||
char buf[32] = {0};
|
*writer++ = ')';
|
||||||
auto nd = st.get();
|
std::copy(name.begin(), name.end(), writer);
|
||||||
while (nd) {
|
nd = nd->next;
|
||||||
auto name = nd->id->get_name();
|
if (nd) {
|
||||||
*writer++ = ' ';
|
*writer++ = '\n';
|
||||||
*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 */
|
} /* namespace cscript */
|
||||||
|
|
||||||
|
|
|
@ -22,7 +22,7 @@ std::string_view cs_gen_state::get_str() {
|
||||||
|
|
||||||
cs_charbuf cs_gen_state::get_str_dup() {
|
cs_charbuf cs_gen_state::get_str_dup() {
|
||||||
cs_charbuf buf{cs};
|
cs_charbuf buf{cs};
|
||||||
util::unescape_string(std::back_inserter(buf), get_str());
|
cs_unescape_string(std::back_inserter(buf), get_str());
|
||||||
return buf;
|
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);
|
size_t bufs = (gs.code.capacity() - gs.code.size()) * sizeof(uint32_t);
|
||||||
auto alloc = cs_allocator<char>{gs.cs};
|
auto alloc = cs_allocator<char>{gs.cs};
|
||||||
auto *buf = alloc.allocate(bufs + 1);
|
auto *buf = alloc.allocate(bufs + 1);
|
||||||
char *wbuf = util::unescape_string(&buf[0], str);
|
char *wbuf = cs_unescape_string(&buf[0], str);
|
||||||
memset(
|
memset(
|
||||||
&buf[wbuf - buf], 0,
|
&buf[wbuf - buf], 0,
|
||||||
sizeof(uint32_t) - (wbuf - buf) % sizeof(uint32_t)
|
sizeof(uint32_t) - (wbuf - buf) % sizeof(uint32_t)
|
||||||
|
|
|
@ -203,7 +203,7 @@ LIBCUBESCRIPT_EXPORT std::size_t cs_list_parser::count() {
|
||||||
LIBCUBESCRIPT_EXPORT cs_strref cs_list_parser::get_item() const {
|
LIBCUBESCRIPT_EXPORT cs_strref cs_list_parser::get_item() const {
|
||||||
if (!p_quoted_item.empty() && (p_quoted_item.front() == '"')) {
|
if (!p_quoted_item.empty() && (p_quoted_item.front() == '"')) {
|
||||||
cs_charbuf buf{*p_state};
|
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, buf.str()};
|
||||||
}
|
}
|
||||||
return cs_strref{*p_state, p_item};
|
return cs_strref{*p_state, p_item};
|
||||||
|
|
|
@ -1093,7 +1093,7 @@ void cs_init_lib_base(cs_state &gcs) {
|
||||||
result.set_str(e.what());
|
result.set_str(e.what());
|
||||||
if (e.get_stack().get()) {
|
if (e.get_stack().get()) {
|
||||||
cs_charbuf buf{cs};
|
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());
|
tback.set_str(buf.str());
|
||||||
}
|
}
|
||||||
rc = false;
|
rc = false;
|
||||||
|
|
|
@ -437,7 +437,7 @@ end:
|
||||||
for (p.set_input(s); p.parse(); ++n) {
|
for (p.set_input(s); p.parse(); ++n) {
|
||||||
auto qi = p.get_quoted_item();
|
auto qi = p.get_quoted_item();
|
||||||
if (!qi.empty() && (qi.front() == '"')) {
|
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 {
|
} else {
|
||||||
buf.append(p.get_raw_item());
|
buf.append(p.get_raw_item());
|
||||||
}
|
}
|
||||||
|
|
|
@ -79,13 +79,13 @@ void cs_init_lib_string(cs_state &cs) {
|
||||||
|
|
||||||
cs.new_command("escape", "s", [](auto &ccs, auto args, auto &res) {
|
cs.new_command("escape", "s", [](auto &ccs, auto args, auto &res) {
|
||||||
cs_charbuf s{ccs};
|
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());
|
res.set_str(s.str());
|
||||||
});
|
});
|
||||||
|
|
||||||
cs.new_command("unescape", "s", [](auto &ccs, auto args, auto &res) {
|
cs.new_command("unescape", "s", [](auto &ccs, auto args, auto &res) {
|
||||||
cs_charbuf s{ccs};
|
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());
|
res.set_str(s.str());
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
@ -299,7 +299,7 @@ static bool do_call(cs_state &cs, std::string_view line, bool file = false) {
|
||||||
);
|
);
|
||||||
if (e.get_stack().get()) {
|
if (e.get_stack().get()) {
|
||||||
std::string str;
|
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());
|
std::printf("%s\n", str.data());
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
|
|
Loading…
Reference in New Issue