aboutsummaryrefslogtreecommitdiffhomepage
path: root/qbuffers.h
diff options
context:
space:
mode:
authorRobin Haberkorn <robin.haberkorn@googlemail.com>2012-12-04 16:58:20 +0100
committerRobin Haberkorn <robin.haberkorn@googlemail.com>2012-12-04 17:09:31 +0100
commitb120616b6da52e951097f69ad267de06081d218a (patch)
tree0407f216dd5020ecd4096c93326272d358d26993 /qbuffers.h
parent266cdca115c7e9b14f734da478d04a8ce0c2cb69 (diff)
refactoring: split qbuffers.cpp|h into a q-registers (qregisters.cpp) and Buffer ring part (ring.cpp)
Diffstat (limited to 'qbuffers.h')
-rw-r--r--qbuffers.h542
1 files changed, 0 insertions, 542 deletions
diff --git a/qbuffers.h b/qbuffers.h
deleted file mode 100644
index d9c1b94..0000000
--- a/qbuffers.h
+++ /dev/null
@@ -1,542 +0,0 @@
-#ifndef __QBUFFERS_H
-#define __QBUFFERS_H
-
-#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 "rbtree.h"
-#include "parser.h"
-
-/*
- * Auxiliary functions
- */
-static inline bool
-is_glob_pattern(const gchar *str)
-{
- return strchr(str, '*') || strchr(str, '?');
-}
-
-/*
- * Get absolute/full version of a possibly relative path.
- * Works with existing and non-existing paths (in the latter case,
- * heuristics may be applied.)
- */
-gchar *get_absolute_path(const gchar *path);
-
-/*
- * Classes
- */
-
-class QRegisterData {
- gint64 integer;
-
-public:
- typedef void document;
- document *string;
- gint dot;
-
- /*
- * whether to generate UndoTokens (unnecessary in macro invocations)
- */
- bool must_undo;
-
- QRegisterData() : integer(0), string(NULL), dot(0), must_undo(true) {}
- virtual
- ~QRegisterData()
- {
- if (string)
- interface.ssm(SCI_RELEASEDOCUMENT, 0, (sptr_t)string);
- }
-
- inline document *
- get_document(void)
- {
- if (!string)
- string = (document *)interface.ssm(SCI_CREATEDOCUMENT);
- return string;
- }
-
- virtual gint64
- set_integer(gint64 i)
- {
- return integer = i;
- }
- virtual void
- undo_set_integer(void)
- {
- if (must_undo)
- undo.push_var(integer);
- }
- virtual gint64
- get_integer(void)
- {
- return integer;
- }
-
- virtual void set_string(const gchar *str);
- virtual void undo_set_string(void);
- virtual void append_string(const gchar *str);
- virtual inline void
- undo_append_string(void)
- {
- undo_set_string();
- }
- virtual gchar *get_string(void);
-
- virtual void edit(void);
- virtual void undo_edit(void);
-};
-
-class QRegister : public RBTree::RBEntry, public QRegisterData {
-public:
- gchar *name;
-
- QRegister(const gchar *_name)
- : QRegisterData(), name(g_strdup(_name)) {}
- virtual
- ~QRegister()
- {
- g_free(name);
- }
-
- int
- operator <(RBEntry &entry)
- {
- return g_strcmp0(name, ((QRegister &)entry).name);
- }
-
- virtual void edit(void);
- virtual void undo_edit(void);
-
- void execute(bool locals = true) throw (State::Error);
-
- bool load(const gchar *filename);
- inline void
- undo_load(void)
- {
- undo_set_string();
- }
-};
-
-class QRegisterBufferInfo : public QRegister {
-public:
- QRegisterBufferInfo() : QRegister("*")
- {
- get_document();
- }
-
- gint64
- set_integer(gint64 v)
- {
- return v;
- }
- void undo_set_integer(void) {}
-
- gint64 get_integer(void);
-
- void set_string(const gchar *str) {}
- void undo_set_string(void) {}
- void append_string(const gchar *str) {}
- void undo_append_string(void) {}
-
- gchar *get_string(void);
-
- void edit(void);
-};
-
-class QRegisterTable : public RBTree {
- bool must_undo;
-
-public:
- QRegisterTable(bool _undo = true) : RBTree(), must_undo(_undo) {}
-
- inline QRegister *
- insert(QRegister *reg)
- {
- reg->must_undo = must_undo;
- RBTree::insert(reg);
- return reg;
- }
-
- inline void
- initialize(const gchar *name)
- {
- QRegister *reg = new QRegister(name);
- insert(reg);
- /* make sure document is initialized */
- reg->get_document();
- }
- inline void
- initialize(gchar name)
- {
- initialize((gchar []){name, '\0'});
- }
- void initialize(void);
-
- inline QRegister *
- operator [](const gchar *name)
- {
- QRegister reg(name);
- return (QRegister *)find(&reg);
- }
- inline QRegister *
- operator [](gchar chr)
- {
- return operator []((gchar []){chr, '\0'});
- }
-
- void edit(QRegister *reg);
- inline QRegister *
- edit(const gchar *name)
- {
- QRegister *reg = operator [](name);
-
- if (!reg)
- return NULL;
- edit(reg);
- return reg;
- }
-};
-
-class QRegisterStack {
- class Entry : public QRegisterData {
- public:
- SLIST_ENTRY(Entry) entries;
-
- Entry() : QRegisterData() {}
- };
-
- class UndoTokenPush : public UndoToken {
- QRegisterStack *stack;
- /* only remaining reference to stack entry */
- Entry *entry;
-
- public:
- UndoTokenPush(QRegisterStack *_stack, Entry *_entry)
- : UndoToken(), stack(_stack), entry(_entry) {}
-
- ~UndoTokenPush()
- {
- if (entry)
- delete entry;
- }
-
- void run(void);
- };
-
- class UndoTokenPop : public UndoToken {
- QRegisterStack *stack;
-
- public:
- UndoTokenPop(QRegisterStack *_stack)
- : UndoToken(), stack(_stack) {}
-
- void run(void);
- };
-
- SLIST_HEAD(Head, Entry) head;
-
-public:
- QRegisterStack()
- {
- SLIST_INIT(&head);
- }
- ~QRegisterStack();
-
- void push(QRegister *reg);
- bool pop(QRegister *reg);
-};
-
-class Buffer {
- class UndoTokenClose : public UndoToken {
- Buffer *buffer;
-
- public:
- UndoTokenClose(Buffer *_buffer)
- : UndoToken(), buffer(_buffer) {}
-
- void run(void);
- };
-
-public:
- TAILQ_ENTRY(Buffer) buffers;
-
- gchar *filename;
- gint dot;
-
- gint savepoint_id;
-
- bool dirty;
-
-private:
- typedef void document;
- document *doc;
-
-public:
- Buffer() : filename(NULL), dot(0), savepoint_id(0), dirty(false)
- {
- doc = (document *)interface.ssm(SCI_CREATEDOCUMENT);
- }
- ~Buffer()
- {
- interface.ssm(SCI_RELEASEDOCUMENT, 0, (sptr_t)doc);
- g_free(filename);
- }
-
- inline Buffer *&
- next(void)
- {
- return TAILQ_NEXT(this, buffers);
- }
- inline Buffer *&
- prev(void)
- {
- TAILQ_HEAD(Head, Buffer);
-
- return TAILQ_PREV(this, Head, buffers);
- }
-
- inline void
- set_filename(const gchar *filename)
- {
- gchar *resolved = get_absolute_path(filename);
- g_free(Buffer::filename);
- Buffer::filename = resolved;
- interface.info_update(this);
- }
-
- inline void
- edit(void)
- {
- interface.ssm(SCI_SETDOCPOINTER, 0, (sptr_t)doc);
- interface.ssm(SCI_GOTOPOS, dot);
- interface.info_update(this);
- }
- inline void
- undo_edit(void)
- {
- interface.undo_info_update(this);
- undo.push_msg(SCI_GOTOPOS, dot);
- undo.push_msg(SCI_SETDOCPOINTER, 0, (sptr_t)doc);
- }
-
- bool load(const gchar *filename);
-
- inline void
- undo_close(void)
- {
- undo.push(new UndoTokenClose(this));
- }
-};
-
-extern class Ring {
- /*
- * Emitted after a buffer close
- * The pointer is the only remaining reference to the buffer!
- */
- class UndoTokenEdit : public UndoToken {
- Ring *ring;
- Buffer *buffer;
-
- public:
- UndoTokenEdit(Ring *_ring, Buffer *_buffer)
- : UndoToken(), ring(_ring), buffer(_buffer) {}
- ~UndoTokenEdit()
- {
- if (buffer)
- delete buffer;
- }
-
- void run(void);
- };
-
- class UndoTokenRemoveFile : public UndoToken {
- gchar *filename;
-
- public:
- UndoTokenRemoveFile(const gchar *_filename)
- : filename(g_strdup(_filename)) {}
- ~UndoTokenRemoveFile()
- {
- g_free(filename);
- }
-
- void
- run(void)
- {
- g_unlink(filename);
- }
- };
-
- TAILQ_HEAD(Head, Buffer) head;
-
-public:
- Buffer *current;
-
- Ring() : current(NULL)
- {
- TAILQ_INIT(&head);
- }
- ~Ring();
-
- inline Buffer *
- first(void)
- {
- return TAILQ_FIRST(&head);
- }
- inline Buffer *
- last(void)
- {
- return TAILQ_LAST(&head, Head);
- }
-
- Buffer *find(const gchar *filename);
- Buffer *find(gint64 id);
-
- void dirtify(void);
- bool is_any_dirty(void);
-
- bool edit(gint64 id);
- void edit(const gchar *filename);
- inline void
- undo_edit(void)
- {
- current->dot = interface.ssm(SCI_GETCURRENTPOS);
- undo.push_var(current);
- current->undo_edit();
- }
-
- bool save(const gchar *filename);
-
- void close(Buffer *buffer);
- void close(void);
- inline void
- undo_close(void)
- {
- current->undo_close();
- }
-} ring;
-
-/*
- * Command states
- */
-
-class StateEditFile : public StateExpectString {
-private:
- bool allowFilename;
-
- void do_edit(const gchar *filename) throw (Error);
- void do_edit(gint64 id) throw (Error);
-
- void initial(void) throw (Error);
- State *done(const gchar *str) throw (Error);
-};
-
-class StateSaveFile : public StateExpectString {
-private:
- State *done(const gchar *str) throw (Error);
-};
-
-class StatePushQReg : public StateExpectQReg {
-private:
- State *got_register(QRegister *reg) throw (Error);
-};
-
-class StatePopQReg : public StateExpectQReg {
-private:
- State *got_register(QRegister *reg) throw (Error);
-};
-
-class StateEQCommand : public StateExpectQReg {
-private:
- State *got_register(QRegister *reg) throw (Error);
-};
-
-class StateLoadQReg : public StateExpectString {
-private:
- State *done(const gchar *str) throw (Error);
-};
-
-class StateCtlUCommand : public StateExpectQReg {
-private:
- State *got_register(QRegister *reg) throw (Error);
-};
-
-class StateSetQRegString : public StateExpectString {
-public:
- StateSetQRegString() : StateExpectString(false) {}
-private:
- State *done(const gchar *str) throw (Error);
-};
-
-class StateGetQRegString : public StateExpectQReg {
-private:
- State *got_register(QRegister *reg) throw (Error);
-};
-
-class StateGetQRegInteger : public StateExpectQReg {
-private:
- State *got_register(QRegister *reg) throw (Error);
-};
-
-class StateSetQRegInteger : public StateExpectQReg {
-private:
- State *got_register(QRegister *reg) throw (Error);
-};
-
-class StateIncreaseQReg : public StateExpectQReg {
-private:
- State *got_register(QRegister *reg) throw (Error);
-};
-
-class StateMacro : public StateExpectQReg {
-private:
- State *got_register(QRegister *reg) throw (Error);
-};
-
-class StateCopyToQReg : public StateExpectQReg {
-private:
- State *got_register(QRegister *reg) throw (Error);
-};
-
-namespace States {
- extern StateEditFile editfile;
- extern StateSaveFile savefile;
-
- extern StatePushQReg pushqreg;
- extern StatePopQReg popqreg;
- extern StateEQCommand eqcommand;
- extern StateLoadQReg loadqreg;
- extern StateCtlUCommand ctlucommand;
- extern StateSetQRegString setqregstring;
- extern StateGetQRegString getqregstring;
- extern StateGetQRegInteger getqreginteger;
- extern StateSetQRegInteger setqreginteger;
- extern StateIncreaseQReg increaseqreg;
- extern StateMacro macro;
- extern StateCopyToQReg copytoqreg;
-}
-
-namespace QRegisters {
- extern QRegisterTable globals;
- extern QRegisterTable *locals;
-
- enum Hook {
- HOOK_ADD = 1,
- HOOK_EDIT,
- HOOK_CLOSE,
- HOOK_QUIT
- };
- void hook(Hook type);
-}
-
-#endif