From ae2cc6853d935d3daeadd84b0b740af82ea9c41e Mon Sep 17 00:00:00 2001 From: npwoods Date: Wed, 21 Aug 2019 09:28:44 -0400 Subject: Extracting input sequence cleaning logic into an seq_clean() function and exposing to LUA --- src/emu/input.cpp | 35 +++++++++++++++++++++++++---------- src/emu/input.h | 1 + src/frontend/mame/luaengine.cpp | 2 ++ 3 files changed, 28 insertions(+), 10 deletions(-) diff --git a/src/emu/input.cpp b/src/emu/input.cpp index a5c1a0f45e1..05e9dfb4637 100644 --- a/src/emu/input.cpp +++ b/src/emu/input.cpp @@ -1464,14 +1464,12 @@ bool input_manager::seq_poll() //------------------------------------------------- -// seq_name - generate the friendly name of a -// sequence +// seq_clean - clean the sequence, removing +// any invalid bits //------------------------------------------------- -std::string input_manager::seq_name(const input_seq &seq) const +input_seq input_manager::seq_clean(const input_seq &seq) const { - // make a copy of our sequence, removing any invalid bits - input_code clean_codes[sizeof(seq) / sizeof(input_code)]; int clean_index = 0; for (int codenum = 0; seq[codenum] != input_seq::end_code; codenum++) { @@ -1479,29 +1477,46 @@ std::string input_manager::seq_name(const input_seq &seq) const input_code code = seq[codenum]; if (!code.internal() && code_name(code).empty()) { - while (clean_index > 0 && clean_codes[clean_index - 1].internal()) + while (clean_index > 0 && seq[clean_index - 1].internal()) clean_index--; } else if (clean_index > 0 || !code.internal()) - clean_codes[clean_index++] = code; + clean_index++; } + input_seq cleaned_seq; + for (int i = 0; i < clean_index; i++) + cleaned_seq += seq[i]; + return cleaned_seq; +} + + +//------------------------------------------------- +// seq_name - generate the friendly name of a +// sequence +//------------------------------------------------- + +std::string input_manager::seq_name(const input_seq &seq) const +{ + // make a copy of our sequence, removing any invalid bits + input_seq cleaned_seq = seq_clean(seq); + // special case: empty - if (clean_index == 0) + if (cleaned_seq[0] == input_seq::end_code) return std::string((seq.length() == 0) ? "None" : "n/a"); // start with an empty buffer std::string str; // loop until we hit the end - for (int codenum = 0; codenum < clean_index; codenum++) + for (int codenum = 0; cleaned_seq[codenum] != input_seq::end_code; codenum++) { // append a space if not the first code if (codenum != 0) str.append(" "); // handle OR/NOT codes here - input_code code = clean_codes[codenum]; + input_code code = cleaned_seq[codenum]; if (code == input_seq::or_code) str.append("or"); else if (code == input_seq::not_code) diff --git a/src/emu/input.h b/src/emu/input.h index 2293845e6a4..3ca97ae1e99 100644 --- a/src/emu/input.h +++ b/src/emu/input.h @@ -484,6 +484,7 @@ public: const input_seq &seq_poll_final() const { return m_poll_seq; } // input sequence helpers + input_seq seq_clean(const input_seq &seq) const; std::string seq_name(const input_seq &seq) const; std::string seq_to_tokens(const input_seq &seq) const; void seq_from_tokens(input_seq &seq, const char *_token); diff --git a/src/frontend/mame/luaengine.cpp b/src/frontend/mame/luaengine.cpp index 356c6a73ab6..688dca7aa44 100644 --- a/src/frontend/mame/luaengine.cpp +++ b/src/frontend/mame/luaengine.cpp @@ -2027,6 +2027,7 @@ void lua_engine::initialize() * input:seq_pressed(seq) - get pressed state for input_seq * input:seq_to_tokens(seq) - get KEYCODE_* string tokens for seq * input:seq_name(seq) - get seq friendly name + * input:seq_clean(seq) - clean the seq and remove invalid elements * input:seq_poll_start(class, [opt] start_seq) - start polling for input_item_class passed as string * (switch/abs[olute]/rel[ative]/max[imum]) * input:seq_poll() - poll once, returns true if input was fetched @@ -2043,6 +2044,7 @@ void lua_engine::initialize() "seq_pressed", [](input_manager &input, sol::user seq) { return input.seq_pressed(seq); }, "seq_to_tokens", [](input_manager &input, sol::user seq) { return input.seq_to_tokens(seq); }, "seq_name", [](input_manager &input, sol::user seq) { return input.seq_name(seq); }, + "seq_clean", [](input_manager &input, sol::user seq) { input_seq cleaned_seq = input.seq_clean(seq); return sol::make_user(cleaned_seq); }, "seq_poll_start", [](input_manager &input, const char *cls_string, sol::object seq) { input_item_class cls; if (!strcmp(cls_string, "switch")) -- cgit v1.2.3