aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/goto.h
diff options
context:
space:
mode:
authorRobin Haberkorn <robin.haberkorn@googlemail.com>2012-12-04 17:29:01 +0100
committerRobin Haberkorn <robin.haberkorn@googlemail.com>2012-12-04 22:07:08 +0100
commitd8a316514c03d85b771a9dce4a8a51b875d955b3 (patch)
tree8966c29db767a155848f6d90f76771ce5b9de32e /src/goto.h
parentb120616b6da52e951097f69ad267de06081d218a (diff)
downloadsciteco-d8a316514c03d85b771a9dce4a8a51b875d955b3.tar.gz
autoconf preparation: move everything into src/ subdir
Diffstat (limited to 'src/goto.h')
-rw-r--r--src/goto.h107
1 files changed, 107 insertions, 0 deletions
diff --git a/src/goto.h b/src/goto.h
new file mode 100644
index 0000000..6275d34
--- /dev/null
+++ b/src/goto.h
@@ -0,0 +1,107 @@
+#ifndef __GOTO_H
+#define __GOTO_H
+
+#include <glib.h>
+#include <glib/gprintf.h>
+
+#include "sciteco.h"
+#include "parser.h"
+#include "undo.h"
+#include "rbtree.h"
+
+class GotoTable : public RBTree {
+ class UndoTokenSet : public UndoToken {
+ GotoTable *table;
+
+ gchar *name;
+ gint pc;
+
+ public:
+ UndoTokenSet(GotoTable *_table, gchar *_name, gint _pc = -1)
+ : table(_table), name(g_strdup(_name)), pc(_pc) {}
+ ~UndoTokenSet()
+ {
+ g_free(name);
+ }
+
+ void
+ run(void)
+ {
+ table->set(name, pc);
+#ifdef DEBUG
+ table->dump();
+#endif
+ }
+ };
+
+ class Label : public RBEntry {
+ public:
+ gchar *name;
+ gint pc;
+
+ Label(gchar *_name, gint _pc = -1)
+ : name(g_strdup(_name)), pc(_pc) {}
+ ~Label()
+ {
+ g_free(name);
+ }
+
+ int
+ operator <(RBEntry &l2)
+ {
+ return g_strcmp0(name, ((Label &)l2).name);
+ }
+ };
+
+ /*
+ * whether to generate UndoTokens (unnecessary in macro invocations)
+ */
+ bool must_undo;
+
+public:
+ GotoTable(bool _undo = true) : RBTree(), must_undo(_undo) {}
+
+ gint remove(gchar *name);
+ gint find(gchar *name);
+
+ gint set(gchar *name, gint pc);
+ inline void
+ undo_set(gchar *name, gint pc = -1)
+ {
+ if (must_undo)
+ undo.push(new UndoTokenSet(this, name, pc));
+ }
+
+#ifdef DEBUG
+ void dump(void);
+#endif
+};
+
+namespace Goto {
+ extern GotoTable *table;
+ extern gchar *skip_label;
+}
+
+/*
+ * Command states
+ */
+
+class StateLabel : public State {
+public:
+ StateLabel();
+
+private:
+ State *custom(gchar chr) throw (Error);
+};
+
+class StateGotoCmd : public StateExpectString {
+private:
+ State *done(const gchar *str) throw (Error);
+};
+
+namespace States {
+ extern StateLabel label;
+ extern StateGotoCmd gotocmd;
+}
+
+#endif