aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--.gitignore2
-rw-r--r--Makefile20
-rwxr-xr-xsymbols-extract.tes80
-rw-r--r--symbols.cpp47
-rw-r--r--symbols.h29
5 files changed, 173 insertions, 5 deletions
diff --git a/.gitignore b/.gitignore
index 147615e..4bff334 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,10 +1,12 @@
# Generated code
gtk-info-popup*.[ch]
+symbols-*.cpp
*.o
*.a
*.exe
sciteco
+sciteco-minimal
*~
# SciTECO save points
diff --git a/Makefile b/Makefile
index a65b860..361f966 100644
--- a/Makefile
+++ b/Makefile
@@ -53,13 +53,22 @@ ifneq ($(findstring MINGW32,$(OS)),)
CPPFLAGS+=-Icompat
endif
+MINIMAL_OBJS:=main.o cmdline.o undo.o expressions.o qbuffers.o \
+ parser.o goto.o rbtree.o symbols.o \
+ interface.a
+
all : sciteco
-sciteco : main.o cmdline.o undo.o expressions.o qbuffers.o \
- parser.o goto.o rbtree.o \
- interface.a
+sciteco : $(MINIMAL_OBJS) symbols-scintilla.o
+ $(CXX) -o $@ $^ $(LDFLAGS)
+
+sciteco-minimal : $(MINIMAL_OBJS)
$(CXX) -o $@ $^ $(LDFLAGS)
+symbols-scintilla.cpp : $(SCI_DIR)/include/Scintilla.h \
+ sciteco-minimal symbols-extract.tes
+ ./sciteco-minimal -m symbols-extract.tes $< $@ SCI_ scintilla
+
ifeq ($(INTERFACE),GTK)
interface.a : interface-gtk.o gtk-info-popup.o
@@ -82,5 +91,6 @@ install: all
$(INSTALL) sciteco $(PREFIX)/bin
clean:
- $(RM) sciteco *.o *.a *.exe
- $(RM) gtk-info-popup*.[ch]
+ $(RM) sciteco sciteco-minimal
+ $(RM) *.o *.a *.exe
+ $(RM) gtk-info-popup*.[ch] symbols-*.cpp
diff --git a/symbols-extract.tes b/symbols-extract.tes
new file mode 100755
index 0000000..08ab2d7
--- /dev/null
+++ b/symbols-extract.tes
@@ -0,0 +1,80 @@
+#!./sciteco-minimal -m
+! ./symbols-extract.tes <input file> <output file> <prefix> <array name> !
+
+! <pos1,pos2>Mc - Compare string at pos1 with string at pos2 !
+@^Uc{
+ U.2U.1 -.%.1^[ -.%.2^[
+ <Q.1A-(Q.2A)U.c Q.1A"A|Q.2A"A|;'' Q.c"N;' %.1^[%.2>
+ Q.c
+}
+
+! <i,j>Mx - Exchange line at I with line at J (I < J), returning new J !
+@^Ux{
+ U.jU.i
+ Q.jJ X.xK
+ Q.iJ G.x .-Q.i%.j^[ .-(X.xL.)%.j^[ -K
+ Q.jJ G.x
+ Q.j
+}
+
+! <i,j>Mq - Sort lines beginning at I until J using Quicksort algorithm !
+@^Uq{
+ U.rU.l
+
+ Q.l-Q.r"<
+ Q.lU.i Q.rJB .U.j
+
+ <
+ Q.iJ <.,Q.rMc-1; .-Q.r; L> .U.i
+ Q.jJ <.,Q.rMc:; .-Q.l-1:; B> .U.j
+
+ Q.i-Q.j;
+
+ Q.i,Q.jMxU.j
+ >
+
+ Q.i,Q.rMc"> Q.i,Q.rMxU.r '
+
+ Q.l-Q.i"< Q.iJB Q.l,.Mq '
+ Q.i-Q.r"< Q.iJL .,Q.rMq '
+ '
+}
+
+! read commandline arguments !
+LR 0Xi 2LR 0Xo 2LR 0Xp 2LR 0Xn HK
+
+! copy all defines in input file beginning with prefix !
+EBQi <S#define^SQp; :Xa> EF
+
+! sort all defines !
+Ga ZJB 0,.Mq J
+
+! format as C/C++ array !
+I/*
+ * AUTOGENERATED - DO NOT EDIT
+ */
+#include <glib.h>
+
+#include "Qi"
+#include "symbols.h"
+
+static const SymbolList::Entry entries[] = {
+
+<
+ .,W.Xa 0K
+ I#ifdef QpQa
+
+ ^I{"Qa", V I ^EQp^EQa},
+#endif
+ L .-Z;
+>
+I};
+
+/* overwrites weak object in symbols.cpp */
+SymbolList Symbols::Qn(entries, G_N_ELEMENTS(entries));
+
+
+! write output file !
+EWQo
+
+EX
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;
+}
diff --git a/symbols.h b/symbols.h
new file mode 100644
index 0000000..735fdda
--- /dev/null
+++ b/symbols.h
@@ -0,0 +1,29 @@
+#ifndef __SYMBOLS_H
+#define __SYMBOLS_H
+
+#include <glib.h>
+
+class SymbolList {
+public:
+ struct Entry {
+ const gchar *name;
+ gint value;
+ };
+
+private:
+ const Entry *entries;
+ gint size;
+
+public:
+ SymbolList(const Entry *_entries = NULL, gint _size = 0)
+ : entries(_entries), size(_size) {}
+
+ gint lookup(const gchar *name);
+ GList *get_glist(void);
+};
+
+namespace Symbols {
+ extern SymbolList __attribute__((weak)) scintilla;
+}
+
+#endif