get rid of tvals_concat in favor of simpler api

master
Daniel Kolesa 2021-03-19 00:30:54 +01:00
parent 64d9c0e749
commit 26bcc43578
4 changed files with 42 additions and 59 deletions

View File

@ -662,6 +662,10 @@ OSTD_EXPORT std::size_t list_count(cs_list_parse_state &ps, cs_state &cs);
OSTD_EXPORT cs_strref list_get_item(cs_list_parse_state &ps, cs_state &cs);
OSTD_EXPORT void list_find_item(cs_list_parse_state &ps);
OSTD_EXPORT cs_strref value_list_concat(
cs_state &cs, cs_value_r vals, ostd::string_range sep = ostd::string_range{}
);
namespace util {
template<typename R>
inline R &&escape_string(R &&writer, ostd::string_range str) {
@ -777,41 +781,6 @@ namespace util {
}
}
template<typename R>
inline void tvals_concat(
R &&writer, cs_value_r vals,
ostd::string_range sep = ostd::string_range()
) {
for (size_t i = 0; i < vals.size(); ++i) {
switch (vals[i].get_type()) {
case cs_value_type::INT: {
format_int(
std::forward<R>(writer), vals[i].get_int()
);
break;
}
case cs_value_type::FLOAT: {
format_float(
std::forward<R>(writer), vals[i].get_float()
);
break;
}
case cs_value_type::STRING: {
ostd::range_put_all(
writer, ostd::string_range{vals[i].get_str()}
);
break;
}
default:
break;
}
if (i == (vals.size() - 1)) {
break;
}
ostd::range_put_all(writer, sep);
}
}
template<typename R>
inline void print_stack(R &&writer, cs_stack_state const &st) {
auto nd = st.get();

View File

@ -473,4 +473,28 @@ OSTD_EXPORT void list_find_item(cs_list_parse_state &ps) {
}
}
OSTD_EXPORT cs_strref value_list_concat(
cs_state &cs, cs_value_r vals, ostd::string_range sep
) {
auto app = ostd::appender<cs_string>();
for (std::size_t i = 0; i < vals.size(); ++i) {
switch (vals[i].get_type()) {
case cs_value_type::INT:
case cs_value_type::FLOAT:
case cs_value_type::STRING: {
cs_value v{vals[i]};
ostd::range_put_all(app, cs_value{vals[i]}.force_str());
break;
}
default:
break;
}
if (i == (vals.size() - 1)) {
break;
}
ostd::range_put_all(app, sep);
}
return cs_strref{cs, ostd::iter(app.get())};
}
} /* namespace cscript */

View File

@ -465,10 +465,8 @@ static inline void callcommand(
break;
case 'C': {
i = std::max(i + 1, numargs);
auto buf = ostd::appender<cs_string>();
cscript::util::tvals_concat(buf, ostd::iter(args, args + i), " ");
cs_value tv{cs};
tv.set_str(buf.get());
tv.set_str(value_list_concat(cs, ostd::iter(args, args + i), " "));
cs_cmd_internal::call(cs, id, cs_value_r(&tv, &tv + 1), res);
return;
}
@ -1381,12 +1379,10 @@ static uint32_t *runcode(cs_state &cs, uint32_t *code, cs_value &result) {
int callargs = (op >> 8) & 0x1F, offset = numargs - callargs;
result.force_none();
{
auto buf = ostd::appender<cs_string>();
cscript::util::tvals_concat(buf, ostd::iter(
&args[offset], &args[offset + callargs]
), " ");
cs_value tv{cs};
tv.set_str(buf.get());
tv.set_str(value_list_concat(cs, ostd::iter(
&args[offset], &args[offset + callargs]
), " "));
cs_cmd_internal::call(cs, id, cs_value_r(&tv, &tv + 1), result);
}
force_arg(result, op & CS_CODE_RET_MASK);
@ -1403,13 +1399,12 @@ static uint32_t *runcode(cs_state &cs, uint32_t *code, cs_value &result) {
case CS_CODE_CONC_W | CS_RET_FLOAT:
case CS_CODE_CONC_W | CS_RET_INT: {
int numconc = op >> 8;
auto buf = ostd::appender<cs_string>();
cscript::util::tvals_concat(
buf, ostd::iter(&args[numargs - numconc], &args[numargs]),
auto buf = value_list_concat(
cs, ostd::iter(&args[numargs - numconc], &args[numargs]),
((op & CS_CODE_OP_MASK) == CS_CODE_CONC) ? " " : ""
);
numargs = numargs - numconc;
args[numargs].set_str(buf.get());
args[numargs].set_str(buf);
force_arg(args[numargs], op & CS_CODE_RET_MASK);
numargs++;
continue;
@ -1420,12 +1415,11 @@ static uint32_t *runcode(cs_state &cs, uint32_t *code, cs_value &result) {
case CS_CODE_CONC_M | CS_RET_FLOAT:
case CS_CODE_CONC_M | CS_RET_INT: {
int numconc = op >> 8;
auto buf = ostd::appender<cs_string>();
cscript::util::tvals_concat(
buf, ostd::iter(&args[numargs - numconc], &args[numargs])
auto buf = value_list_concat(
cs, ostd::iter(&args[numargs - numconc], &args[numargs])
);
numargs = numargs - numconc;
result.set_str(buf.get());
result.set_str(buf);
force_arg(result, op & CS_CODE_RET_MASK);
continue;
}

View File

@ -84,16 +84,12 @@ void cs_init_lib_string(cs_state &cs) {
res.set_str(s.get());
});
cs.new_command("concat", "V", [](auto &, auto args, auto &res) {
auto s = ostd::appender<cs_string>();
cscript::util::tvals_concat(s, args, " ");
res.set_str(s.get());
cs.new_command("concat", "V", [](auto &ccs, auto args, auto &res) {
res.set_str(value_list_concat(ccs, args, " "));
});
cs.new_command("concatword", "V", [](auto &, auto args, auto &res) {
auto s = ostd::appender<cs_string>();
cscript::util::tvals_concat(s, args);
res.set_str(s.get());
cs.new_command("concatword", "V", [](auto &ccs, auto args, auto &res) {
res.set_str(value_list_concat(ccs, args));
});
cs.new_command("format", "V", [](auto &, auto args, auto &res) {