ostd fixes

master
Daniel Kolesa 2017-02-09 21:27:57 +01:00
parent 2536179500
commit fda734a868
5 changed files with 49 additions and 29 deletions

View File

@ -531,12 +531,13 @@ struct CsErrorException {
{ {
char fbuf[512]; char fbuf[512];
auto ret = ostd::format( auto ret = ostd::format(
ostd::CharRange(fbuf, sizeof(fbuf)), msg, std::forward<A>(args)... ostd::CharRange(fbuf, fbuf + sizeof(fbuf)), msg,
std::forward<A>(args)...
); );
if ((ret < 0) || (size_t(ret) > sizeof(fbuf))) { if ((ret < 0) || (size_t(ret) > sizeof(fbuf))) {
p_errmsg = save_msg(cs, msg); p_errmsg = save_msg(cs, msg);
} else { } else {
p_errmsg = save_msg(cs, ostd::CharRange(fbuf, ret)); p_errmsg = save_msg(cs, ostd::CharRange(fbuf, fbuf + ret));
} }
p_stack = save_stack(cs); p_stack = save_stack(cs);
} }

View File

@ -207,7 +207,7 @@ static inline void compileunescapestr(GenState &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::CharRange(buf, bufs); auto writer = ostd::CharRange(buf, buf + bufs);
size_t len = util::unescape_string(writer, str); size_t len = util::unescape_string(writer, str);
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;

View File

@ -150,9 +150,10 @@ CsFloat CsValue::force_float() {
case CsValueType::String: case CsValueType::String:
case CsValueType::Macro: case CsValueType::Macro:
case CsValueType::Cstring: case CsValueType::Cstring:
rf = cs_parse_float( rf = cs_parse_float(ostd::ConstCharRange(
ostd::ConstCharRange(csv_get<char const *>(p_stor), p_len) csv_get<char const *>(p_stor),
); csv_get<char const *>(p_stor) + p_len
));
break; break;
case CsValueType::Float: case CsValueType::Float:
return csv_get<CsFloat>(p_stor); return csv_get<CsFloat>(p_stor);
@ -172,9 +173,10 @@ CsInt CsValue::force_int() {
case CsValueType::String: case CsValueType::String:
case CsValueType::Macro: case CsValueType::Macro:
case CsValueType::Cstring: case CsValueType::Cstring:
ri = cs_parse_int( ri = cs_parse_int(ostd::ConstCharRange(
ostd::ConstCharRange(csv_get<char const *>(p_stor), p_len) csv_get<char const *>(p_stor),
); csv_get<char const *>(p_stor) + p_len
));
break; break;
case CsValueType::Int: case CsValueType::Int:
return csv_get<CsInt>(p_stor); return csv_get<CsInt>(p_stor);
@ -196,15 +198,24 @@ ostd::ConstCharRange CsValue::force_str() {
break; break;
case CsValueType::Macro: case CsValueType::Macro:
case CsValueType::Cstring: case CsValueType::Cstring:
rs = ostd::ConstCharRange(csv_get<char const *>(p_stor), p_len); rs = ostd::ConstCharRange(
csv_get<char const *>(p_stor),
csv_get<char const *>(p_stor) + p_len
);
break; break;
case CsValueType::String: case CsValueType::String:
return ostd::ConstCharRange(csv_get<char const *>(p_stor), p_len); return ostd::ConstCharRange(
csv_get<char const *>(p_stor),
csv_get<char const *>(p_stor) + p_len
);
default: default:
break; break;
} }
set_str(std::move(rs)); set_str(std::move(rs));
return ostd::ConstCharRange(csv_get<char const *>(p_stor), p_len); return ostd::ConstCharRange(
csv_get<char const *>(p_stor),
csv_get<char const *>(p_stor) + p_len
);
} }
CsInt CsValue::get_int() const { CsInt CsValue::get_int() const {
@ -216,9 +227,10 @@ CsInt CsValue::get_int() const {
case CsValueType::String: case CsValueType::String:
case CsValueType::Macro: case CsValueType::Macro:
case CsValueType::Cstring: case CsValueType::Cstring:
return cs_parse_int( return cs_parse_int(ostd::ConstCharRange(
ostd::ConstCharRange(csv_get<char const *>(p_stor), p_len) csv_get<char const *>(p_stor),
); csv_get<char const *>(p_stor) + p_len
));
default: default:
break; break;
} }
@ -234,9 +246,10 @@ CsFloat CsValue::get_float() const {
case CsValueType::String: case CsValueType::String:
case CsValueType::Macro: case CsValueType::Macro:
case CsValueType::Cstring: case CsValueType::Cstring:
return cs_parse_float( return cs_parse_float(ostd::ConstCharRange(
ostd::ConstCharRange(csv_get<char const *>(p_stor), p_len) csv_get<char const *>(p_stor),
); csv_get<char const *>(p_stor) + p_len
));
default: default:
break; break;
} }
@ -278,7 +291,10 @@ ostd::ConstCharRange CsValue::get_strr() const {
case CsValueType::String: case CsValueType::String:
case CsValueType::Macro: case CsValueType::Macro:
case CsValueType::Cstring: case CsValueType::Cstring:
return ostd::ConstCharRange(csv_get<char const *>(p_stor), p_len); return ostd::ConstCharRange(
csv_get<char const *>(p_stor),
csv_get<char const *>(p_stor)+ p_len
);
default: default:
break; break;
} }
@ -348,9 +364,10 @@ bool CsValue::get_bool() const {
case CsValueType::String: case CsValueType::String:
case CsValueType::Macro: case CsValueType::Macro:
case CsValueType::Cstring: case CsValueType::Cstring:
return cs_get_bool( return cs_get_bool(ostd::ConstCharRange(
ostd::ConstCharRange(csv_get<char const *>(p_stor), p_len) csv_get<char const *>(p_stor),
); csv_get<char const *>(p_stor) + p_len
));
default: default:
return false; return false;
} }

View File

@ -115,7 +115,7 @@ ostd::ConstCharRange CsErrorException::save_msg(
GenState *gs = cs.p_pstate; GenState *gs = cs.p_pstate;
if (gs) { if (gs) {
/* we can attach line number */ /* we can attach line number */
ostd::CharRange r(cs.p_errbuf, sizeof(cs.p_errbuf)); ostd::CharRange r(cs.p_errbuf, cs.p_errbuf + sizeof(cs.p_errbuf));
std::ptrdiff_t sz = -1; std::ptrdiff_t sz = -1;
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(r, "%s:%d: %s", gs->src_name, gs->current_line, msg);
@ -123,11 +123,11 @@ ostd::ConstCharRange CsErrorException::save_msg(
sz = ostd::format(r, "%d: %s", gs->current_line, msg); sz = ostd::format(r, "%d: %s", gs->current_line, msg);
} }
if (sz > 0) { if (sz > 0) {
return ostd::ConstCharRange(cs.p_errbuf, sz); return ostd::ConstCharRange(cs.p_errbuf, cs.p_errbuf + sz);
} }
} }
memcpy(cs.p_errbuf, msg.data(), msg.size()); memcpy(cs.p_errbuf, msg.data(), msg.size());
return ostd::ConstCharRange(cs.p_errbuf, msg.size()); return ostd::ConstCharRange(cs.p_errbuf, cs.p_errbuf + msg.size());
} }
static void bcode_ref(uint32_t *code) { static void bcode_ref(uint32_t *code) {
@ -768,7 +768,8 @@ static uint32_t *runcode(CsState &cs, uint32_t *code, CsValue &result) {
case CsCodeMacro: { case CsCodeMacro: {
uint32_t len = op >> 8; uint32_t len = op >> 8;
args[numargs++].set_macro(ostd::ConstCharRange( args[numargs++].set_macro(ostd::ConstCharRange(
reinterpret_cast<char const *>(code), len reinterpret_cast<char const *>(code),
reinterpret_cast<char const *>(code) + len
)); ));
code += len / sizeof(uint32_t) + 1; code += len / sizeof(uint32_t) + 1;
continue; continue;
@ -777,7 +778,8 @@ static uint32_t *runcode(CsState &cs, uint32_t *code, CsValue &result) {
case CsCodeVal | CsRetString: { case CsCodeVal | CsRetString: {
uint32_t len = op >> 8; uint32_t len = op >> 8;
args[numargs++].set_str(CsString{ args[numargs++].set_str(CsString{
reinterpret_cast<char const *>(code), len reinterpret_cast<char const *>(code),
reinterpret_cast<char const *>(code) + len
}); });
code += len / sizeof(uint32_t) + 1; code += len / sizeof(uint32_t) + 1;
continue; continue;
@ -1825,7 +1827,7 @@ static bool cs_run_file(
} }
buf[len] = '\0'; buf[len] = '\0';
cs_run(cs, fname, ostd::ConstCharRange(buf.get(), len), ret); cs_run(cs, fname, ostd::ConstCharRange(buf.get(), buf.get() + len), ret);
return true; return true;
} }

View File

@ -479,7 +479,7 @@ end:
char const *qend = !quote.empty() ? &quote[quote.size()] : list; char const *qend = !quote.empty() ? &quote[quote.size()] : list;
CsString buf; CsString buf;
if (qend > list) { if (qend > list) {
buf += ostd::ConstCharRange(list, qend - list); buf += ostd::ConstCharRange(list, qend);
} }
if (!vals.empty()) { if (!vals.empty()) {
if (!buf.empty()) { if (!buf.empty()) {