fix build

master
Daniel Kolesa 2017-02-19 16:44:16 +01:00
parent 73699bd1cf
commit 5c2c441925
4 changed files with 55 additions and 61 deletions

View File

@ -536,9 +536,9 @@ struct cs_error {
try { try {
char fbuf[512]; char fbuf[512];
auto ret = ostd::format( auto ret = ostd::format(
ostd::char_range(fbuf, fbuf + sizeof(fbuf)), msg, ostd::range_counter(ostd::char_range(fbuf, fbuf + sizeof(fbuf))),
std::forward<A>(args)... msg, std::forward<A>(args)...
); ).get_written();
p_errmsg = save_msg(cs, ostd::char_range(fbuf, fbuf + ret)); p_errmsg = save_msg(cs, ostd::char_range(fbuf, fbuf + ret));
} catch (...) { } catch (...) {
p_errmsg = save_msg(cs, msg); p_errmsg = save_msg(cs, msg);
@ -582,38 +582,36 @@ private:
namespace util { namespace util {
template<typename R> template<typename R>
inline size_t escape_string(R &&writer, ostd::string_range str) { inline R &&escape_string(R &&writer, ostd::string_range str) {
size_t ret = 2;
writer.put('"'); writer.put('"');
for (; !str.empty(); str.pop_front()) { for (; !str.empty(); str.pop_front()) {
switch (str.front()) { switch (str.front()) {
case '\n': case '\n':
ret += ostd::range_put_n(writer, "^n", 2); writer = ostd::copy(ostd::string_range{"^n"}, writer);
break; break;
case '\t': case '\t':
ret += ostd::range_put_n(writer, "^t", 2); writer = ostd::copy(ostd::string_range{"^t"}, writer);
break; break;
case '\f': case '\f':
ret += ostd::range_put_n(writer, "^f", 2); writer = ostd::copy(ostd::string_range{"^f"}, writer);
break; break;
case '"': case '"':
ret += ostd::range_put_n(writer, "^\"", 2); writer = ostd::copy(ostd::string_range{"^\""}, writer);
break; break;
case '^': case '^':
ret += ostd::range_put_n(writer, "^^", 2); writer = ostd::copy(ostd::string_range{"^^"}, writer);
break; break;
default: default:
ret += writer.put(str.front()); writer.put(str.front());
break; break;
} }
} }
writer.put('"'); writer.put('"');
return ret; return std::forward<R>(writer);
} }
template<typename R> template<typename R>
inline size_t unescape_string(R &&writer, ostd::string_range str) { inline R &&unescape_string(R &&writer, ostd::string_range str) {
size_t ret = 0;
for (; !str.empty(); str.pop_front()) { for (; !str.empty(); str.pop_front()) {
if (str.front() == '^') { if (str.front() == '^') {
str.pop_front(); str.pop_front();
@ -622,22 +620,22 @@ namespace util {
} }
switch (str.front()) { switch (str.front()) {
case 'n': case 'n':
ret += writer.put('\n'); writer.put('\n');
break; break;
case 't': case 't':
ret += writer.put('\r'); writer.put('\r');
break; break;
case 'f': case 'f':
ret += writer.put('\f'); writer.put('\f');
break; break;
case '"': case '"':
ret += writer.put('"'); writer.put('"');
break; break;
case '^': case '^':
ret += writer.put('^'); writer.put('^');
break; break;
default: default:
ret += writer.put(str.front()); writer.put(str.front());
break; break;
} }
} else if (str.front() == '\\') { } else if (str.front() == '\\') {
@ -652,12 +650,12 @@ namespace util {
} }
continue; continue;
} }
ret += writer.put('\\'); writer.put('\\');
} else { } else {
ret += writer.put(str.front()); writer.put(str.front());
} }
} }
return ret; return std::forward<R>(writer);
} }
OSTD_EXPORT ostd::string_range parse_string( OSTD_EXPORT ostd::string_range parse_string(
@ -686,18 +684,17 @@ namespace util {
size_t count(); size_t count();
template<typename R> template<typename R>
size_t get_item(R &&writer) const { R &&get_item(R &&writer) const {
if (!p_quote.empty() && (*p_quote == '"')) { if (!p_quote.empty() && (*p_quote == '"')) {
return unescape_string(std::forward<R>(writer), p_item); return unescape_string(std::forward<R>(writer), p_item);
} else { } else {
return ostd::range_put_n(writer, p_item.data(), p_item.size()); writer = ostd::copy(p_item, std::move(writer));
return std::forward<R>(writer);
} }
} }
cs_string get_item() const { cs_string get_item() const {
auto app = ostd::appender_range<cs_string>{}; return std::move(get_item(ostd::appender<cs_string>()).get());
get_item(app);
return std::move(app.get());
} }
ostd::string_range &get_raw_item(bool quoted = false) { ostd::string_range &get_raw_item(bool quoted = false) {
@ -720,18 +717,18 @@ private:
}; };
template<typename R> template<typename R>
inline std::size_t format_int(R &&writer, cs_int val) { inline void format_int(R &&writer, cs_int val) {
try { try {
return ostd::format(std::forward<R>(writer), IntFormat, val); ostd::format(std::forward<R>(writer), IntFormat, val);
} catch (ostd::format_error const &e) { } catch (ostd::format_error const &e) {
throw cs_internal_error{e.what()}; throw cs_internal_error{e.what()};
} }
} }
template<typename R> template<typename R>
inline std::size_t format_float(R &&writer, cs_float val) { inline void format_float(R &&writer, cs_float val) {
try { try {
return ostd::format( ostd::format(
std::forward<R>(writer), std::forward<R>(writer),
(val == cs_int(val)) ? RoundFloatFormat : FloatFormat, val (val == cs_int(val)) ? RoundFloatFormat : FloatFormat, val
); );
@ -741,36 +738,28 @@ private:
} }
template<typename R> template<typename R>
inline size_t tvals_concat( inline void tvals_concat(
R &&writer, cs_value_r vals, R &&writer, cs_value_r vals,
ostd::string_range sep = ostd::string_range() ostd::string_range sep = ostd::string_range()
) { ) {
size_t ret = 0;
for (size_t i = 0; i < vals.size(); ++i) { for (size_t i = 0; i < vals.size(); ++i) {
switch (vals[i].get_type()) { switch (vals[i].get_type()) {
case cs_value_type::Int: { case cs_value_type::Int: {
auto r = format_int( format_int(
std::forward<R>(writer), vals[i].get_int() std::forward<R>(writer), vals[i].get_int()
); );
if (r > 0) {
ret += size_t(r);
}
break; break;
} }
case cs_value_type::Float: { case cs_value_type::Float: {
auto r = format_float( format_float(
std::forward<R>(writer), vals[i].get_float() std::forward<R>(writer), vals[i].get_float()
); );
if (r > 0) {
ret += size_t(r);
}
break; break;
} }
case cs_value_type::String: case cs_value_type::String:
case cs_value_type::Cstring: case cs_value_type::Cstring:
case cs_value_type::Macro: { case cs_value_type::Macro: {
auto sv = vals[i].get_strr(); writer = ostd::copy(vals[i].get_strr(), writer);
ret += ostd::range_put_n(writer, sv.data(), sv.size());
break; break;
} }
default: default:
@ -779,19 +768,17 @@ private:
if (i == (vals.size() - 1)) { if (i == (vals.size() - 1)) {
break; break;
} }
ret += ostd::range_put_n(writer, sep.data(), sep.size()); writer = ostd::copy(sep, writer);
} }
return ret;
} }
template<typename R> template<typename R>
inline size_t print_stack(R &&writer, cs_stack_state const &st) { inline void print_stack(R &&writer, cs_stack_state const &st) {
size_t ret = 0;
auto nd = st.get(); auto nd = st.get();
while (nd) { while (nd) {
try { try {
ret += ostd::format( ostd::format(
writer, std::forward<R>(writer),
((nd->index == 1) && st.gap()) ((nd->index == 1) && st.gap())
? " ..%d) %s" : " %d) %s", ? " ..%d) %s" : " %d) %s",
nd->index, nd->id->get_name() nd->index, nd->id->get_name()
@ -801,10 +788,9 @@ private:
} }
nd = nd->next; nd = nd->next;
if (nd) { if (nd) {
ret += writer.put('\n'); writer.put('\n');
} }
} }
return ret;
} }
} /* namespace util */ } /* namespace util */

View File

@ -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); size_t bufs = (gs.code.capacity() - gs.code.size()) * sizeof(uint32_t);
char *buf = new char[bufs + 1]; char *buf = new char[bufs + 1];
auto writer = ostd::char_range(buf, buf + bufs); 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)); memset(&buf[len], 0, sizeof(uint32_t) - len % sizeof(uint32_t));
gs.code.back() |= len << 8; gs.code.back() |= len << 8;
uint32_t *ubuf = reinterpret_cast<uint32_t *>(buf); uint32_t *ubuf = reinterpret_cast<uint32_t *>(buf);

View File

@ -119,11 +119,16 @@ ostd::string_range cs_error::save_msg(
try { try {
ostd::char_range r(cs.p_errbuf, cs.p_errbuf + sizeof(cs.p_errbuf)); ostd::char_range r(cs.p_errbuf, cs.p_errbuf + sizeof(cs.p_errbuf));
if (!gs->src_name.empty()) { 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 { } 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()); memcpy(cs.p_errbuf, msg.data(), msg.size());
sz = msg.size(); sz = msg.size();
} }
@ -1824,7 +1829,12 @@ static bool cs_run_file(
len = f.size(); len = f.size();
buf = std::make_unique<char[]>(len + 1); buf = std::make_unique<char[]>(len + 1);
if (!buf || f.get(buf.get(), len) != len) { if (!buf) {
return false;
}
try {
f.get(buf.get(), len);
} catch (...) {
return false; return false;
} }
buf[len] = '\0'; buf[len] = '\0';

View File

@ -431,9 +431,7 @@ end:
(p.get_raw_item(true).front() == '"')) { (p.get_raw_item(true).front() == '"')) {
util::unescape_string(buf, p.get_raw_item()); util::unescape_string(buf, p.get_raw_item());
} else { } else {
ostd::range_put_n( buf = ostd::copy(p.get_raw_item(), std::move(buf));
buf, p.get_raw_item().data(), p.get_raw_item().size()
);
} }
if ((n + 1) < len) { if ((n + 1) < len) {
if ((len > 2) || conj.empty()) { if ((len > 2) || conj.empty()) {
@ -441,7 +439,7 @@ end:
} }
if ((n + 2 == len) && !conj.empty()) { if ((n + 2 == len) && !conj.empty()) {
buf.put(' '); buf.put(' ');
ostd::range_put_n(buf, conj.data(), conj.size()); buf = ostd::copy(conj, std::move(buf));
} }
buf.put(' '); buf.put(' ');
} }