diff options
author | Robin Haberkorn <robin.haberkorn@googlemail.com> | 2013-02-14 03:54:55 +0100 |
---|---|---|
committer | Robin Haberkorn <robin.haberkorn@googlemail.com> | 2013-02-14 05:21:25 +0100 |
commit | 0f5c2c89f20dc07c1e0f8e8a619850629825c9c3 (patch) | |
tree | c23c40a555e2b355d75bef54d44485d0a4d3495e | |
parent | 9fec9e70a2e3f50ca88e75e0e40977571ec79d88 (diff) | |
download | sciteco-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.h | 3 | ||||
-rw-r--r-- | src/qregisters.cpp | 16 | ||||
-rw-r--r-- | src/qregisters.h | 28 |
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 ®) 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 ®) throw (Error); }; class StateEQCommand : public StateExpectQReg { +public: + StateEQCommand() : StateExpectQReg(true) {} + private: State *got_register(QRegister ®) throw (Error); }; @@ -317,6 +326,9 @@ private: }; class StateCtlUCommand : public StateExpectQReg { +public: + StateCtlUCommand() : StateExpectQReg(true) {} + private: State *got_register(QRegister ®) 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 ®) throw (Error); }; class StateIncreaseQReg : public StateExpectQReg { +public: + StateIncreaseQReg() : StateExpectQReg(true) {} + private: State *got_register(QRegister ®) throw (Error); }; @@ -354,6 +373,9 @@ private: }; class StateCopyToQReg : public StateExpectQReg { +public: + StateCopyToQReg() : StateExpectQReg(true) {} + private: State *got_register(QRegister ®) throw (Error); }; |