aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/qregisters.cpp33
-rw-r--r--src/qregisters.h8
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 {