From c88e635842f0d172514d73f17f128dc91e3c65f4 Mon Sep 17 00:00:00 2001 From: Robin Haberkorn Date: Sun, 11 Nov 2012 04:35:36 +0100 Subject: support EQx$ command: load filename into Q register without changing the current buffer --- qbuffers.cpp | 55 +++++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 47 insertions(+), 8 deletions(-) (limited to 'qbuffers.cpp') diff --git a/qbuffers.cpp b/qbuffers.cpp index c907330..9e8b065 100644 --- a/qbuffers.cpp +++ b/qbuffers.cpp @@ -18,11 +18,36 @@ namespace States { StateFile file; StateEQCommand eqcommand; + StateLoadQReg loadqreg; } Ring ring; QRegisterTable qregisters; +bool +QRegister::load(const gchar *filename) +{ + gchar *contents; + gsize size; + + edit(); + editor_msg(SCI_CLEARALL); + dot = 0; + + /* FIXME: prevent excessive allocations by reading file into buffer */ + if (!g_file_get_contents(filename, &contents, &size, NULL)) + return false; + editor_msg(SCI_APPENDTEXT, size, (sptr_t)contents); + g_free(contents); + + if (ring.current) + ring.current->edit(); + else /* qregisters.current != NULL */ + qregisters.current->edit(); + + return true; +} + void QRegisterTable::initialize(void) { @@ -232,19 +257,33 @@ StateFile::done(const gchar *str) return &States::start; } -/* - * TODO: expect filename to read into Q-register - */ +static QRegister *eq_register = NULL; + State * StateEQCommand::got_register(QRegister *reg) +{ + BEGIN_EXEC(&States::loadqreg); + + undo.push_var(eq_register); + eq_register = reg; + + return &States::loadqreg; +} + +State * +StateLoadQReg::done(const gchar *str) { BEGIN_EXEC(&States::start); - if (ring.current) - ring.undo_edit(); - else /* qregisters.current != NULL */ - qregisters.undo_edit(); - qregisters.edit(reg); + if (*str) { + eq_register->load(str); + } else { + if (ring.current) + ring.undo_edit(); + else /* qregisters.current != NULL */ + qregisters.undo_edit(); + qregisters.edit(eq_register); + } return &States::start; } -- cgit v1.2.3