diff options
author | Robin Haberkorn <robin.haberkorn@googlemail.com> | 2013-02-14 19:21:19 +0100 |
---|---|---|
committer | Robin Haberkorn <robin.haberkorn@googlemail.com> | 2013-02-14 19:21:19 +0100 |
commit | f63cf74a89027988aed16e2069c1ca8486c749b5 (patch) | |
tree | f14a3fc9fb5ebee253fafce3a564e2cba27442d9 | |
parent | 6195aeba1899f50384b704b23ae2eea9c60c79a2 (diff) | |
download | sciteco-f63cf74a89027988aed16e2069c1ca8486c749b5.tar.gz |
hide some implementation details in MicroStateMachines
-rw-r--r-- | src/parser.cpp | 17 | ||||
-rw-r--r-- | src/parser.h | 17 | ||||
-rw-r--r-- | src/qregisters.cpp | 5 |
3 files changed, 20 insertions, 19 deletions
diff --git a/src/parser.cpp b/src/parser.cpp index 6fefe80..6e32d87 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -274,10 +274,7 @@ StringBuildingMachine::input(gchar chr) throw (State::Error) return NULL; } - if (state) - goto *state; - - /* NULL state */ +MICROSTATE_START; switch (chr) { case CTL_KEY('Q'): case CTL_KEY('R'): set(&&StateEscaped); break; @@ -291,7 +288,7 @@ StringBuildingMachine::input(gchar chr) throw (State::Error) return NULL; StateLower: - set(NULL); + set(StateStart); if (chr != CTL_KEY('V')) return g_strdup(CHR2STR(g_ascii_tolower(chr))); @@ -300,7 +297,7 @@ StateLower: return NULL; StateUpper: - set(NULL); + set(StateStart); if (chr != CTL_KEY('W')) return g_strdup(CHR2STR(g_ascii_toupper(chr))); @@ -319,7 +316,7 @@ StateCtlE: set(&&StateCtlEU); break; default: - set(NULL); + set(StateStart); return g_strdup((gchar []){CTL_KEY('E'), chr, '\0'}); } @@ -331,7 +328,7 @@ StateCtlEU: return NULL; undo.push_obj(qregspec_machine) = NULL; - set(NULL); + set(StateStart); return g_strdup(CHR2STR(reg->get_integer())); StateCtlEQ: @@ -340,11 +337,11 @@ StateCtlEQ: return NULL; undo.push_obj(qregspec_machine) = NULL; - set(NULL); + set(StateStart); return reg->get_string(); StateEscaped: - set(NULL); + set(StateStart); return g_strdup(CHR2STR(chr)); } diff --git a/src/parser.h b/src/parser.h index 7ef6329..9908f31 100644 --- a/src/parser.h +++ b/src/parser.h @@ -113,11 +113,15 @@ protected: template <typename Type> class MicroStateMachine { protected: - typedef void *MicroState; - MicroState state; + /* label pointers */ + typedef const void *MicroState; + const MicroState StateStart; +#define MICROSTATE_START G_STMT_START { \ + if (MicroStateMachine::state != StateStart) \ + goto *MicroStateMachine::state; \ +} G_STMT_END -public: - MicroStateMachine() : state(NULL) {} + MicroState state; inline void set(MicroState next) @@ -126,10 +130,13 @@ public: undo.push_var(state) = next; } +public: + MicroStateMachine() : StateStart(NULL), state(StateStart) {} + virtual inline void reset(void) { - set(NULL); + set(StateStart); } virtual Type input(gchar chr) throw (State::Error) = 0; diff --git a/src/qregisters.cpp b/src/qregisters.cpp index b5e3080..a46b4da 100644 --- a/src/qregisters.cpp +++ b/src/qregisters.cpp @@ -374,10 +374,7 @@ QRegSpecMachine::input(gchar chr) throw (State::Error) { gchar *insert; - if (state) - goto *state; - - /* NULL state */ +MICROSTATE_START; switch (chr) { case '.': undo.push_var(is_local) = true; break; case '#': set(&&StateFirstChar); break; |