diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/qregisters.cpp | 33 | ||||
-rw-r--r-- | src/qregisters.h | 8 |
2 files changed, 33 insertions, 8 deletions
diff --git a/src/qregisters.cpp b/src/qregisters.cpp index e47415b..b7ef0c1 100644 --- a/src/qregisters.cpp +++ b/src/qregisters.cpp @@ -900,8 +900,13 @@ StateExpectQReg::custom(gchar chr) if (!machine.input(chr, reg)) return this; - machine.reset(); + /* + * NOTE: We must reset the Q-Reg machine + * now, since we have commands like <M> + * that indirectly call their state recursively. + */ + machine.reset(); return got_register(reg); } @@ -1050,10 +1055,22 @@ StateSaveQReg::got_file(const gchar *filename) * If <q> is undefined, it returns \fIsuccess\fP, else a \fIfailure\fP * boolean. */ +StateQueryQReg::StateQueryQReg() : machine(QREG_OPTIONAL) +{ + transitions['\0'] = this; +} + State * -StateQueryQReg::got_register(QRegister *reg) +StateQueryQReg::custom(gchar chr) { - BEGIN_EXEC(&States::start); + QRegister *reg; + + if (!machine.input(chr, reg)) + return this; + + /* like BEGIN_EXEC(&States::start), but resets machine */ + if (mode > MODE_NORMAL) + goto reset; expressions.eval(); @@ -1061,7 +1078,7 @@ StateQueryQReg::got_register(QRegister *reg) /* Query Q-Register's existence or string size */ expressions.push(reg ? reg->get_string_size() : (tecoInt)-1); - return &States::start; + goto reset; } /* @@ -1069,7 +1086,11 @@ StateQueryQReg::got_register(QRegister *reg) * without colon and otherwise optional. * While it may be clearer to model this as two States, * we cannot currently let parsing depend on the colon-modifier. - * That's why we have to delegate exception throwing to QRegSpecMachine. + * 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(); @@ -1085,6 +1106,8 @@ StateQueryQReg::got_register(QRegister *reg) expressions.push(reg->get_integer()); } +reset: + machine.reset(); return &States::start; } diff --git a/src/qregisters.h b/src/qregisters.h index 1c55066..48b023d 100644 --- a/src/qregisters.h +++ b/src/qregisters.h @@ -466,12 +466,14 @@ private: State *got_file(const gchar *filename); }; -class StateQueryQReg : public StateExpectQReg { +class StateQueryQReg : public State { + QRegSpecMachine machine; + public: - StateQueryQReg() : StateExpectQReg(QREG_OPTIONAL) {} + StateQueryQReg(); private: - State *got_register(QRegister *reg); + State *custom(gchar chr); }; class StateCtlUCommand : public StateExpectQReg { |