diff --git a/include/cubescript/cubescript.hh b/include/cubescript/cubescript.hh
index 9870c3f7..9990b4fa 100644
--- a/include/cubescript/cubescript.hh
+++ b/include/cubescript/cubescript.hh
@@ -536,9 +536,9 @@ struct cs_error {
try {
char fbuf[512];
auto ret = ostd::format(
- ostd::char_range(fbuf, fbuf + sizeof(fbuf)), msg,
- std::forward(args)...
- );
+ ostd::range_counter(ostd::char_range(fbuf, fbuf + sizeof(fbuf))),
+ msg, std::forward(args)...
+ ).get_written();
p_errmsg = save_msg(cs, ostd::char_range(fbuf, fbuf + ret));
} catch (...) {
p_errmsg = save_msg(cs, msg);
@@ -582,38 +582,36 @@ private:
namespace util {
template
- inline size_t escape_string(R &&writer, ostd::string_range str) {
- size_t ret = 2;
+ inline R &&escape_string(R &&writer, ostd::string_range str) {
writer.put('"');
for (; !str.empty(); str.pop_front()) {
switch (str.front()) {
case '\n':
- ret += ostd::range_put_n(writer, "^n", 2);
+ writer = ostd::copy(ostd::string_range{"^n"}, writer);
break;
case '\t':
- ret += ostd::range_put_n(writer, "^t", 2);
+ writer = ostd::copy(ostd::string_range{"^t"}, writer);
break;
case '\f':
- ret += ostd::range_put_n(writer, "^f", 2);
+ writer = ostd::copy(ostd::string_range{"^f"}, writer);
break;
case '"':
- ret += ostd::range_put_n(writer, "^\"", 2);
+ writer = ostd::copy(ostd::string_range{"^\""}, writer);
break;
case '^':
- ret += ostd::range_put_n(writer, "^^", 2);
+ writer = ostd::copy(ostd::string_range{"^^"}, writer);
break;
default:
- ret += writer.put(str.front());
+ writer.put(str.front());
break;
}
}
writer.put('"');
- return ret;
+ return std::forward(writer);
}
template
- inline size_t unescape_string(R &&writer, ostd::string_range str) {
- size_t ret = 0;
+ inline R &&unescape_string(R &&writer, ostd::string_range str) {
for (; !str.empty(); str.pop_front()) {
if (str.front() == '^') {
str.pop_front();
@@ -622,22 +620,22 @@ namespace util {
}
switch (str.front()) {
case 'n':
- ret += writer.put('\n');
+ writer.put('\n');
break;
case 't':
- ret += writer.put('\r');
+ writer.put('\r');
break;
case 'f':
- ret += writer.put('\f');
+ writer.put('\f');
break;
case '"':
- ret += writer.put('"');
+ writer.put('"');
break;
case '^':
- ret += writer.put('^');
+ writer.put('^');
break;
default:
- ret += writer.put(str.front());
+ writer.put(str.front());
break;
}
} else if (str.front() == '\\') {
@@ -652,12 +650,12 @@ namespace util {
}
continue;
}
- ret += writer.put('\\');
+ writer.put('\\');
} else {
- ret += writer.put(str.front());
+ writer.put(str.front());
}
}
- return ret;
+ return std::forward(writer);
}
OSTD_EXPORT ostd::string_range parse_string(
@@ -686,18 +684,17 @@ namespace util {
size_t count();
template
- size_t get_item(R &&writer) const {
+ R &&get_item(R &&writer) const {
if (!p_quote.empty() && (*p_quote == '"')) {
return unescape_string(std::forward(writer), p_item);
} else {
- return ostd::range_put_n(writer, p_item.data(), p_item.size());
+ writer = ostd::copy(p_item, std::move(writer));
+ return std::forward(writer);
}
}
cs_string get_item() const {
- auto app = ostd::appender_range{};
- get_item(app);
- return std::move(app.get());
+ return std::move(get_item(ostd::appender()).get());
}
ostd::string_range &get_raw_item(bool quoted = false) {
@@ -720,18 +717,18 @@ private:
};
template
- inline std::size_t format_int(R &&writer, cs_int val) {
+ inline void format_int(R &&writer, cs_int val) {
try {
- return ostd::format(std::forward(writer), IntFormat, val);
+ ostd::format(std::forward(writer), IntFormat, val);
} catch (ostd::format_error const &e) {
throw cs_internal_error{e.what()};
}
}
template
- inline std::size_t format_float(R &&writer, cs_float val) {
+ inline void format_float(R &&writer, cs_float val) {
try {
- return ostd::format(
+ ostd::format(
std::forward(writer),
(val == cs_int(val)) ? RoundFloatFormat : FloatFormat, val
);
@@ -741,36 +738,28 @@ private:
}
template
- inline size_t tvals_concat(
+ inline void tvals_concat(
R &&writer, cs_value_r vals,
ostd::string_range sep = ostd::string_range()
) {
- size_t ret = 0;
for (size_t i = 0; i < vals.size(); ++i) {
switch (vals[i].get_type()) {
case cs_value_type::Int: {
- auto r = format_int(
+ format_int(
std::forward(writer), vals[i].get_int()
);
- if (r > 0) {
- ret += size_t(r);
- }
break;
}
case cs_value_type::Float: {
- auto r = format_float(
+ format_float(
std::forward(writer), vals[i].get_float()
);
- if (r > 0) {
- ret += size_t(r);
- }
break;
}
case cs_value_type::String:
case cs_value_type::Cstring:
case cs_value_type::Macro: {
- auto sv = vals[i].get_strr();
- ret += ostd::range_put_n(writer, sv.data(), sv.size());
+ writer = ostd::copy(vals[i].get_strr(), writer);
break;
}
default:
@@ -779,19 +768,17 @@ private:
if (i == (vals.size() - 1)) {
break;
}
- ret += ostd::range_put_n(writer, sep.data(), sep.size());
+ writer = ostd::copy(sep, writer);
}
- return ret;
}
template
- inline size_t print_stack(R &&writer, cs_stack_state const &st) {
- size_t ret = 0;
+ inline void print_stack(R &&writer, cs_stack_state const &st) {
auto nd = st.get();
while (nd) {
try {
- ret += ostd::format(
- writer,
+ ostd::format(
+ std::forward(writer),
((nd->index == 1) && st.gap())
? " ..%d) %s" : " %d) %s",
nd->index, nd->id->get_name()
@@ -801,10 +788,9 @@ private:
}
nd = nd->next;
if (nd) {
- ret += writer.put('\n');
+ writer.put('\n');
}
}
- return ret;
}
} /* namespace util */
diff --git a/src/cs_gen.cc b/src/cs_gen.cc
index 4a9378d8..5bbaf3f2 100644
--- a/src/cs_gen.cc
+++ b/src/cs_gen.cc
@@ -208,7 +208,7 @@ static inline void compileunescapestr(cs_gen_state &gs, bool macro = false) {
size_t bufs = (gs.code.capacity() - gs.code.size()) * sizeof(uint32_t);
char *buf = new char[bufs + 1];
auto writer = ostd::char_range(buf, buf + bufs);
- size_t len = util::unescape_string(writer, str);
+ size_t len = util::unescape_string(ostd::range_counter(writer), str).get_written();
memset(&buf[len], 0, sizeof(uint32_t) - len % sizeof(uint32_t));
gs.code.back() |= len << 8;
uint32_t *ubuf = reinterpret_cast(buf);
diff --git a/src/cs_vm.cc b/src/cs_vm.cc
index 3b017002..49029103 100644
--- a/src/cs_vm.cc
+++ b/src/cs_vm.cc
@@ -119,11 +119,16 @@ ostd::string_range cs_error::save_msg(
try {
ostd::char_range r(cs.p_errbuf, cs.p_errbuf + sizeof(cs.p_errbuf));
if (!gs->src_name.empty()) {
- sz = ostd::format(r, "%s:%d: %s", gs->src_name, gs->current_line, msg);
+ sz = ostd::format(
+ ostd::range_counter(r), "%s:%d: %s", gs->src_name,
+ gs->current_line, msg
+ ).get_written();
} else {
- sz = ostd::format(r, "%d: %s", gs->current_line, msg);
+ sz = ostd::format(
+ ostd::range_counter(r), "%d: %s", gs->current_line, msg
+ ).get_written();
}
- } catch (ostd::format_error const &e) {
+ } catch (...) {
memcpy(cs.p_errbuf, msg.data(), msg.size());
sz = msg.size();
}
@@ -1824,7 +1829,12 @@ static bool cs_run_file(
len = f.size();
buf = std::make_unique(len + 1);
- if (!buf || f.get(buf.get(), len) != len) {
+ if (!buf) {
+ return false;
+ }
+ try {
+ f.get(buf.get(), len);
+ } catch (...) {
return false;
}
buf[len] = '\0';
diff --git a/src/lib_list.cc b/src/lib_list.cc
index 2f5aa1ed..13d08e0f 100644
--- a/src/lib_list.cc
+++ b/src/lib_list.cc
@@ -431,9 +431,7 @@ end:
(p.get_raw_item(true).front() == '"')) {
util::unescape_string(buf, p.get_raw_item());
} else {
- ostd::range_put_n(
- buf, p.get_raw_item().data(), p.get_raw_item().size()
- );
+ buf = ostd::copy(p.get_raw_item(), std::move(buf));
}
if ((n + 1) < len) {
if ((len > 2) || conj.empty()) {
@@ -441,7 +439,7 @@ end:
}
if ((n + 2 == len) && !conj.empty()) {
buf.put(' ');
- ostd::range_put_n(buf, conj.data(), conj.size());
+ buf = ostd::copy(conj, std::move(buf));
}
buf.put(' ');
}