get rid of tvals_concat in favor of simpler api
parent
64d9c0e749
commit
26bcc43578
|
@ -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();
|
||||
|
|
|
@ -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 */
|
||||
|
|
26
src/cs_vm.cc
26
src/cs_vm.cc
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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) {
|
||||
|
|
Loading…
Reference in New Issue