aboutsummaryrefslogtreecommitdiffhomepage
path: root/symbols.cpp
diff options
context:
space:
mode:
authorRobin Haberkorn <robin.haberkorn@googlemail.com>2012-11-23 16:02:19 +0100
committerRobin Haberkorn <robin.haberkorn@googlemail.com>2012-11-23 16:02:19 +0100
commit0e536bd36250419698fe884d01d5997581241d93 (patch)
treec0022c625937a45cd4afee1e6f2ddd49b0634f07 /symbols.cpp
parentf1accae89b8aa9247932ed8bbb46f07e03e1aa7a (diff)
downloadsciteco-0e536bd36250419698fe884d01d5997581241d93.tar.gz
system for looking up static symbols
* symbols are extracted from C header files by a TECO macro * macro is executed using a "minimal" version of SciTECO that does not include symbols (uses gcc's weak symbols) * the generated C++ code contains the symbol-name-to-define mapping as a constant sorted array and initializes the appropriate SymbolList object * a symbol lookup is super fast using a simple binary search in the symbol lists * except for object initialization, no there's no overhead for keeping the symbol lists! * build process is complicated by introduction of bootstrapping via sciteco-minimal
Diffstat (limited to 'symbols.cpp')
-rw-r--r--symbols.cpp47
1 files changed, 47 insertions, 0 deletions
diff --git a/symbols.cpp b/symbols.cpp
new file mode 100644
index 0000000..c123ebc
--- /dev/null
+++ b/symbols.cpp
@@ -0,0 +1,47 @@
+#include <glib.h>
+
+#include "symbols.h"
+
+/*
+ * defaults for sciteco-minimal
+ */
+namespace Symbols {
+ SymbolList __attribute__((weak)) scintilla;
+}
+
+/*
+ * Since symbol lists are presorted constant arrays we can do a simple
+ * binary search.
+ */
+gint
+SymbolList::lookup(const gchar *name)
+{
+ gint left = 0;
+ gint right = size - 1;
+
+ while (left <= right) {
+ gint cur = left + (right-left)/2;
+ gint cmp = g_strcmp0(entries[cur].name, name);
+
+ if (!cmp)
+ return entries[cur].value;
+
+ if (cmp > 0)
+ right = cur-1;
+ else /* cmp < 0 */
+ left = cur+1;
+ }
+
+ return -1;
+}
+
+GList *
+SymbolList::get_glist(void)
+{
+ GList *list = NULL;
+
+ while (size--)
+ list = g_list_prepend(list, (gchar *)entries[size].name);
+
+ return list;
+}