diff options
author | Robin Haberkorn <robin.haberkorn@googlemail.com> | 2013-02-14 02:59:03 +0100 |
---|---|---|
committer | Robin Haberkorn <robin.haberkorn@googlemail.com> | 2013-02-14 05:21:25 +0100 |
commit | 9fec9e70a2e3f50ca88e75e0e40977571ec79d88 (patch) | |
tree | 943186739d9e3156005556af17de58b10657a5e8 /src/parser.cpp | |
parent | 17c62e3d58a6f8cc301be10060f772f10ab4466c (diff) | |
download | sciteco-9fec9e70a2e3f50ca88e75e0e40977571ec79d88.tar.gz |
use Q-Register micro state machine when parsing Q-Reg spec in string-building commands
* allows referring to long Q-Register names in string arguments
* currently, long names specified this way use their own string building char parsing
(I'm unsure whether this makes any sense)
Diffstat (limited to 'src/parser.cpp')
-rw-r--r-- | src/parser.cpp | 69 |
1 files changed, 31 insertions, 38 deletions
diff --git a/src/parser.cpp b/src/parser.cpp index 140a0a7..6fefe80 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -240,9 +240,20 @@ State::get_next_state(gchar chr) throw (Error, ReplaceCmdline) return next; } +void +StringBuildingMachine::reset(void) +{ + MicroStateMachine::reset(); + undo.push_obj(qregspec_machine) = NULL; + undo.push_var(mode) = MODE_NORMAL; + undo.push_var(toctl) = false; +} + gchar * StringBuildingMachine::input(gchar chr) throw (State::Error) { + QRegister *reg; + switch (mode) { case MODE_UPPER: chr = g_ascii_toupper(chr); @@ -299,8 +310,14 @@ StateUpper: StateCtlE: switch (g_ascii_toupper(chr)) { - case 'Q': set(&&StateCtlEQ); break; - case 'U': set(&&StateCtlEU); break; + case 'Q': + undo.push_obj(qregspec_machine) = new QRegSpecMachine; + set(&&StateCtlEQ); + break; + case 'U': + undo.push_obj(qregspec_machine) = new QRegSpecMachine; + set(&&StateCtlEU); + break; default: set(NULL); return g_strdup((gchar []){CTL_KEY('E'), chr, '\0'}); @@ -309,58 +326,34 @@ StateCtlE: return NULL; StateCtlEU: - if (chr == '.') { - set(&&StateCtlEULocal); + reg = qregspec_machine->input(chr); + if (!reg) return NULL; - } else { - QRegister *reg; - - reg = QRegisters::globals[g_ascii_toupper(chr)]; - if (!reg) - throw State::InvalidQRegError(chr); - set(NULL); - return g_strdup(CHR2STR(reg->get_integer())); - } - -StateCtlEULocal: { - QRegister *reg; - reg = (*QRegisters::locals)[g_ascii_toupper(chr)]; - if (!reg) - throw State::InvalidQRegError(chr, true); + undo.push_obj(qregspec_machine) = NULL; set(NULL); return g_strdup(CHR2STR(reg->get_integer())); -} StateCtlEQ: - if (chr == '.') { - set(&&StateCtlEQLocal); + reg = qregspec_machine->input(chr); + if (!reg) return NULL; - } else { - QRegister *reg; - - reg = QRegisters::globals[g_ascii_toupper(chr)]; - if (!reg) - throw State::InvalidQRegError(chr); - set(NULL); - return reg->get_string(); - } -StateCtlEQLocal: { - QRegister *reg; - - reg = (*QRegisters::locals)[g_ascii_toupper(chr)]; - if (!reg) - throw State::InvalidQRegError(chr, true); + undo.push_obj(qregspec_machine) = NULL; set(NULL); return reg->get_string(); -} StateEscaped: set(NULL); return g_strdup(CHR2STR(chr)); } +StringBuildingMachine::~StringBuildingMachine() +{ + if (qregspec_machine) + delete qregspec_machine; +} + State * StateExpectString::custom(gchar chr) throw (Error) { |