diff options
author | Robin Haberkorn <robin.haberkorn@googlemail.com> | 2012-11-23 16:02:19 +0100 |
---|---|---|
committer | Robin Haberkorn <robin.haberkorn@googlemail.com> | 2012-11-23 16:02:19 +0100 |
commit | 0e536bd36250419698fe884d01d5997581241d93 (patch) | |
tree | c0022c625937a45cd4afee1e6f2ddd49b0634f07 /symbols.cpp | |
parent | f1accae89b8aa9247932ed8bbb46f07e03e1aa7a (diff) | |
download | sciteco-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.cpp | 47 |
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; +} |