aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/qregisters.cpp
diff options
context:
space:
mode:
authorRobin Haberkorn <robin.haberkorn@googlemail.com>2017-03-18 21:41:46 +0100
committerRobin Haberkorn <robin.haberkorn@googlemail.com>2017-03-18 21:52:22 +0100
commit5069c3b800a5806ef132d187c4ec93d037d55ad2 (patch)
tree1553a24addda46301792148d1b7fa8303cf7d26a /src/qregisters.cpp
parent8b00fa817e24224245df1ae8776f139d807ce87a (diff)
downloadsciteco-5069c3b800a5806ef132d187c4ec93d037d55ad2.tar.gz
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.
Diffstat (limited to 'src/qregisters.cpp')
-rw-r--r--src/qregisters.cpp49
1 files changed, 23 insertions, 26 deletions
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();