From 5069c3b800a5806ef132d187c4ec93d037d55ad2 Mon Sep 17 00:00:00 2001 From: Robin Haberkorn Date: Sat, 18 Mar 2017 21:41:46 +0100 Subject: fixed Q-Reg autocompletion for `Q` command * StateQueryQReg is now derived from StateExpectQReg whose semantics have been changed slightly. * The alternative would have been another common base class for both StateQueryQReg and StateExpectQReg. --- src/cmdline.cpp | 4 ++-- src/qregisters.cpp | 49 +++++++++++++++++++++++-------------------------- src/qregisters.h | 21 +++++++++++++++------ src/spawn.cpp | 2 ++ 4 files changed, 42 insertions(+), 34 deletions(-) (limited to 'src') diff --git a/src/cmdline.cpp b/src/cmdline.cpp index 7a1e6cf..f10da33 100644 --- a/src/cmdline.cpp +++ b/src/cmdline.cpp @@ -984,11 +984,11 @@ StateGetHelp::process_edit_cmd(gchar key) State * StateSaveCmdline::got_register(QRegister *reg) { - BEGIN_EXEC(&States::start); + machine.reset(); + BEGIN_EXEC(&States::start); reg->undo_set_string(); reg->set_string(last_cmdline.str, last_cmdline.len); - return &States::start; } diff --git a/src/qregisters.cpp b/src/qregisters.cpp index cf39ea4..c23656c 100644 --- a/src/qregisters.cpp +++ b/src/qregisters.cpp @@ -1154,12 +1154,6 @@ StateExpectQReg::custom(gchar chr) if (!machine.input(chr, reg)) return this; - /* - * NOTE: We must reset the Q-Reg machine - * now, since we have commands like - * that indirectly call their state recursively. - */ - machine.reset(); return got_register(reg); } @@ -1172,10 +1166,10 @@ StateExpectQReg::custom(gchar chr) State * StatePushQReg::got_register(QRegister *reg) { - BEGIN_EXEC(&States::start); + machine.reset(); + BEGIN_EXEC(&States::start); QRegisters::stack.push(*reg); - return &States::start; } @@ -1195,6 +1189,8 @@ StatePushQReg::got_register(QRegister *reg) State * StatePopQReg::got_register(QRegister *reg) { + machine.reset(); + BEGIN_EXEC(&States::start); if (!QRegisters::stack.pop(*reg)) @@ -1221,6 +1217,8 @@ StatePopQReg::got_register(QRegister *reg) State * StateEQCommand::got_register(QRegister *reg) { + machine.reset(); + BEGIN_EXEC(&States::loadqreg); undo.push_var(register_argument) = reg; return &States::loadqreg; @@ -1261,6 +1259,8 @@ StateLoadQReg::got_file(const gchar *filename) State * StateEPctCommand::got_register(QRegister *reg) { + machine.reset(); + BEGIN_EXEC(&States::saveqreg); undo.push_var(register_argument) = reg; return &States::saveqreg; @@ -1308,19 +1308,9 @@ StateSaveQReg::got_file(const gchar *filename) * If is undefined, it returns \fIsuccess\fP, else a \fIfailure\fP * boolean. */ -StateQueryQReg::StateQueryQReg() : machine(QREG_OPTIONAL) -{ - transitions['\0'] = this; -} - State * -StateQueryQReg::custom(gchar chr) +StateQueryQReg::got_register(QRegister *reg) { - QRegister *reg; - - if (!machine.input(chr, reg)) - return this; - /* like BEGIN_EXEC(&States::start), but resets machine */ if (mode > MODE_NORMAL) goto reset; @@ -1341,9 +1331,6 @@ StateQueryQReg::custom(gchar chr) * we cannot currently let parsing depend on the colon-modifier. * That's why we have to declare the Q-Reg machine as QREG_OPTIONAL * and care about exception throwing on our own. - * Since we need the machine's state to throw a reasonable error - * we cannot derive from StateExpectQReg since it has to reset the - * machine before calling got_register(). */ if (!reg) machine.fail(); @@ -1393,6 +1380,8 @@ reset: State * StateCtlUCommand::got_register(QRegister *reg) { + machine.reset(); + BEGIN_EXEC(&States::setqregstring_nobuilding); undo.push_var(register_argument) = reg; return &States::setqregstring_nobuilding; @@ -1411,6 +1400,8 @@ StateCtlUCommand::got_register(QRegister *reg) State * StateEUCommand::got_register(QRegister *reg) { + machine.reset(); + BEGIN_EXEC(&States::setqregstring_building); undo.push_var(register_argument) = reg; return &States::setqregstring_building; @@ -1480,6 +1471,8 @@ StateGetQRegString::got_register(QRegister *reg) { gchar *str; + machine.reset(); + BEGIN_EXEC(&States::start); str = reg->get_string(); @@ -1516,6 +1509,8 @@ StateGetQRegString::got_register(QRegister *reg) State * StateSetQRegInteger::got_register(QRegister *reg) { + machine.reset(); + BEGIN_EXEC(&States::start); expressions.eval(); @@ -1546,6 +1541,8 @@ StateIncreaseQReg::got_register(QRegister *reg) { tecoInt res; + machine.reset(); + BEGIN_EXEC(&States::start); reg->undo_set_integer(); @@ -1580,11 +1577,11 @@ StateIncreaseQReg::got_register(QRegister *reg) State * StateMacro::got_register(QRegister *reg) { - BEGIN_EXEC(&States::start); + machine.reset(); + BEGIN_EXEC(&States::start); /* don't create new local Q-Registers if colon modifier is given */ reg->execute(!eval_colon()); - return &States::start; } @@ -1602,10 +1599,8 @@ State * StateMacroFile::got_file(const gchar *filename) { BEGIN_EXEC(&States::start); - /* don't create new local Q-Registers if colon modifier is given */ Execute::file(filename, !eval_colon()); - return &States::start; } @@ -1636,6 +1631,8 @@ StateCopyToQReg::got_register(QRegister *reg) tecoInt from, len; Sci_TextRange tr; + machine.reset(); + BEGIN_EXEC(&States::start); expressions.eval(); diff --git a/src/qregisters.h b/src/qregisters.h index d57323a..a08bafe 100644 --- a/src/qregisters.h +++ b/src/qregisters.h @@ -485,10 +485,11 @@ public: * Command states */ -/* +/** * Super class for states accepting Q-Register specifications */ class StateExpectQReg : public State { +protected: QRegSpecMachine machine; public: @@ -498,6 +499,16 @@ private: State *custom(gchar chr); protected: + /** + * Called when a register specification has been + * successfully parsed. + * The QRegSpecMachine is not reset automatically. + * + * @param reg Register of the parsed Q-Reg + * specification. May be NULL in + * parse-only mode or with QREG_OPTIONAL. + * @returns Next parser state. + */ virtual State *got_register(QRegister *reg) = 0; /* in cmdline.cpp */ @@ -540,14 +551,12 @@ private: State *got_file(const gchar *filename); }; -class StateQueryQReg : public State { - QRegSpecMachine machine; - +class StateQueryQReg : public StateExpectQReg { public: - StateQueryQReg(); + StateQueryQReg() : StateExpectQReg(QREG_OPTIONAL) {} private: - State *custom(gchar chr); + State *got_register(QRegister *reg); }; class StateCtlUCommand : public StateExpectQReg { diff --git a/src/spawn.cpp b/src/spawn.cpp index aab97a4..0d6d18a 100644 --- a/src/spawn.cpp +++ b/src/spawn.cpp @@ -529,6 +529,8 @@ cleanup: State * StateEGCommand::got_register(QRegister *reg) { + machine.reset(); + BEGIN_EXEC(&States::executecommand); undo.push_var(register_argument) = reg; return &States::executecommand; -- cgit v1.2.3