diff options
author | Robin Haberkorn <robin.haberkorn@googlemail.com> | 2012-12-05 07:37:17 +0100 |
---|---|---|
committer | Robin Haberkorn <robin.haberkorn@googlemail.com> | 2012-12-05 07:37:17 +0100 |
commit | a54b49f5a8858ae6603d0db56019adc3ce0dff90 (patch) | |
tree | 40894af980f74648a43d5c322e4501b3a400c4cd /src | |
parent | 29d54a4b19caf94b2efd2bd537e8c24f70e9520b (diff) | |
download | sciteco-a54b49f5a8858ae6603d0db56019adc3ce0dff90.tar.gz |
windows compatibility changes
* respect executable extensions
* do not use weak symbols which appear to be broken on MinGW.
Instead, the generated symbol constants contain constructor functions
initializing the corresponding objects. Constructor priorities are used
to ensure that the initialization takes place after the dummy (NULL)
initialization.
* do not change the working dir (causes trouble when sciteco gets passed
relative paths but the exe is not in the current dir)
instead look for teco.ini in program's directory
Diffstat (limited to 'src')
-rw-r--r-- | src/Makefile.am | 4 | ||||
-rw-r--r-- | src/main.cpp | 28 | ||||
-rwxr-xr-x | src/symbols-extract.tes | 9 | ||||
-rw-r--r-- | src/symbols.cpp | 6 | ||||
-rw-r--r-- | src/symbols.h | 6 |
5 files changed, 22 insertions, 31 deletions
diff --git a/src/Makefile.am b/src/Makefile.am index 81cf526..ff1f095 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -12,8 +12,8 @@ EXTRA_DIST = gtk-info-popup.gob \ if BOOTSTRAP noinst_PROGRAMS = sciteco-minimal -BOOTSTRAP_SCITECO = ./sciteco-minimal -symbols-scintilla.cpp symbols-scilexer.cpp : sciteco-minimal +BOOTSTRAP_SCITECO = ./sciteco-minimal$(EXEEXT) +symbols-scintilla.cpp symbols-scilexer.cpp : $(BOOTSTRAP_SCITECO) else BOOTSTRAP_SCITECO = @SCITECO@ endif diff --git a/src/main.cpp b/src/main.cpp index c93e542..2adb505 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -85,32 +85,22 @@ Interface::process_notify(SCNotification *notify) #ifdef G_OS_WIN32 /* - * keep program self-contained under Windows - * (look for profile in current directory) + * Keep program self-contained under Windows + * (look for profile in program's directory) */ static inline gchar * -get_teco_ini(void) -{ - return g_strdup(INI_FILE); -} - -/* - * Windows sometimes sets the current working directory to very obscure - * paths when opening files in the Explorer, but we have to read the - * teco.ini from the directory where our binary resides. - */ -static inline void -fix_cwd(const gchar *program) +get_teco_ini(const gchar *program) { gchar *bin_dir = g_path_get_dirname(program); - g_chdir(bin_dir); + gchar *ini = g_build_filename(bin_dir, INI_FILE, NULL); g_free(bin_dir); + return ini; } #else static inline gchar * -get_teco_ini(void) +get_teco_ini(const gchar *program __attribute__((unused))) { const gchar *home; @@ -122,8 +112,6 @@ get_teco_ini(void) return g_build_filename(home, INI_FILE, NULL); } -static inline void fix_cwd(const gchar *program __attribute__((unused))) {} - #endif /* !G_OS_WIN32 */ static inline void @@ -158,7 +146,7 @@ process_options(int &argc, char **&argv) exit(EXIT_FAILURE); } } else { - mung_file = get_teco_ini(); + mung_file = get_teco_ini(argv[0]); } interface.parse_args(argc, argv); @@ -172,8 +160,6 @@ main(int argc, char **argv) static GotoTable cmdline_goto_table; static QRegisterTable local_qregs; - fix_cwd(argv[0]); - process_options(argc, argv); interface.ssm(SCI_SETCARETSTYLE, CARETSTYLE_BLOCK); diff --git a/src/symbols-extract.tes b/src/symbols-extract.tes index 6497324..841530c 100755 --- a/src/symbols-extract.tes +++ b/src/symbols-extract.tes @@ -69,8 +69,13 @@ static const SymbolList::Entry entries[] = { .-Z;> I}; -/* overwrites weak object in symbols.cpp */ -SymbolList Symbols::Qn(entries, G_N_ELEMENTS(entries)); +__attribute__((constructor(2000))) +static void +initialize(void) +{ + Symbols::Qn.entries = entries; + Symbols::Qn.size = G_N_ELEMENTS(entries); +} ! write output file ! diff --git a/src/symbols.cpp b/src/symbols.cpp index 8772fc9..3cafaaa 100644 --- a/src/symbols.cpp +++ b/src/symbols.cpp @@ -26,11 +26,11 @@ #include "symbols.h" /* - * defaults for sciteco-minimal + * Constructors executed before the ones defined in generated code. */ namespace Symbols { - SymbolList __attribute__((weak)) scintilla; - SymbolList __attribute__((weak)) scilexer; + SymbolList __attribute__((init_priority(1000))) scintilla; + SymbolList __attribute__((init_priority(1000))) scilexer; } /* diff --git a/src/symbols.h b/src/symbols.h index dd8bcc4..58bf1ef 100644 --- a/src/symbols.h +++ b/src/symbols.h @@ -27,10 +27,10 @@ public: gint value; }; -private: const Entry *entries; gint size; +private: /* for auto-completions */ GList *list; @@ -48,8 +48,8 @@ public: }; namespace Symbols { - extern SymbolList __attribute__((weak)) scintilla; - extern SymbolList __attribute__((weak)) scilexer; + extern SymbolList scintilla; + extern SymbolList scilexer; } #endif |