diff options
author | Robin Haberkorn <robin.haberkorn@googlemail.com> | 2012-12-04 17:29:01 +0100 |
---|---|---|
committer | Robin Haberkorn <robin.haberkorn@googlemail.com> | 2012-12-04 22:07:08 +0100 |
commit | d8a316514c03d85b771a9dce4a8a51b875d955b3 (patch) | |
tree | 8966c29db767a155848f6d90f76771ce5b9de32e /src/symbols.cpp | |
parent | b120616b6da52e951097f69ad267de06081d218a (diff) | |
download | sciteco-d8a316514c03d85b771a9dce4a8a51b875d955b3.tar.gz |
autoconf preparation: move everything into src/ subdir
Diffstat (limited to 'src/symbols.cpp')
-rw-r--r-- | src/symbols.cpp | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/src/symbols.cpp b/src/symbols.cpp new file mode 100644 index 0000000..c05d153 --- /dev/null +++ b/src/symbols.cpp @@ -0,0 +1,60 @@ +#include <string.h> + +#include <glib.h> + +#include "symbols.h" + +/* + * defaults for sciteco-minimal + */ +namespace Symbols { + SymbolList __attribute__((weak)) scintilla; + SymbolList __attribute__((weak)) scilexer; +} + +/* + * Since symbol lists are presorted constant arrays we can do a simple + * binary search. + */ +gint +SymbolList::lookup(const gchar *name, const gchar *prefix, bool case_sensitive) +{ + int (*cmp_fnc)(const char *, const char *, size_t); + gint prefix_skip = strlen(prefix); + gint name_len = strlen(name); + + gint left = 0; + gint right = size - 1; + + cmp_fnc = case_sensitive ? strncmp : g_ascii_strncasecmp; + + if (!cmp_fnc(name, prefix, prefix_skip)) + prefix_skip = 0; + + while (left <= right) { + gint cur = left + (right-left)/2; + gint cmp = cmp_fnc(entries[cur].name + prefix_skip, + name, name_len + 1); + + 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) +{ + if (!list) { + for (gint i = size; i; i--) + list = g_list_prepend(list, (gchar *)entries[i-1].name); + } + + return list; +} |