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 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 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 {
|
namespace util {
|
||||||
template<typename R>
|
template<typename R>
|
||||||
inline R &&escape_string(R &&writer, ostd::string_range str) {
|
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>
|
template<typename R>
|
||||||
inline void print_stack(R &&writer, cs_stack_state const &st) {
|
inline void print_stack(R &&writer, cs_stack_state const &st) {
|
||||||
auto nd = st.get();
|
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 */
|
} /* namespace cscript */
|
||||||
|
|
26
src/cs_vm.cc
26
src/cs_vm.cc
|
@ -465,10 +465,8 @@ static inline void callcommand(
|
||||||
break;
|
break;
|
||||||
case 'C': {
|
case 'C': {
|
||||||
i = std::max(i + 1, numargs);
|
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};
|
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);
|
cs_cmd_internal::call(cs, id, cs_value_r(&tv, &tv + 1), res);
|
||||||
return;
|
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;
|
int callargs = (op >> 8) & 0x1F, offset = numargs - callargs;
|
||||||
result.force_none();
|
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};
|
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);
|
cs_cmd_internal::call(cs, id, cs_value_r(&tv, &tv + 1), result);
|
||||||
}
|
}
|
||||||
force_arg(result, op & CS_CODE_RET_MASK);
|
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_FLOAT:
|
||||||
case CS_CODE_CONC_W | CS_RET_INT: {
|
case CS_CODE_CONC_W | CS_RET_INT: {
|
||||||
int numconc = op >> 8;
|
int numconc = op >> 8;
|
||||||
auto buf = ostd::appender<cs_string>();
|
auto buf = value_list_concat(
|
||||||
cscript::util::tvals_concat(
|
cs, ostd::iter(&args[numargs - numconc], &args[numargs]),
|
||||||
buf, ostd::iter(&args[numargs - numconc], &args[numargs]),
|
|
||||||
((op & CS_CODE_OP_MASK) == CS_CODE_CONC) ? " " : ""
|
((op & CS_CODE_OP_MASK) == CS_CODE_CONC) ? " " : ""
|
||||||
);
|
);
|
||||||
numargs = numargs - numconc;
|
numargs = numargs - numconc;
|
||||||
args[numargs].set_str(buf.get());
|
args[numargs].set_str(buf);
|
||||||
force_arg(args[numargs], op & CS_CODE_RET_MASK);
|
force_arg(args[numargs], op & CS_CODE_RET_MASK);
|
||||||
numargs++;
|
numargs++;
|
||||||
continue;
|
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_FLOAT:
|
||||||
case CS_CODE_CONC_M | CS_RET_INT: {
|
case CS_CODE_CONC_M | CS_RET_INT: {
|
||||||
int numconc = op >> 8;
|
int numconc = op >> 8;
|
||||||
auto buf = ostd::appender<cs_string>();
|
auto buf = value_list_concat(
|
||||||
cscript::util::tvals_concat(
|
cs, ostd::iter(&args[numargs - numconc], &args[numargs])
|
||||||
buf, ostd::iter(&args[numargs - numconc], &args[numargs])
|
|
||||||
);
|
);
|
||||||
numargs = numargs - numconc;
|
numargs = numargs - numconc;
|
||||||
result.set_str(buf.get());
|
result.set_str(buf);
|
||||||
force_arg(result, op & CS_CODE_RET_MASK);
|
force_arg(result, op & CS_CODE_RET_MASK);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
|
@ -84,16 +84,12 @@ void cs_init_lib_string(cs_state &cs) {
|
||||||
res.set_str(s.get());
|
res.set_str(s.get());
|
||||||
});
|
});
|
||||||
|
|
||||||
cs.new_command("concat", "V", [](auto &, auto args, auto &res) {
|
cs.new_command("concat", "V", [](auto &ccs, auto args, auto &res) {
|
||||||
auto s = ostd::appender<cs_string>();
|
res.set_str(value_list_concat(ccs, args, " "));
|
||||||
cscript::util::tvals_concat(s, args, " ");
|
|
||||||
res.set_str(s.get());
|
|
||||||
});
|
});
|
||||||
|
|
||||||
cs.new_command("concatword", "V", [](auto &, auto args, auto &res) {
|
cs.new_command("concatword", "V", [](auto &ccs, auto args, auto &res) {
|
||||||
auto s = ostd::appender<cs_string>();
|
res.set_str(value_list_concat(ccs, args));
|
||||||
cscript::util::tvals_concat(s, args);
|
|
||||||
res.set_str(s.get());
|
|
||||||
});
|
});
|
||||||
|
|
||||||
cs.new_command("format", "V", [](auto &, auto args, auto &res) {
|
cs.new_command("format", "V", [](auto &, auto args, auto &res) {
|
||||||
|
|
Loading…
Reference in New Issue