Minor refactor of strutils and add 3 new functions
Use namespace strutils:: instead of the `str_` prefix for the functions. Remove `vec_find` as it's just an alias for `wxArrayString::Index(str)` and is not a function on a string. Signed-off-by: Rafael Kitover <rkitover@gmail.com>
This commit is contained in:
parent
2d3610b5c6
commit
97c24ec2d2
|
@ -7,7 +7,7 @@
|
||||||
void initAutoupdater()
|
void initAutoupdater()
|
||||||
{
|
{
|
||||||
// even if we are a nightly, only check latest stable version
|
// even if we are a nightly, only check latest stable version
|
||||||
wxString version = str_split(vbam_version, '-')[0];
|
wxString version = strutils::split(vbam_version, '-')[0];
|
||||||
#ifndef NO_HTTPS
|
#ifndef NO_HTTPS
|
||||||
win_sparkle_set_appcast_url("https://data.vba-m.com/appcast.xml");
|
win_sparkle_set_appcast_url("https://data.vba-m.com/appcast.xml");
|
||||||
#else
|
#else
|
||||||
|
|
|
@ -631,12 +631,12 @@ void load_opts()
|
||||||
cfg->Read(opt.opt, opt.stropt, *opt.stropt);
|
cfg->Read(opt.opt, opt.stropt, *opt.stropt);
|
||||||
opt.curstr = *opt.stropt;
|
opt.curstr = *opt.stropt;
|
||||||
} else if (!opt.enumvals.empty()) {
|
} else if (!opt.enumvals.empty()) {
|
||||||
auto enum_opts = str_split(opt.enumvals.MakeLower(), wxT("|"));
|
auto enum_opts = strutils::split(opt.enumvals.MakeLower(), wxT("|"));
|
||||||
opt.curint = *opt.intopt;
|
opt.curint = *opt.intopt;
|
||||||
bool gotit = cfg->Read(opt.opt, &s); s.MakeLower();
|
bool gotit = cfg->Read(opt.opt, &s); s.MakeLower();
|
||||||
|
|
||||||
if (gotit && !s.empty()) {
|
if (gotit && !s.empty()) {
|
||||||
const auto found_pos = vec_find(enum_opts, s);
|
const auto found_pos = enum_opts.Index(s);
|
||||||
const bool matched = ((int)found_pos != wxNOT_FOUND);
|
const bool matched = ((int)found_pos != wxNOT_FOUND);
|
||||||
|
|
||||||
if (!matched) {
|
if (!matched) {
|
||||||
|
@ -795,7 +795,7 @@ void update_opts()
|
||||||
} else if (!opt.enumvals.empty()) {
|
} else if (!opt.enumvals.empty()) {
|
||||||
if (*opt.intopt != opt.curint) {
|
if (*opt.intopt != opt.curint) {
|
||||||
opt.curint = *opt.intopt;
|
opt.curint = *opt.intopt;
|
||||||
auto enum_opts = str_split(opt.enumvals.MakeLower(), wxT("|"));
|
auto enum_opts = strutils::split(opt.enumvals.MakeLower(), wxT("|"));
|
||||||
|
|
||||||
cfg->Write(opt.opt, enum_opts[opt.curint]);
|
cfg->Write(opt.opt, enum_opts[opt.curint]);
|
||||||
}
|
}
|
||||||
|
@ -938,9 +938,9 @@ bool opt_set(const wxString& name, const wxString& val)
|
||||||
} else if (!opt->enumvals.empty()) {
|
} else if (!opt->enumvals.empty()) {
|
||||||
wxString s = val; s.MakeLower();
|
wxString s = val; s.MakeLower();
|
||||||
wxString ev = opt->enumvals; ev.MakeLower();
|
wxString ev = opt->enumvals; ev.MakeLower();
|
||||||
auto enum_opts = str_split(ev, wxT("|"));
|
auto enum_opts = strutils::split(ev, wxT("|"));
|
||||||
|
|
||||||
const std::size_t found_pos = vec_find(enum_opts, s);
|
const std::size_t found_pos = enum_opts.Index(s);
|
||||||
const bool matched = ((int)found_pos != wxNOT_FOUND);
|
const bool matched = ((int)found_pos != wxNOT_FOUND);
|
||||||
|
|
||||||
if (!matched) {
|
if (!matched) {
|
||||||
|
@ -1016,7 +1016,7 @@ bool opt_set(const wxString& name, const wxString& val)
|
||||||
if (name.Find(wxT('/')) == wxNOT_FOUND)
|
if (name.Find(wxT('/')) == wxNOT_FOUND)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
auto parts = str_split(name, wxT("/"));
|
auto parts = strutils::split(name, wxT("/"));
|
||||||
|
|
||||||
if (parts[0] != wxT("Keyboard")) {
|
if (parts[0] != wxT("Keyboard")) {
|
||||||
cmditem* cmd = std::lower_bound(&cmdtab[0], &cmdtab[ncmds], cmditem{parts[1],wxString(),0,0,NULL}, cmditem_lt);
|
cmditem* cmd = std::lower_bound(&cmdtab[0], &cmdtab[ncmds], cmditem{parts[1],wxString(),0,0,NULL}, cmditem_lt);
|
||||||
|
|
|
@ -1,10 +1,13 @@
|
||||||
#include "strutils.h"
|
#include "strutils.h"
|
||||||
|
|
||||||
#include <wx/tokenzr.h>
|
#include <wx/tokenzr.h>
|
||||||
|
|
||||||
|
namespace strutils {
|
||||||
|
|
||||||
// From: https://stackoverflow.com/a/7408245/262458
|
// From: https://stackoverflow.com/a/7408245/262458
|
||||||
//
|
//
|
||||||
// Modified to ignore empty tokens or return sep for them.
|
// Modified to ignore empty tokens or return sep for them.
|
||||||
wxArrayString str_split(const wxString& text, const wxString& sep, bool empty_token_is_sep) {
|
wxArrayString split(const wxString& text, const wxString& sep, bool empty_token_is_sep) {
|
||||||
wxArrayString tokens;
|
wxArrayString tokens;
|
||||||
size_t start = 0, end = 0;
|
size_t start = 0, end = 0;
|
||||||
|
|
||||||
|
@ -29,11 +32,9 @@ wxArrayString str_split(const wxString& text, const wxString& sep, bool empty_to
|
||||||
return tokens;
|
return tokens;
|
||||||
}
|
}
|
||||||
|
|
||||||
wxArrayString str_split_with_sep(const wxString& text, const wxString& sep)
|
wxArrayString split_with_sep(const wxString& text, const wxString& sep)
|
||||||
{
|
{
|
||||||
return str_split(text, sep, true);
|
return split(text, sep, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t vec_find(wxArrayString& opts, const wxString& val) {
|
} // namespace strutils
|
||||||
return opts.Index(val);
|
|
||||||
}
|
|
||||||
|
|
|
@ -7,15 +7,16 @@
|
||||||
#include <wx/string.h>
|
#include <wx/string.h>
|
||||||
#include <wx/arrstr.h>
|
#include <wx/arrstr.h>
|
||||||
|
|
||||||
|
namespace strutils {
|
||||||
|
|
||||||
// From: https://stackoverflow.com/a/7408245/262458
|
// From: https://stackoverflow.com/a/7408245/262458
|
||||||
wxArrayString str_split(const wxString& text, const wxString& sep, bool empty_token_is_sep=false);
|
wxArrayString split(const wxString& text, const wxString& sep, bool empty_token_is_sep=false);
|
||||||
|
|
||||||
// Same as above, but it includes the sep dir.
|
// Same as above, but it includes the sep dir.
|
||||||
// If "A,,,B" is the text and "," is sep, then
|
// If "A,,,B" is the text and "," is sep, then
|
||||||
// 'A', ',' and 'B' will be in the output.
|
// 'A', ',' and 'B' will be in the output.
|
||||||
wxArrayString str_split_with_sep(const wxString& text, const wxString& sep);
|
wxArrayString split_with_sep(const wxString& text, const wxString& sep);
|
||||||
|
|
||||||
// From: https://stackoverflow.com/a/15099743/262458
|
} // namespace strutils
|
||||||
size_t vec_find(wxArrayString& opts, const wxString& val);
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -2,96 +2,95 @@
|
||||||
|
|
||||||
#include "tests.hpp"
|
#include "tests.hpp"
|
||||||
|
|
||||||
TEST_CASE("str_split() basic test") {
|
TEST_CASE("strutils::split() basic test") {
|
||||||
wxString foo = "foo|bar|baz";
|
wxString foo = "foo|bar|baz";
|
||||||
|
|
||||||
auto vec = str_split(foo, '|');
|
auto vec = strutils::split(foo, '|');
|
||||||
|
|
||||||
REQUIRE(vec.size() == 3);
|
CHECK(vec.size() == 3);
|
||||||
|
|
||||||
REQUIRE(vec[0] == "foo");
|
CHECK(vec[0] == "foo");
|
||||||
REQUIRE(vec[1] == "bar");
|
CHECK(vec[1] == "bar");
|
||||||
REQUIRE(vec[2] == "baz");
|
CHECK(vec[2] == "baz");
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_CASE("str_split() multi-char separator") {
|
TEST_CASE("strutils::split() multi-char separator") {
|
||||||
wxString foo = "foo|-|bar|-|baz";
|
wxString foo = "foo|-|bar|-|baz";
|
||||||
|
|
||||||
auto vec = str_split(foo, "|-|");
|
auto vec = strutils::split(foo, "|-|");
|
||||||
|
|
||||||
REQUIRE(vec.size() == 3);
|
CHECK(vec.size() == 3);
|
||||||
|
|
||||||
REQUIRE(vec[0] == "foo");
|
CHECK(vec[0] == "foo");
|
||||||
REQUIRE(vec[1] == "bar");
|
CHECK(vec[1] == "bar");
|
||||||
REQUIRE(vec[2] == "baz");
|
CHECK(vec[2] == "baz");
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_CASE("str_split() skips empty tokens") {
|
TEST_CASE("strutils::split() skips empty tokens") {
|
||||||
wxString foo = "|-|foo|-||-|bar|-|baz|-|";
|
wxString foo = "|-|foo|-||-|bar|-|baz|-|";
|
||||||
|
|
||||||
auto vec = str_split(foo, "|-|");
|
auto vec = strutils::split(foo, "|-|");
|
||||||
|
|
||||||
REQUIRE(vec.size() == 3);
|
CHECK(vec.size() == 3);
|
||||||
|
|
||||||
REQUIRE(vec[0] == "foo");
|
CHECK(vec[0] == "foo");
|
||||||
REQUIRE(vec[1] == "bar");
|
CHECK(vec[1] == "bar");
|
||||||
REQUIRE(vec[2] == "baz");
|
CHECK(vec[2] == "baz");
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_CASE("str_split() empty input") {
|
TEST_CASE("strutils::split() empty input") {
|
||||||
wxString foo;
|
wxString foo;
|
||||||
|
|
||||||
auto vec = str_split(foo, "|-|");
|
auto vec = strutils::split(foo, "|-|");
|
||||||
|
|
||||||
REQUIRE(vec.size() == 0);
|
CHECK(vec.size() == 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_CASE("str_split() no tokens, just separators") {
|
TEST_CASE("strutils::split() no tokens, just separators") {
|
||||||
wxString foo = "|-||-||-||-||-|";
|
wxString foo = "|-||-||-||-||-|";
|
||||||
|
|
||||||
auto vec = str_split(foo, "|-|");
|
auto vec = strutils::split(foo, "|-|");
|
||||||
|
|
||||||
REQUIRE(vec.size() == 0);
|
CHECK(vec.size() == 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_CASE("str_split_with_sep() basic test") {
|
TEST_CASE("strutils::split_with_sep() basic test") {
|
||||||
wxString foo = "foo|bar|baz|";
|
wxString foo = "foo|bar|baz|";
|
||||||
|
|
||||||
auto vec = str_split_with_sep(foo, '|');
|
auto vec = strutils::split_with_sep(foo, '|');
|
||||||
|
|
||||||
REQUIRE(vec.size() == 4);
|
CHECK(vec.size() == 4);
|
||||||
|
|
||||||
REQUIRE(vec[0] == "foo");
|
CHECK(vec[0] == "foo");
|
||||||
REQUIRE(vec[1] == "bar");
|
CHECK(vec[1] == "bar");
|
||||||
REQUIRE(vec[2] == "baz");
|
CHECK(vec[2] == "baz");
|
||||||
REQUIRE(vec[3] == "|");
|
CHECK(vec[3] == "|");
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_CASE("str_split_with_sep() multi-char sep") {
|
TEST_CASE("strutils::split_with_sep() multi-char sep") {
|
||||||
wxString foo = "foo|-|bar|-|baz|-|";
|
wxString foo = "foo|-|bar|-|baz|-|";
|
||||||
|
|
||||||
auto vec = str_split_with_sep(foo, "|-|");
|
auto vec = strutils::split_with_sep(foo, "|-|");
|
||||||
|
|
||||||
REQUIRE(vec.size() == 4);
|
CHECK(vec.size() == 4);
|
||||||
|
|
||||||
REQUIRE(vec[0] == "foo");
|
CHECK(vec[0] == "foo");
|
||||||
REQUIRE(vec[1] == "bar");
|
CHECK(vec[1] == "bar");
|
||||||
REQUIRE(vec[2] == "baz");
|
CHECK(vec[2] == "baz");
|
||||||
REQUIRE(vec[3] == "|-|");
|
CHECK(vec[3] == "|-|");
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_CASE("str_split_with_sep() multiple sep tokens") {
|
TEST_CASE("strutils::split_with_sep() multiple sep tokens") {
|
||||||
wxString foo = "|-|foo|-||-|bar|-|baz|-|";
|
wxString foo = "|-|foo|-||-|bar|-|baz|-|";
|
||||||
|
|
||||||
auto vec = str_split_with_sep(foo, "|-|");
|
auto vec = strutils::split_with_sep(foo, "|-|");
|
||||||
|
|
||||||
REQUIRE(vec.size() == 6);
|
CHECK(vec.size() == 6);
|
||||||
|
|
||||||
REQUIRE(vec[0] == "|-|");
|
CHECK(vec[0] == "|-|");
|
||||||
REQUIRE(vec[1] == "foo");
|
CHECK(vec[1] == "foo");
|
||||||
REQUIRE(vec[2] == "|-|");
|
CHECK(vec[2] == "|-|");
|
||||||
REQUIRE(vec[3] == "bar");
|
CHECK(vec[3] == "bar");
|
||||||
REQUIRE(vec[4] == "baz");
|
CHECK(vec[4] == "baz");
|
||||||
REQUIRE(vec[5] == "|-|");
|
CHECK(vec[5] == "|-|");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -135,7 +135,7 @@ nonstd::optional<wxGameControl> wxGameControl::FromString(const wxString &name)
|
||||||
return nonstd::nullopt;
|
return nonstd::nullopt;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto parts = str_split(name, wxT("/"));
|
auto parts = strutils::split(name, wxT("/"));
|
||||||
if (parts.size() != 3) {
|
if (parts.size() != 3) {
|
||||||
wxLogDebug("Wrong split size: %d", parts.size());
|
wxLogDebug("Wrong split size: %d", parts.size());
|
||||||
return nonstd::nullopt;
|
return nonstd::nullopt;
|
||||||
|
|
|
@ -229,7 +229,7 @@ wxAcceleratorEntry_v wxJoyKeyTextCtrl::ToAccelFromString(const wxString& s, wxCh
|
||||||
if (s.size() == 0)
|
if (s.size() == 0)
|
||||||
return empty;
|
return empty;
|
||||||
|
|
||||||
for (const auto& token : str_split_with_sep(s, sep)) {
|
for (const auto& token : strutils::split_with_sep(s, sep)) {
|
||||||
if (!ParseString(token, token.size(), mod, key, joy))
|
if (!ParseString(token, token.size(), mod, key, joy))
|
||||||
return empty;
|
return empty;
|
||||||
ret.insert(ret.begin(), wxAcceleratorEntryUnicode(token, joy, mod, key));
|
ret.insert(ret.begin(), wxAcceleratorEntryUnicode(token, joy, mod, key));
|
||||||
|
|
|
@ -204,7 +204,7 @@ static bool checkForPairKeyMod(const wxString& s, int& mod, int& key)
|
||||||
{
|
{
|
||||||
long ulkey, ulmod;
|
long ulkey, ulmod;
|
||||||
// key:mod as pair
|
// key:mod as pair
|
||||||
auto pair = str_split(s, ":");
|
auto pair = strutils::split(s, ":");
|
||||||
if (pair.size() == 2 && pair[0].ToLong(&ulkey) && pair[1].ToLong(&ulmod))
|
if (pair.size() == 2 && pair[0].ToLong(&ulkey) && pair[1].ToLong(&ulmod))
|
||||||
{
|
{
|
||||||
key = (int)ulkey;
|
key = (int)ulkey;
|
||||||
|
@ -309,7 +309,7 @@ wxAcceleratorEntry_v wxKeyTextCtrl::FromString(const wxString& s, wxChar sep)
|
||||||
wxAcceleratorEntry_v ret, empty;
|
wxAcceleratorEntry_v ret, empty;
|
||||||
int mod, key;
|
int mod, key;
|
||||||
|
|
||||||
for (const auto& token : str_split_with_sep(s, sep)) {
|
for (const auto& token : strutils::split_with_sep(s, sep)) {
|
||||||
if (!ParseString(token, token.size(), mod, key))
|
if (!ParseString(token, token.size(), mod, key))
|
||||||
return empty;
|
return empty;
|
||||||
ret.insert(ret.begin(), wxAcceleratorEntryUnicode(mod, key));
|
ret.insert(ret.begin(), wxAcceleratorEntryUnicode(mod, key));
|
||||||
|
|
|
@ -43,7 +43,7 @@ std::set<wxUserInput> wxUserInput::FromString(const wxString& string) {
|
||||||
return user_inputs;
|
return user_inputs;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (const auto& token : str_split_with_sep(string, wxT(","))) {
|
for (const auto& token : strutils::split_with_sep(string, wxT(","))) {
|
||||||
int mod, key, joy;
|
int mod, key, joy;
|
||||||
if (!wxJoyKeyTextCtrl::ParseString(token, token.size(), mod, key, joy)) {
|
if (!wxJoyKeyTextCtrl::ParseString(token, token.size(), mod, key, joy)) {
|
||||||
user_inputs.clear();
|
user_inputs.clear();
|
||||||
|
|
|
@ -331,7 +331,7 @@ bool wxvbamApp::OnInit()
|
||||||
|
|
||||||
// process command-line options
|
// process command-line options
|
||||||
for (size_t i = 0; i < pending_optset.size(); i++) {
|
for (size_t i = 0; i < pending_optset.size(); i++) {
|
||||||
auto parts = str_split(pending_optset[i], wxT('='));
|
auto parts = strutils::split(pending_optset[i], wxT('='));
|
||||||
opt_set(parts[0], parts[1]);
|
opt_set(parts[0], parts[1]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -680,7 +680,7 @@ bool wxvbamApp::OnCmdLineParsed(wxCmdLineParser& cl)
|
||||||
|
|
||||||
for (int i = 0; i < nparm; i++) {
|
for (int i = 0; i < nparm; i++) {
|
||||||
auto p = cl.GetParam(i);
|
auto p = cl.GetParam(i);
|
||||||
auto parts = str_split(p, wxT('='));
|
auto parts = strutils::split(p, wxT('='));
|
||||||
|
|
||||||
if (parts.size() > 1) {
|
if (parts.size() > 1) {
|
||||||
opt_set(parts[0], parts[1]);
|
opt_set(parts[0], parts[1]);
|
||||||
|
|
Loading…
Reference in New Issue