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 {
char fbuf[512];
auto ret = ostd::format(
ostd::char_range(fbuf, fbuf + sizeof(fbuf)), msg,
std::forward<A>(args)...
);
ostd::range_counter(ostd::char_range(fbuf, fbuf + sizeof(fbuf))),
msg, std::forward<A>(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<typename R>
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<R>(writer);
}
template<typename R>
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<R>(writer);
}
OSTD_EXPORT ostd::string_range parse_string(
@ -686,18 +684,17 @@ namespace util {
size_t count();
template<typename R>
size_t get_item(R &&writer) const {
R &&get_item(R &&writer) const {
if (!p_quote.empty() && (*p_quote == '"')) {
return unescape_string(std::forward<R>(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<R>(writer);
}
}
cs_string get_item() const {
auto app = ostd::appender_range<cs_string>{};
get_item(app);
return std::move(app.get());
return std::move(get_item(ostd::appender<cs_string>()).get());
}
ostd::string_range &get_raw_item(bool quoted = false) {
@ -720,18 +717,18 @@ private:
};
template<typename R>
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<R>(writer), IntFormat, val);
ostd::format(std::forward<R>(writer), IntFormat, val);
} catch (ostd::format_error const &e) {
throw cs_internal_error{e.what()};
}
}
template<typename R>
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<R>(writer),
(val == cs_int(val)) ? RoundFloatFormat : FloatFormat, val
);
@ -741,36 +738,28 @@ private:
}
template<typename R>
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<R>(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<R>(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<typename R>
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<R>(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 */

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);
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<uint32_t *>(buf);

View File

@ -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<char[]>(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';

View File

@ -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(' ');
}