get rid of cs_string in lib_str
parent
5ee7e27839
commit
e74d8b5bef
|
@ -197,6 +197,10 @@ struct cs_charbuf {
|
||||||
|
|
||||||
void push_back(char c) { buf.push_back(c); }
|
void push_back(char c) { buf.push_back(c); }
|
||||||
|
|
||||||
|
void append(ostd::string_range v) {
|
||||||
|
buf.insert(buf.end(), &v[0], &v[v.size()]);
|
||||||
|
}
|
||||||
|
|
||||||
ostd::string_range str() {
|
ostd::string_range str() {
|
||||||
return ostd::string_range{buf.data(), buf.data() + buf.size()};
|
return ostd::string_range{buf.data(), buf.data() + buf.size()};
|
||||||
}
|
}
|
||||||
|
|
|
@ -102,11 +102,11 @@ void cs_init_lib_string(cs_state &cs) {
|
||||||
res.set_str(value_list_concat(ccs, args));
|
res.set_str(value_list_concat(ccs, args));
|
||||||
});
|
});
|
||||||
|
|
||||||
cs.new_command("format", "V", [](auto &, auto args, auto &res) {
|
cs.new_command("format", "V", [](auto &ccs, auto args, auto &res) {
|
||||||
if (args.empty()) {
|
if (args.empty()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
cs_string s;
|
cs_charbuf s{ccs};
|
||||||
cs_strref fs = args[0].get_str();
|
cs_strref fs = args[0].get_str();
|
||||||
ostd::string_range f{fs};
|
ostd::string_range f{fs};
|
||||||
while (!f.empty()) {
|
while (!f.empty()) {
|
||||||
|
@ -118,20 +118,20 @@ void cs_init_lib_string(cs_state &cs) {
|
||||||
if (ic >= '1' && ic <= '9') {
|
if (ic >= '1' && ic <= '9') {
|
||||||
int i = ic - '0';
|
int i = ic - '0';
|
||||||
if (size_t(i) < args.size()) {
|
if (size_t(i) < args.size()) {
|
||||||
s += ostd::string_range{args[i].get_str()};
|
s.append(args[i].get_str());
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
s += ic;
|
s.push_back(ic);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
s += c;
|
s.push_back(c);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
res.set_str(s);
|
res.set_str(s.str());
|
||||||
});
|
});
|
||||||
|
|
||||||
cs.new_command("tohex", "ii", [](auto &, auto args, auto &res) {
|
cs.new_command("tohex", "ii", [](auto &ccs, auto args, auto &res) {
|
||||||
auto r = ostd::appender<cs_string>();
|
auto r = ostd::appender<cs_charbuf>(ccs);
|
||||||
try {
|
try {
|
||||||
ostd::format(
|
ostd::format(
|
||||||
r, "0x%.*X", std::max(args[1].get_int(), cs_int(1)),
|
r, "0x%.*X", std::max(args[1].get_int(), cs_int(1)),
|
||||||
|
@ -140,7 +140,7 @@ void cs_init_lib_string(cs_state &cs) {
|
||||||
} catch (ostd::format_error const &e) {
|
} catch (ostd::format_error const &e) {
|
||||||
throw cs_internal_error{e.what()};
|
throw cs_internal_error{e.what()};
|
||||||
}
|
}
|
||||||
res.set_str(r.get());
|
res.set_str(r.get().str());
|
||||||
});
|
});
|
||||||
|
|
||||||
cs.new_command("substr", "siiN", [](auto &, auto args, auto &res) {
|
cs.new_command("substr", "siiN", [](auto &, auto args, auto &res) {
|
||||||
|
@ -178,7 +178,7 @@ void cs_init_lib_string(cs_state &cs) {
|
||||||
cs_strgcmp(args, res, std::greater_equal<ostd::string_range>());
|
cs_strgcmp(args, res, std::greater_equal<ostd::string_range>());
|
||||||
});
|
});
|
||||||
|
|
||||||
cs.new_command("strreplace", "ssss", [](auto &, auto args, auto &res) {
|
cs.new_command("strreplace", "ssss", [](auto &ccs, auto args, auto &res) {
|
||||||
ostd::string_range s = args[0].get_str();
|
ostd::string_range s = args[0].get_str();
|
||||||
ostd::string_range oldval = args[1].get_str(),
|
ostd::string_range oldval = args[1].get_str(),
|
||||||
newval = args[2].get_str(),
|
newval = args[2].get_str(),
|
||||||
|
@ -186,11 +186,11 @@ void cs_init_lib_string(cs_state &cs) {
|
||||||
if (newval2.empty()) {
|
if (newval2.empty()) {
|
||||||
newval2 = newval;
|
newval2 = newval;
|
||||||
}
|
}
|
||||||
cs_string buf;
|
|
||||||
if (!oldval.size()) {
|
if (!oldval.size()) {
|
||||||
res.set_str(s);
|
res.set_str(s);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
cs_charbuf buf{ccs};
|
||||||
for (size_t i = 0;; ++i) {
|
for (size_t i = 0;; ++i) {
|
||||||
ostd::string_range found;
|
ostd::string_range found;
|
||||||
ostd::string_range trys = s;
|
ostd::string_range trys = s;
|
||||||
|
@ -201,36 +201,34 @@ void cs_init_lib_string(cs_state &cs) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!found.empty()) {
|
if (!found.empty()) {
|
||||||
buf += s.slice(0, &found[0] - &s[0]);
|
buf.append(s.slice(0, &found[0] - &s[0]));
|
||||||
buf += (i & 1) ? newval2 : newval;
|
buf.append((i & 1) ? newval2 : newval);
|
||||||
s = found.slice(oldval.size(), found.size());
|
s = found.slice(oldval.size(), found.size());
|
||||||
} else {
|
} else {
|
||||||
buf += s;
|
buf.append(s);
|
||||||
res.set_str(buf);
|
res.set_str(buf.str());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
cs.new_command("strsplice", "ssii", [](auto &, auto args, auto &res) {
|
cs.new_command("strsplice", "ssii", [](auto &ccs, auto args, auto &res) {
|
||||||
ostd::string_range s = args[0].get_str();
|
ostd::string_range s = args[0].get_str();
|
||||||
ostd::string_range vals = args[1].get_str();
|
ostd::string_range vals = args[1].get_str();
|
||||||
cs_int skip = args[2].get_int(),
|
cs_int skip = args[2].get_int(),
|
||||||
count = args[3].get_int();
|
count = args[3].get_int();
|
||||||
cs_int offset = std::clamp(skip, cs_int(0), cs_int(s.size())),
|
cs_int offset = std::clamp(skip, cs_int(0), cs_int(s.size())),
|
||||||
len = std::clamp(count, cs_int(0), cs_int(s.size()) - offset);
|
len = std::clamp(count, cs_int(0), cs_int(s.size()) - offset);
|
||||||
cs_string p;
|
cs_charbuf p{ccs};
|
||||||
p.reserve(s.size() - len + vals.size());
|
p.reserve(s.size() - len + vals.size());
|
||||||
if (offset) {
|
if (offset) {
|
||||||
p += s.slice(0, offset);
|
p.append(s.slice(0, offset));
|
||||||
}
|
|
||||||
if (!vals.empty()) {
|
|
||||||
p += vals;
|
|
||||||
}
|
}
|
||||||
|
p.append(vals);
|
||||||
if ((offset + len) < cs_int(s.size())) {
|
if ((offset + len) < cs_int(s.size())) {
|
||||||
p += s.slice(offset + len, s.size());
|
p.append(s.slice(offset + len, s.size()));
|
||||||
}
|
}
|
||||||
res.set_str(p);
|
res.set_str(p.str());
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue