diff options
-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); }; |