aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/cmdline.cpp4
-rw-r--r--src/qregisters.cpp49
-rw-r--r--src/qregisters.h21
-rw-r--r--src/spawn.cpp2
4 files changed, 42 insertions, 34 deletions
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 <M>
- * 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 <q> 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;