From cbcda49236665b3721ee9c3c66aa4bad08d777b8 Mon Sep 17 00:00:00 2001 From: Robin Haberkorn Date: Mon, 29 Jun 2015 14:45:41 +0200 Subject: MicroStateMachine::input() returns whether a result was set now * this means that QRegSpecMachine::input() no longer has to return a dummy QRegister in parse-only mode. This saves an unnecessary QRegister table lookup and speeds up parsing. * QRegSpecMachine can now be easily extended to behave differently when returning a Q-Register, e.g. simply returning NULL if a register does not exist, or returning a register by prefix. This is important for some planned commands. * StateExpectQReg::got_register() now gets a QRegister *. It can theoretically be NULL - still we don't have to check for NULL in most cases since NULL is only passed in parse-only mode. --- src/parser.cpp | 69 ++++++++++++++++++++++++++++++---------------------------- 1 file changed, 36 insertions(+), 33 deletions(-) (limited to 'src/parser.cpp') diff --git a/src/parser.cpp b/src/parser.cpp index 3db7115..9ef3d64 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -303,8 +303,8 @@ StringBuildingMachine::reset(void) undo.push_var(toctl) = false; } -gchar * -StringBuildingMachine::input(gchar chr) +bool +StringBuildingMachine::input(gchar chr, gchar *&result) { QRegister *reg; @@ -325,7 +325,7 @@ StringBuildingMachine::input(gchar chr) undo.push_var(toctl) = false; } else if (chr == '^') { undo.push_var(toctl) = true; - return NULL; + return false; } MICROSTATE_START; @@ -339,25 +339,29 @@ MICROSTATE_START; goto StateEscaped; } - return NULL; + return false; StateLower: set(StateStart); - if (chr != CTL_KEY('V')) - return String::chrdup(g_ascii_tolower(chr)); + if (chr != CTL_KEY('V')) { + result = String::chrdup(g_ascii_tolower(chr)); + return true; + } undo.push_var(mode) = MODE_LOWER; - return NULL; + return false; StateUpper: set(StateStart); - if (chr != CTL_KEY('W')) - return String::chrdup(g_ascii_toupper(chr)); + if (chr != CTL_KEY('W')) { + result = String::chrdup(g_ascii_toupper(chr)); + return true; + } undo.push_var(mode) = MODE_UPPER; - return NULL; + return false; StateCtlE: switch (g_ascii_toupper(chr)) { @@ -373,49 +377,49 @@ StateCtlE: undo.push_obj(qregspec_machine) = new QRegSpecMachine; set(&&StateCtlEU); break; - default: { - gchar *ret = (gchar *)g_malloc(3); + default: + result = (gchar *)g_malloc(3); set(StateStart); - ret[0] = CTL_KEY('E'); - ret[1] = chr; - ret[2] = '\0'; - return ret; - } + result[0] = CTL_KEY('E'); + result[1] = chr; + result[2] = '\0'; + return true; } - return NULL; + return false; StateCtlENum: - reg = qregspec_machine->input(chr); - if (!reg) - return NULL; + if (!qregspec_machine->input(chr, reg)) + return false; undo.push_obj(qregspec_machine) = NULL; set(StateStart); - return g_strdup(expressions.format(reg->get_integer())); + result = g_strdup(expressions.format(reg->get_integer())); + return true; StateCtlEU: - reg = qregspec_machine->input(chr); - if (!reg) - return NULL; + if (!qregspec_machine->input(chr, reg)) + return false; undo.push_obj(qregspec_machine) = NULL; set(StateStart); - return String::chrdup((gchar)reg->get_integer()); + result = String::chrdup((gchar)reg->get_integer()); + return true; StateCtlEQ: - reg = qregspec_machine->input(chr); - if (!reg) - return NULL; + if (!qregspec_machine->input(chr, reg)) + return false; undo.push_obj(qregspec_machine) = NULL; set(StateStart); - return reg->get_string(); + result = reg->get_string(); + return true; StateEscaped: set(StateStart); - return String::chrdup(chr); + result = String::chrdup(chr); + return true; } StringBuildingMachine::~StringBuildingMachine() @@ -486,8 +490,7 @@ StateExpectString::custom(gchar chr) * String building characters */ if (string_building) { - insert = machine.input(chr); - if (!insert) + if (!machine.input(chr, insert)) return this; } else { insert = String::chrdup(chr); -- cgit v1.2.3