aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorRobin Haberkorn <robin.haberkorn@googlemail.com>2013-02-14 03:54:55 +0100
committerRobin Haberkorn <robin.haberkorn@googlemail.com>2013-02-14 05:21:25 +0100
commit0f5c2c89f20dc07c1e0f8e8a619850629825c9c3 (patch)
treec23c40a555e2b355d75bef54d44485d0a4d3495e
parent9fec9e70a2e3f50ca88e75e0e40977571ec79d88 (diff)
downloadsciteco-0f5c2c89f20dc07c1e0f8e8a619850629825c9c3.tar.gz
option for q-reg spec state machine to allocate (insert) new q-registers
* enabled for all modifying Q-Reg commands
-rw-r--r--src/cmdline.h3
-rw-r--r--src/qregisters.cpp16
-rw-r--r--src/qregisters.h28
3 files changed, 38 insertions, 9 deletions
diff --git a/src/cmdline.h b/src/cmdline.h
index 8747f63..443158f 100644
--- a/src/cmdline.h
+++ b/src/cmdline.h
@@ -35,6 +35,9 @@ void cmdline_keypress(gchar key);
*/
class StateSaveCmdline : public StateExpectQReg {
+public:
+ StateSaveCmdline() : StateExpectQReg(true) {}
+
private:
State *got_register(QRegister &reg) throw (Error);
};
diff --git a/src/qregisters.cpp b/src/qregisters.cpp
index 7fb5b27..5d526a7 100644
--- a/src/qregisters.cpp
+++ b/src/qregisters.cpp
@@ -372,7 +372,6 @@ QRegSpecMachine::reset(void)
QRegister *
QRegSpecMachine::input(gchar chr) throw (State::Error)
{
- QRegister *reg;
gchar *insert;
if (state)
@@ -423,10 +422,15 @@ StateString:
return NULL;
done:
- reg = is_local ? (*QRegisters::locals)[name]
- : QRegisters::globals[name];
- if (!reg)
- throw State::InvalidQRegError(name, is_local);
+ QRegisterTable &table = is_local ? *QRegisters::locals
+ : QRegisters::globals;
+ QRegister *reg = table[name];
+
+ if (!reg) {
+ if (!initialize)
+ throw State::InvalidQRegError(name, is_local);
+ reg = table.insert(new QRegister(name));
+ }
return reg;
}
@@ -435,7 +439,7 @@ done:
* Command states
*/
-StateExpectQReg::StateExpectQReg() : State()
+StateExpectQReg::StateExpectQReg(bool initialize) : State(), machine(initialize)
{
transitions['\0'] = this;
}
diff --git a/src/qregisters.h b/src/qregisters.h
index 2e1772a..c5740f6 100644
--- a/src/qregisters.h
+++ b/src/qregisters.h
@@ -256,14 +256,17 @@ public:
class QRegSpecMachine : public MicroStateMachine<QRegister *> {
StringBuildingMachine string_machine;
+ bool initialize;
bool is_local;
gint nesting;
gchar *name;
public:
- QRegSpecMachine() : MicroStateMachine(),
- is_local(false), nesting(0), name(NULL) {}
+ QRegSpecMachine(bool _init = false)
+ : MicroStateMachine(),
+ initialize(_init),
+ is_local(false), nesting(0), name(NULL) {}
~QRegSpecMachine()
{
@@ -286,7 +289,7 @@ class StateExpectQReg : public State {
QRegSpecMachine machine;
public:
- StateExpectQReg();
+ StateExpectQReg(bool initialize = false);
private:
State *custom(gchar chr) throw (Error, ReplaceCmdline);
@@ -302,11 +305,17 @@ private:
};
class StatePopQReg : public StateExpectQReg {
+public:
+ StatePopQReg() : StateExpectQReg(true) {}
+
private:
State *got_register(QRegister &reg) throw (Error);
};
class StateEQCommand : public StateExpectQReg {
+public:
+ StateEQCommand() : StateExpectQReg(true) {}
+
private:
State *got_register(QRegister &reg) throw (Error);
};
@@ -317,6 +326,9 @@ private:
};
class StateCtlUCommand : public StateExpectQReg {
+public:
+ StateCtlUCommand() : StateExpectQReg(true) {}
+
private:
State *got_register(QRegister &reg) throw (Error);
};
@@ -324,6 +336,7 @@ private:
class StateSetQRegString : public StateExpectString {
public:
StateSetQRegString() : StateExpectString(false) {}
+
private:
State *done(const gchar *str) throw (Error);
};
@@ -339,11 +352,17 @@ private:
};
class StateSetQRegInteger : public StateExpectQReg {
+public:
+ StateSetQRegInteger() : StateExpectQReg(true) {}
+
private:
State *got_register(QRegister &reg) throw (Error);
};
class StateIncreaseQReg : public StateExpectQReg {
+public:
+ StateIncreaseQReg() : StateExpectQReg(true) {}
+
private:
State *got_register(QRegister &reg) throw (Error);
};
@@ -354,6 +373,9 @@ private:
};
class StateCopyToQReg : public StateExpectQReg {
+public:
+ StateCopyToQReg() : StateExpectQReg(true) {}
+
private:
State *got_register(QRegister &reg) throw (Error);
};