diff options
-rw-r--r-- | .gitignore | 2 | ||||
-rw-r--r-- | Makefile | 20 | ||||
-rwxr-xr-x | symbols-extract.tes | 80 | ||||
-rw-r--r-- | symbols.cpp | 47 | ||||
-rw-r--r-- | symbols.h | 29 |
5 files changed, 173 insertions, 5 deletions
@@ -1,10 +1,12 @@ # Generated code gtk-info-popup*.[ch] +symbols-*.cpp *.o *.a *.exe sciteco +sciteco-minimal *~ # SciTECO save points @@ -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 |