diff options
-rw-r--r-- | main.cpp | 2 | ||||
-rw-r--r-- | parser.cpp | 1 | ||||
-rw-r--r-- | search.cpp | 38 | ||||
-rw-r--r-- | search.h | 23 |
4 files changed, 55 insertions, 9 deletions
@@ -169,6 +169,8 @@ main(int argc, char **argv) QRegisters::globals.initialize(); /* search string and status register */ QRegisters::globals.initialize("_"); + /* replacement string register */ + QRegisters::globals.initialize("-"); /* current buffer name and number ("*") */ QRegisters::globals.insert(new QRegisterBufferInfo()); @@ -1016,6 +1016,7 @@ StateFCommand::StateFCommand() : State() { transitions['\0'] = this; transitions['S'] = &States::replace; + transitions['R'] = &States::replacedefault; } State * @@ -1,3 +1,5 @@ +#include <string.h> + #include <glib.h> #include <glib/gprintf.h> @@ -9,10 +11,12 @@ #include "search.h" namespace States { - StateSearch search; - StateSearchAll searchall; - StateReplace replace; - StateReplace_insert replace_insert; + StateSearch search; + StateSearchAll searchall; + StateReplace replace; + StateReplace_insert replace_insert; + StateReplaceDefault replacedefault; + StateReplaceDefault_insert replacedefault_insert; } /* @@ -505,3 +509,29 @@ StateReplace::done(const gchar *str) throw (Error) return &States::replace_insert; } + +State * +StateReplaceDefault::done(const gchar *str) throw (Error) +{ + StateReplace::done(str); + return &States::replacedefault_insert; +} + +State * +StateReplaceDefault_insert::done(const gchar *str) throw (Error) +{ + BEGIN_EXEC(&States::start); + + QRegister *replace_reg = QRegisters::globals["-"]; + + if (*str) { + replace_reg->undo_set_string(); + replace_reg->set_string(str); + } else { + gchar *replace_str = replace_reg->get_string(); + StateInsert::process(replace_str, strlen(replace_str)); + g_free(replace_str); + } + + return &States::start; +} @@ -52,7 +52,7 @@ class StateReplace : public StateSearch { public: StateReplace() : StateSearch(false) {} -private: +protected: State *done(const gchar *str) throw (Error); }; @@ -61,11 +61,24 @@ private: void initial(void) throw (Error) {} }; +class StateReplaceDefault : public StateReplace { +private: + State *done(const gchar *str) throw (Error); +}; + +class StateReplaceDefault_insert : public StateInsert { +private: + void initial(void) throw (Error) {} + State *done(const gchar *str) throw (Error); +}; + namespace States { - extern StateSearch search; - extern StateSearchAll searchall; - extern StateReplace replace; - extern StateReplace_insert replace_insert; + extern StateSearch search; + extern StateSearchAll searchall; + extern StateReplace replace; + extern StateReplace_insert replace_insert; + extern StateReplaceDefault replacedefault; + extern StateReplaceDefault_insert replacedefault_insert; } #endif |