aboutsummaryrefslogtreecommitdiffhomepage
path: root/qregisters.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'qregisters.cpp')
-rw-r--r--qregisters.cpp522
1 files changed, 0 insertions, 522 deletions
diff --git a/qregisters.cpp b/qregisters.cpp
deleted file mode 100644
index 06947f7..0000000
--- a/qregisters.cpp
+++ /dev/null
@@ -1,522 +0,0 @@
-#include <string.h>
-#include <bsd/sys/queue.h>
-
-#include <glib.h>
-#include <glib/gprintf.h>
-#include <glib/gstdio.h>
-
-#include <Scintilla.h>
-
-#include "sciteco.h"
-#include "interface.h"
-#include "undo.h"
-#include "parser.h"
-#include "expressions.h"
-#include "ring.h"
-#include "qregisters.h"
-
-namespace States {
- StatePushQReg pushqreg;
- StatePopQReg popqreg;
- StateEQCommand eqcommand;
- StateLoadQReg loadqreg;
- StateCtlUCommand ctlucommand;
- StateSetQRegString setqregstring;
- StateGetQRegString getqregstring;
- StateGetQRegInteger getqreginteger;
- StateSetQRegInteger setqreginteger;
- StateIncreaseQReg increaseqreg;
- StateMacro macro;
- StateCopyToQReg copytoqreg;
-}
-
-namespace QRegisters {
- QRegisterTable globals;
- QRegisterTable *locals = NULL;
- QRegister *current = NULL;
-
- static QRegisterStack stack;
-}
-
-static QRegister *register_argument = NULL;
-
-static inline void
-current_edit(void)
-{
- if (ring.current)
- ring.current->edit();
- else if (QRegisters::current)
- QRegisters::current->edit();
-}
-
-void
-QRegisterData::set_string(const gchar *str)
-{
- edit();
- dot = 0;
-
- interface.ssm(SCI_BEGINUNDOACTION);
- interface.ssm(SCI_SETTEXT, 0, (sptr_t)(str ? : ""));
- interface.ssm(SCI_ENDUNDOACTION);
-
- current_edit();
-}
-
-void
-QRegisterData::undo_set_string(void)
-{
- /* set_string() assumes that dot has been saved */
- current_save_dot();
-
- if (!must_undo)
- return;
-
- if (ring.current)
- ring.current->undo_edit();
- else if (QRegisters::current)
- QRegisters::current->undo_edit();
-
- undo.push_var<gint>(dot);
- undo.push_msg(SCI_UNDO);
-
- undo_edit();
-}
-
-void
-QRegisterData::append_string(const gchar *str)
-{
- if (!str)
- return;
-
- edit();
-
- interface.ssm(SCI_BEGINUNDOACTION);
- interface.ssm(SCI_APPENDTEXT, strlen(str), (sptr_t)str);
- interface.ssm(SCI_ENDUNDOACTION);
-
- current_edit();
-}
-
-gchar *
-QRegisterData::get_string(void)
-{
- gint size;
- gchar *str;
-
- current_save_dot();
- edit();
-
- size = interface.ssm(SCI_GETLENGTH) + 1;
- str = (gchar *)g_malloc(size);
- interface.ssm(SCI_GETTEXT, size, (sptr_t)str);
-
- current_edit();
-
- return str;
-}
-
-void
-QRegisterData::edit(void)
-{
- interface.ssm(SCI_SETDOCPOINTER, 0, (sptr_t)get_document());
- interface.ssm(SCI_GOTOPOS, dot);
-}
-
-void
-QRegisterData::undo_edit(void)
-{
- if (!must_undo)
- return;
-
- undo.push_msg(SCI_GOTOPOS, dot);
- undo.push_msg(SCI_SETDOCPOINTER, 0, (sptr_t)get_document());
-}
-
-void
-QRegister::edit(void)
-{
- QRegisterData::edit();
- interface.info_update(this);
-}
-
-void
-QRegister::undo_edit(void)
-{
- if (!must_undo)
- return;
-
- interface.undo_info_update(this);
- QRegisterData::undo_edit();
-}
-
-void
-QRegister::execute(bool locals) throw (State::Error)
-{
- gchar *str = get_string();
-
- try {
- Execute::macro(str, locals);
- } catch (...) {
- g_free(str);
- throw; /* forward */
- }
-
- g_free(str);
-}
-
-bool
-QRegister::load(const gchar *filename)
-{
- gchar *contents;
- gsize size;
-
- /* FIXME: prevent excessive allocations by reading file into buffer */
- if (!g_file_get_contents(filename, &contents, &size, NULL))
- return false;
-
- edit();
- dot = 0;
-
- interface.ssm(SCI_BEGINUNDOACTION);
- interface.ssm(SCI_CLEARALL);
- interface.ssm(SCI_APPENDTEXT, size, (sptr_t)contents);
- interface.ssm(SCI_ENDUNDOACTION);
-
- g_free(contents);
-
- current_edit();
-
- return true;
-}
-
-gint64
-QRegisterBufferInfo::get_integer(void)
-{
- gint64 id = 1;
-
- if (!ring.current)
- return 0;
-
- for (Buffer *buffer = ring.first();
- buffer != ring.current;
- buffer = buffer->next())
- id++;
-
- return id;
-}
-
-gchar *
-QRegisterBufferInfo::get_string(void)
-{
- gchar *filename = ring.current ? ring.current->filename : NULL;
-
- return g_strdup(filename ? : "");
-}
-
-void
-QRegisterBufferInfo::edit(void)
-{
- gchar *filename = ring.current ? ring.current->filename : NULL;
-
- QRegister::edit();
-
- interface.ssm(SCI_BEGINUNDOACTION);
- interface.ssm(SCI_SETTEXT, 0, (sptr_t)(filename ? : ""));
- interface.ssm(SCI_ENDUNDOACTION);
-
- undo.push_msg(SCI_UNDO);
-}
-
-void
-QRegisterTable::initialize(void)
-{
- /* general purpose registers */
- for (gchar q = 'A'; q <= 'Z'; q++)
- initialize(q);
- for (gchar q = '0'; q <= '9'; q++)
- initialize(q);
-}
-
-void
-QRegisterTable::edit(QRegister *reg)
-{
- current_save_dot();
- reg->edit();
-
- ring.current = NULL;
- QRegisters::current = reg;
-}
-
-void
-QRegisterStack::UndoTokenPush::run(void)
-{
- SLIST_INSERT_HEAD(&stack->head, entry, entries);
- entry = NULL;
-}
-
-void
-QRegisterStack::UndoTokenPop::run(void)
-{
- Entry *entry = SLIST_FIRST(&stack->head);
-
- SLIST_REMOVE_HEAD(&stack->head, entries);
- delete entry;
-}
-
-void
-QRegisterStack::push(QRegister *reg)
-{
- Entry *entry = new Entry();
-
- entry->set_integer(reg->get_integer());
- if (reg->string) {
- gchar *str = reg->get_string();
- entry->set_string(str);
- g_free(str);
- }
- entry->dot = reg->dot;
-
- SLIST_INSERT_HEAD(&head, entry, entries);
- undo.push(new UndoTokenPop(this));
-}
-
-bool
-QRegisterStack::pop(QRegister *reg)
-{
- Entry *entry = SLIST_FIRST(&head);
- QRegisterData::document *string;
-
- if (!entry)
- return false;
-
- reg->undo_set_integer();
- reg->set_integer(entry->get_integer());
-
- /* exchange document ownership between Stack entry and Q-Register */
- string = reg->string;
- if (reg->must_undo)
- undo.push_var(reg->string);
- reg->string = entry->string;
- undo.push_var(entry->string);
- entry->string = string;
-
- if (reg->must_undo)
- undo.push_var(reg->dot);
- reg->dot = entry->dot;
-
- SLIST_REMOVE_HEAD(&head, entries);
- /* pass entry ownership to undo stack */
- undo.push(new UndoTokenPush(this, entry));
-
- return true;
-}
-
-QRegisterStack::~QRegisterStack()
-{
- Entry *entry, *next;
-
- SLIST_FOREACH_SAFE(entry, &head, entries, next)
- delete entry;
-}
-
-void
-QRegisters::hook(Hook type)
-{
- if (!(Flags::ed & Flags::ED_HOOKS))
- return;
-
- expressions.push(type);
- globals["0"]->execute();
-}
-
-/*
- * Command states
- */
-
-State *
-StatePushQReg::got_register(QRegister *reg) throw (Error)
-{
- BEGIN_EXEC(&States::start);
-
- QRegisters::stack.push(reg);
-
- return &States::start;
-}
-
-State *
-StatePopQReg::got_register(QRegister *reg) throw (Error)
-{
- BEGIN_EXEC(&States::start);
-
- if (!QRegisters::stack.pop(reg))
- throw Error("Q-Register stack is empty");
-
- return &States::start;
-}
-
-State *
-StateEQCommand::got_register(QRegister *reg) throw (Error)
-{
- BEGIN_EXEC(&States::loadqreg);
- register_argument = reg;
- return &States::loadqreg;
-}
-
-State *
-StateLoadQReg::done(const gchar *str) throw (Error)
-{
- BEGIN_EXEC(&States::start);
-
- if (*str) {
- register_argument->undo_load();
- if (!register_argument->load(str))
- throw Error("Cannot load \"%s\" into Q-Register \"%s\"",
- str, register_argument->name);
- } else {
- if (ring.current)
- ring.undo_edit();
- else /* QRegisters::current != NULL */
- QRegisters::undo_edit();
- QRegisters::globals.edit(register_argument);
- }
-
- return &States::start;
-}
-
-State *
-StateCtlUCommand::got_register(QRegister *reg) throw (Error)
-{
- BEGIN_EXEC(&States::setqregstring);
- register_argument = reg;
- return &States::setqregstring;
-}
-
-State *
-StateSetQRegString::done(const gchar *str) throw (Error)
-{
- BEGIN_EXEC(&States::start);
-
- register_argument->undo_set_string();
- register_argument->set_string(str);
-
- return &States::start;
-}
-
-State *
-StateGetQRegString::got_register(QRegister *reg) throw (Error)
-{
- gchar *str;
-
- BEGIN_EXEC(&States::start);
-
- str = reg->get_string();
- if (*str) {
- interface.ssm(SCI_BEGINUNDOACTION);
- interface.ssm(SCI_ADDTEXT, strlen(str), (sptr_t)str);
- interface.ssm(SCI_SCROLLCARET);
- interface.ssm(SCI_ENDUNDOACTION);
- ring.dirtify();
-
- undo.push_msg(SCI_UNDO);
- }
- g_free(str);
-
- return &States::start;
-}
-
-State *
-StateGetQRegInteger::got_register(QRegister *reg) throw (Error)
-{
- BEGIN_EXEC(&States::start);
-
- expressions.eval();
- expressions.push(reg->get_integer());
-
- return &States::start;
-}
-
-State *
-StateSetQRegInteger::got_register(QRegister *reg) throw (Error)
-{
- BEGIN_EXEC(&States::start);
-
- reg->undo_set_integer();
- reg->set_integer(expressions.pop_num_calc());
-
- return &States::start;
-}
-
-State *
-StateIncreaseQReg::got_register(QRegister *reg) throw (Error)
-{
- gint64 res;
-
- BEGIN_EXEC(&States::start);
-
- reg->undo_set_integer();
- res = reg->get_integer() + expressions.pop_num_calc();
- expressions.push(reg->set_integer(res));
-
- return &States::start;
-}
-
-State *
-StateMacro::got_register(QRegister *reg) throw (Error)
-{
- BEGIN_EXEC(&States::start);
-
- /* don't create new local Q-Registers if colon modifier is given */
- reg->execute(!eval_colon());
-
- return &States::start;
-}
-
-State *
-StateCopyToQReg::got_register(QRegister *reg) throw (Error)
-{
- gint64 from, len;
- Sci_TextRange tr;
-
- BEGIN_EXEC(&States::start);
- expressions.eval();
-
- if (expressions.args() <= 1) {
- from = interface.ssm(SCI_GETCURRENTPOS);
- sptr_t line = interface.ssm(SCI_LINEFROMPOSITION, from) +
- expressions.pop_num_calc();
-
- if (!Validate::line(line))
- throw RangeError("X");
-
- len = interface.ssm(SCI_POSITIONFROMLINE, line) - from;
-
- if (len < 0) {
- from += len;
- len *= -1;
- }
- } else {
- gint64 to = expressions.pop_num();
- from = expressions.pop_num();
-
- if (!Validate::pos(from) || !Validate::pos(to))
- throw RangeError("X");
-
- len = to - from;
- }
-
- tr.chrg.cpMin = from;
- tr.chrg.cpMax = from + len;
- tr.lpstrText = (char *)g_malloc(len + 1);
- interface.ssm(SCI_GETTEXTRANGE, 0, (sptr_t)&tr);
-
- if (eval_colon()) {
- reg->undo_append_string();
- reg->append_string(tr.lpstrText);
- } else {
- reg->undo_set_string();
- reg->set_string(tr.lpstrText);
- }
- g_free(tr.lpstrText);
-
- return &States::start;
-}