From 5c2c4419254dc6858dd0fec16b9cf5da9d50da28 Mon Sep 17 00:00:00 2001 From: q66 Date: Sun, 19 Feb 2017 16:44:16 +0100 Subject: [PATCH] fix build --- include/cubescript/cubescript.hh | 90 ++++++++++++++------------------ src/cs_gen.cc | 2 +- src/cs_vm.cc | 18 +++++-- src/lib_list.cc | 6 +-- 4 files changed, 55 insertions(+), 61 deletions(-) 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(' '); }