aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorRobin Haberkorn <robin.haberkorn@googlemail.com>2013-02-14 19:21:19 +0100
committerRobin Haberkorn <robin.haberkorn@googlemail.com>2013-02-14 19:21:19 +0100
commitf63cf74a89027988aed16e2069c1ca8486c749b5 (patch)
treef14a3fc9fb5ebee253fafce3a564e2cba27442d9
parent6195aeba1899f50384b704b23ae2eea9c60c79a2 (diff)
downloadsciteco-f63cf74a89027988aed16e2069c1ca8486c749b5.tar.gz
hide some implementation details in MicroStateMachines
-rw-r--r--src/parser.cpp17
-rw-r--r--src/parser.h17
-rw-r--r--src/qregisters.cpp5
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;