diff --git a/include/cubescript/cubescript.hh b/include/cubescript/cubescript.hh index c032245..21b2e55 100644 --- a/include/cubescript/cubescript.hh +++ b/include/cubescript/cubescript.hh @@ -85,6 +85,13 @@ struct OSTD_EXPORT cs_strref { operator ostd::string_range() const; + std::size_t size() const { + return ostd::string_range{*this}.size(); + } + std::size_t length() const { + return ostd::string_range{*this}.length(); + } + bool operator==(cs_strref const &s) const; private: @@ -121,7 +128,6 @@ struct OSTD_EXPORT cs_value { void set_ident(cs_ident *val); cs_strref get_str() const; - ostd::string_range get_strr() const; cs_int get_int() const; cs_float get_float() const; cs_bcode *get_code() const; @@ -867,7 +873,9 @@ private: break; } case cs_value_type::String: { - ostd::range_put_all(writer, vals[i].get_strr()); + ostd::range_put_all( + writer, ostd::string_range{vals[i].get_str()} + ); break; } default: diff --git a/src/cs_val.cc b/src/cs_val.cc index 0a5ddc9..c88e527 100644 --- a/src/cs_val.cc +++ b/src/cs_val.cc @@ -247,18 +247,6 @@ cs_strref cs_value::get_str() const { return cs_strref{*state(), ""}; } -ostd::string_range cs_value::get_strr() const { - switch (get_type()) { - case cs_value_type::String: - return ostd::string_range( - *reinterpret_cast(&p_stor) - ); - default: - break; - } - return ostd::string_range(); -} - void cs_value::get_val(cs_value &r) const { switch (get_type()) { case cs_value_type::String: diff --git a/src/cs_vm.cc b/src/cs_vm.cc index 9dfd576..e51eb08 100644 --- a/src/cs_vm.cc +++ b/src/cs_vm.cc @@ -256,7 +256,7 @@ static inline uint32_t *forcecode(cs_state &cs, cs_value &v) { static inline void forcecond(cs_state &cs, cs_value &v) { switch (v.get_type()) { case cs_value_type::String: - if (!v.get_strr().empty()) { + if (!ostd::string_range{v.get_str()}.empty()) { forcecode(cs, v); } else { v.set_int(0); @@ -576,7 +576,7 @@ static inline int cs_get_lookupu_type( if (arg.get_type() != cs_value_type::String) { return -2; /* default case */ } - id = cs.get_ident(arg.get_strr()); + id = cs.get_ident(arg.get_str()); if (id) { switch(id->get_type()) { case cs_ident_type::Alias: @@ -604,7 +604,7 @@ static inline int cs_get_lookupu_type( return CsIdUnknown; } } - throw cs_error(cs, "unknown alias lookup: %s", arg.get_strr()); + throw cs_error(cs, "unknown alias lookup: %s", arg.get_str()); } static uint32_t *runcode(cs_state &cs, uint32_t *code, cs_value &result) { @@ -922,7 +922,7 @@ static uint32_t *runcode(cs_state &cs, uint32_t *code, cs_value &result) { break; case cs_value_type::String: gs.code.reserve(64); - gs.gen_main(arg.get_strr()); + gs.gen_main(arg.get_str()); break; default: gs.code.reserve(8); @@ -944,7 +944,7 @@ static uint32_t *runcode(cs_state &cs, uint32_t *code, cs_value &result) { cs_value &arg = args[numargs - 1]; switch (arg.get_type()) { case cs_value_type::String: { - ostd::string_range s = arg.get_strr(); + ostd::string_range s = arg.get_str(); if (!s.empty()) { cs_gen_state gs(cs); gs.code.reserve(64); @@ -988,7 +988,7 @@ static uint32_t *runcode(cs_state &cs, uint32_t *code, cs_value &result) { cs_value &arg = args[numargs - 1]; cs_ident *id = cs.p_state->identmap[DummyIdx]; if (arg.get_type() == cs_value_type::String) { - id = cs.new_ident(arg.get_strr()); + id = cs.new_ident(arg.get_str()); } if ((id->get_index() < MaxArguments) && !cs_is_arg_used(cs, id)) { cs_value nv{cs}; @@ -1267,7 +1267,7 @@ static uint32_t *runcode(cs_state &cs, uint32_t *code, cs_value &result) { case CsCodeSvar1: cs.set_var_str_checked( static_cast(cs.p_state->identmap[op >> 8]), - args[--numargs].get_strr() + args[--numargs].get_str() ); continue; @@ -1497,16 +1497,17 @@ litval: numargs = offset - 1; continue; } - cs_ident *id = cs.get_ident(idarg.get_strr()); + auto idn = idarg.get_str(); + cs_ident *id = cs.get_ident(idn); if (!id) { noid: - if (cs_check_num(idarg.get_strr())) { + if (cs_check_num(idn)) { goto litval; } result.force_null(); force_arg(result, op & CsCodeRetMask); throw cs_error( - cs, "unknown command: %s", idarg.get_strr() + cs, "unknown command: %s", ostd::string_range{idn} ); } result.force_null(); diff --git a/src/cubescript.cc b/src/cubescript.cc index 3a4030c..1b716a2 100644 --- a/src/cubescript.cc +++ b/src/cubescript.cc @@ -539,7 +539,7 @@ OSTD_EXPORT cs_ident *cs_state::force_ident(cs_value &v) { case cs_value_type::Ident: return v.get_ident(); case cs_value_type::String: { - cs_ident *id = new_ident(v.get_strr()); + cs_ident *id = new_ident(v.get_str()); v.set_ident(id); return id; } @@ -1062,7 +1062,7 @@ end: void cs_init_lib_base(cs_state &gcs) { gcs.new_command("error", "s", [](auto &cs, auto args, auto &) { - throw cs_error(cs, args[0].get_strr()); + throw cs_error(cs, args[0].get_str()); }); gcs.new_command("pcall", "err", [](auto &cs, auto args, auto &ret) { @@ -1306,32 +1306,32 @@ end: }); gcs.new_command("resetvar", "s", [](auto &cs, auto args, auto &) { - cs.reset_var(args[0].get_strr()); + cs.reset_var(args[0].get_str()); }); gcs.new_command("alias", "st", [](auto &cs, auto args, auto &) { - cs.set_alias(args[0].get_strr(), args[1]); + cs.set_alias(args[0].get_str(), args[1]); }); gcs.new_command("getvarmin", "s", [](auto &cs, auto args, auto &res) { - res.set_int(cs.get_var_min_int(args[0].get_strr()).value_or(0)); + res.set_int(cs.get_var_min_int(args[0].get_str()).value_or(0)); }); gcs.new_command("getvarmax", "s", [](auto &cs, auto args, auto &res) { - res.set_int(cs.get_var_max_int(args[0].get_strr()).value_or(0)); + res.set_int(cs.get_var_max_int(args[0].get_str()).value_or(0)); }); gcs.new_command("getfvarmin", "s", [](auto &cs, auto args, auto &res) { - res.set_float(cs.get_var_min_float(args[0].get_strr()).value_or(0.0f)); + res.set_float(cs.get_var_min_float(args[0].get_str()).value_or(0.0f)); }); gcs.new_command("getfvarmax", "s", [](auto &cs, auto args, auto &res) { - res.set_float(cs.get_var_max_float(args[0].get_strr()).value_or(0.0f)); + res.set_float(cs.get_var_max_float(args[0].get_str()).value_or(0.0f)); }); gcs.new_command("identexists", "s", [](auto &cs, auto args, auto &res) { - res.set_int(cs.have_ident(args[0].get_strr())); + res.set_int(cs.have_ident(args[0].get_str())); }); gcs.new_command("getalias", "s", [](auto &cs, auto args, auto &res) { - auto s0 = cs.get_alias_val(args[0].get_strr()); + auto s0 = cs.get_alias_val(args[0].get_str()); if (s0) { res.set_str(*s0); } else { diff --git a/src/lib_list.cc b/src/lib_list.cc index f36b6a3..c900a07 100644 --- a/src/lib_list.cc +++ b/src/lib_list.cc @@ -25,7 +25,7 @@ struct cs_arg_val { template<> struct cs_arg_val { static ostd::string_range get(cs_value &tv) { - return tv.get_strr(); + return tv.get_str(); } }; @@ -35,7 +35,7 @@ static inline void cs_list_find( ) { cs_int n = 0, skip = args[2].get_int(); T val = cs_arg_val::get(args[1]); - for (util::list_parser p(cs, args[0].get_strr()); p.parse(); ++n) { + for (util::list_parser p(cs, args[0].get_str()); p.parse(); ++n) { if (cmp(p, val)) { res.set_int(n); return; @@ -56,7 +56,7 @@ static inline void cs_list_assoc( cs_state &cs, cs_value_r args, cs_value &res, F cmp ) { T val = cs_arg_val::get(args[1]); - for (util::list_parser p(cs, args[0].get_strr()); p.parse();) { + for (util::list_parser p(cs, args[0].get_str()); p.parse();) { if (cmp(p, val)) { if (p.parse()) { res.set_str(p.get_item()); @@ -117,8 +117,8 @@ template static inline void cs_list_merge( cs_state &cs, cs_value_r args, cs_value &res, F cmp ) { - ostd::string_range list = args[0].get_strr(); - ostd::string_range elems = args[1].get_strr(); + ostd::string_range list = args[0].get_str(); + ostd::string_range elems = args[1].get_str(); cs_string buf; if (PushList) { buf += list; @@ -141,7 +141,7 @@ static void cs_init_lib_list_sort(cs_state &cs); void cs_init_lib_list(cs_state &gcs) { gcs.new_command("listlen", "s", [](auto &cs, auto args, auto &res) { - res.set_int(cs_int(util::list_parser(cs, args[0].get_strr()).count())); + res.set_int(cs_int(util::list_parser(cs, args[0].get_str()).count())); }); gcs.new_command("at", "si1V", [](auto &cs, auto args, auto &res) { @@ -174,7 +174,7 @@ void cs_init_lib_list(cs_state &gcs) { cs_int offset = std::max(skip, cs_int(0)), len = (numargs >= 3) ? std::max(count, cs_int(0)) : -1; - util::list_parser p(cs, args[0].get_strr()); + util::list_parser p(cs, args[0].get_str()); for (cs_int i = 0; i < offset; ++i) { if (!p.parse()) break; } @@ -204,7 +204,7 @@ void cs_init_lib_list(cs_state &gcs) { } auto body = args[2].get_code(); int n = -1; - for (util::list_parser p(cs, args[1].get_strr()); p.parse();) { + for (util::list_parser p(cs, args[1].get_str()); p.parse();) { ++n; idv.set_str(cs_string{p.get_raw_item()}); idv.push(); @@ -223,7 +223,7 @@ void cs_init_lib_list(cs_state &gcs) { } auto body = args[2].get_code(); int n = -1; - for (util::list_parser p(cs, args[1].get_strr()); p.parse();) { + for (util::list_parser p(cs, args[1].get_str()); p.parse();) { ++n; idv.set_str(cs_string{p.get_raw_item()}); idv.push(); @@ -290,7 +290,7 @@ void cs_init_lib_list(cs_state &gcs) { } auto body = args[2].get_code(); int n = 0; - for (util::list_parser p(cs, args[1].get_strr()); p.parse(); ++n) { + for (util::list_parser p(cs, args[1].get_str()); p.parse(); ++n) { idv.set_str(p.get_item()); idv.push(); switch (cs.run_loop(body)) { @@ -312,7 +312,7 @@ end: } auto body = args[3].get_code(); int n = 0; - for (util::list_parser p(cs, args[2].get_strr()); p.parse(); n += 2) { + for (util::list_parser p(cs, args[2].get_str()); p.parse(); n += 2) { idv1.set_str(p.get_item()); if (p.parse()) { idv2.set_str(p.get_item()); @@ -341,7 +341,7 @@ end: } auto body = args[4].get_code(); int n = 0; - for (util::list_parser p(cs, args[3].get_strr()); p.parse(); n += 3) { + for (util::list_parser p(cs, args[3].get_str()); p.parse(); n += 3) { idv1.set_str(p.get_item()); if (p.parse()) { idv2.set_str(p.get_item()); @@ -369,7 +369,7 @@ end: gcs.new_command("looplistconcat", "rse", [](auto &cs, auto args, auto &res) { cs_loop_list_conc( - cs, res, args[0].get_ident(), args[1].get_strr(), + cs, res, args[0].get_ident(), args[1].get_str(), args[2].get_code(), true ); }); @@ -378,7 +378,7 @@ end: auto &cs, auto args, auto &res ) { cs_loop_list_conc( - cs, res, args[0].get_ident(), args[1].get_strr(), + cs, res, args[0].get_ident(), args[1].get_str(), args[2].get_code(), false ); }); @@ -391,7 +391,7 @@ end: auto body = args[2].get_code(); cs_string r; int n = 0; - for (util::list_parser p(cs, args[1].get_strr()); p.parse(); ++n) { + for (util::list_parser p(cs, args[1].get_str()); p.parse(); ++n) { idv.set_str(cs_string{p.get_raw_item()}); idv.push(); if (cs.run_bool(body)) { @@ -411,7 +411,7 @@ end: } auto body = args[2].get_code(); int n = 0, r = 0; - for (util::list_parser p(cs, args[1].get_strr()); p.parse(); ++n) { + for (util::list_parser p(cs, args[1].get_str()); p.parse(); ++n) { idv.set_str(cs_string{p.get_raw_item()}); idv.push(); if (cs.run_bool(body)) { @@ -423,8 +423,8 @@ end: gcs.new_command("prettylist", "ss", [](auto &cs, auto args, auto &res) { auto buf = ostd::appender(); - ostd::string_range s = args[0].get_strr(); - ostd::string_range conj = args[1].get_strr(); + ostd::string_range s = args[0].get_str(); + ostd::string_range conj = args[1].get_str(); size_t len = util::list_parser(cs, s).count(); size_t n = 0; for (util::list_parser p(cs, s); p.parse(); ++n) { @@ -450,7 +450,7 @@ end: gcs.new_command("indexof", "ss", [](auto &cs, auto args, auto &res) { res.set_int( - cs_list_includes(cs, args[0].get_strr(), args[1].get_strr()) + cs_list_includes(cs, args[0].get_str(), args[1].get_str()) ); }); @@ -467,8 +467,8 @@ end: gcs.new_command("listsplice", "ssii", [](auto &cs, auto args, auto &res) { cs_int offset = std::max(args[2].get_int(), cs_int(0)); cs_int len = std::max(args[3].get_int(), cs_int(0)); - ostd::string_range s = args[0].get_strr(); - ostd::string_range vals = args[1].get_strr(); + ostd::string_range s = args[0].get_str(); + ostd::string_range vals = args[1].get_str(); char const *list = s.data(); util::list_parser p(cs, s); for (cs_int i = 0; i < offset; ++i) { @@ -622,13 +622,13 @@ static void cs_list_sort( static void cs_init_lib_list_sort(cs_state &gcs) { gcs.new_command("sortlist", "srree", [](auto &cs, auto args, auto &res) { cs_list_sort( - cs, res, args[0].get_strr(), args[1].get_ident(), + cs, res, args[0].get_str(), args[1].get_ident(), args[2].get_ident(), args[3].get_code(), args[4].get_code() ); }); gcs.new_command("uniquelist", "srre", [](auto &cs, auto args, auto &res) { cs_list_sort( - cs, res, args[0].get_strr(), args[1].get_ident(), + cs, res, args[0].get_str(), args[1].get_ident(), args[2].get_ident(), nullptr, args[3].get_code() ); }); diff --git a/src/lib_str.cc b/src/lib_str.cc index e50315a..1b0194c 100644 --- a/src/lib_str.cc +++ b/src/lib_str.cc @@ -8,13 +8,13 @@ template static inline void cs_strgcmp(cs_value_r args, cs_value &res, F cfunc) { bool val; if (args.size() >= 2) { - val = cfunc(args[0].get_strr(), args[1].get_strr()); + val = cfunc(args[0].get_str(), args[1].get_str()); for (size_t i = 2; (i < args.size()) && val; ++i) { - val = cfunc(args[i - 1].get_strr(), args[i].get_strr()); + val = cfunc(args[i - 1].get_str(), args[i].get_str()); } } else { val = cfunc( - !args.empty() ? args[0].get_strr() : ostd::string_range(), + !args.empty() ? args[0].get_str() : ostd::string_range(), ostd::string_range() ); } @@ -23,7 +23,7 @@ static inline void cs_strgcmp(cs_value_r args, cs_value &res, F cfunc) { void cs_init_lib_string(cs_state &cs) { cs.new_command("strstr", "ss", [](auto &, auto args, auto &res) { - ostd::string_range a = args[0].get_strr(), b = args[1].get_strr(); + ostd::string_range a = args[0].get_str(), b = args[1].get_str(); ostd::string_range s = a; for (cs_int i = 0; b.size() <= s.size(); ++i) { if (b == s.slice(0, b.size())) { @@ -36,11 +36,11 @@ void cs_init_lib_string(cs_state &cs) { }); cs.new_command("strlen", "s", [](auto &, auto args, auto &res) { - res.set_int(cs_int(args[0].get_strr().size())); + res.set_int(cs_int(args[0].get_str().size())); }); cs.new_command("strcode", "si", [](auto &, auto args, auto &res) { - ostd::string_range str = args[0].get_strr(); + ostd::string_range str = args[0].get_str(); cs_int i = args[1].get_int(); if (i >= cs_int(str.size())) { res.set_int(0); @@ -71,13 +71,13 @@ void cs_init_lib_string(cs_state &cs) { cs.new_command("escape", "s", [](auto &, auto args, auto &res) { auto s = ostd::appender(); - util::escape_string(s, args[0].get_strr()); + util::escape_string(s, args[0].get_str()); res.set_str(s.get()); }); cs.new_command("unescape", "s", [](auto &, auto args, auto &res) { auto s = ostd::appender(); - util::unescape_string(s, args[0].get_strr()); + util::unescape_string(s, args[0].get_str()); res.set_str(s.get()); }); @@ -135,7 +135,7 @@ void cs_init_lib_string(cs_state &cs) { }); cs.new_command("substr", "siiN", [](auto &, auto args, auto &res) { - ostd::string_range s = args[0].get_strr(); + ostd::string_range s = args[0].get_str(); cs_int start = args[1].get_int(), count = args[2].get_int(); cs_int numargs = args[3].get_int(); cs_int len = cs_int(s.size()), offset = std::clamp(start, cs_int(0), len); @@ -170,10 +170,10 @@ void cs_init_lib_string(cs_state &cs) { }); cs.new_command("strreplace", "ssss", [](auto &, auto args, auto &res) { - ostd::string_range s = args[0].get_strr(); - ostd::string_range oldval = args[1].get_strr(), - newval = args[2].get_strr(), - newval2 = args[3].get_strr(); + ostd::string_range s = args[0].get_str(); + ostd::string_range oldval = args[1].get_str(), + newval = args[2].get_str(), + newval2 = args[3].get_str(); if (newval2.empty()) { newval2 = newval; } @@ -204,8 +204,8 @@ void cs_init_lib_string(cs_state &cs) { }); cs.new_command("strsplice", "ssii", [](auto &, auto args, auto &res) { - ostd::string_range s = args[0].get_strr(); - ostd::string_range vals = args[1].get_strr(); + ostd::string_range s = args[0].get_str(); + ostd::string_range vals = args[1].get_str(); cs_int skip = args[2].get_int(), count = args[3].get_int(); cs_int offset = std::clamp(skip, cs_int(0), cs_int(s.size())), diff --git a/tools/repl.cc b/tools/repl.cc index 5a79d0d..e1707ff 100644 --- a/tools/repl.cc +++ b/tools/repl.cc @@ -275,7 +275,7 @@ int main(int argc, char **argv) { gcs.init_libs(); gcs.new_command("exec", "s", [](auto &cs, auto args, auto &) { - auto file = args[0].get_strr(); + auto file = args[0].get_str(); bool ret = cs.run_file(file); if (!ret) { throw cscript::cs_error( @@ -285,7 +285,7 @@ int main(int argc, char **argv) { }); gcs.new_command("echo", "C", [](auto &, auto args, auto &) { - ostd::writeln(args[0].get_strr()); + ostd::writeln(ostd::string_range{args[0].get_str()}); }); int firstarg = 0;