diff -pur global-6.3/gtags.conf.in global-6-3/gtags.conf.in --- global-6.3/gtags.conf.in 2014-06-09 10:46:06 +1000 +++ global-6-3/gtags.conf.in 2014-06-13 16:19:58 +1000 @@ -51,7 +51,7 @@ builtin-parser:\ user-custom|User custom plugin parser:\ :tc=common:\ :langmap=c\:.c.h:\ - :gtags_parser=c\:@prefix@/lib/gtags/user-custom.la: + :gtags_parser=c\:@libdir@/gtags/user-custom.la: # # Plug-in parser to use Exuberant Ctags. # @@ -96,45 +96,45 @@ exuberant-ctags|plugin-example|setting t :langmap=VHDL\:.vhdl.vhd:\ :langmap=Vim\:.vim:\ :langmap=YACC\:.y:\ - :gtags_parser=Asm\:@prefix@/lib/gtags/exuberant-ctags.la:\ - :gtags_parser=Asp\:@prefix@/lib/gtags/exuberant-ctags.la:\ - :gtags_parser=Awk\:@prefix@/lib/gtags/exuberant-ctags.la:\ - :gtags_parser=Basic\:@prefix@/lib/gtags/exuberant-ctags.la:\ - :gtags_parser=BETA\:@prefix@/lib/gtags/exuberant-ctags.la:\ - :gtags_parser=C\:@prefix@/lib/gtags/exuberant-ctags.la:\ - :gtags_parser=C++\:@prefix@/lib/gtags/exuberant-ctags.la:\ - :gtags_parser=C#\:@prefix@/lib/gtags/exuberant-ctags.la:\ - :gtags_parser=Cobol\:@prefix@/lib/gtags/exuberant-ctags.la:\ - :gtags_parser=DosBatch\:@prefix@/lib/gtags/exuberant-ctags.la:\ - :gtags_parser=Eiffel\:@prefix@/lib/gtags/exuberant-ctags.la:\ - :gtags_parser=Erlang\:@prefix@/lib/gtags/exuberant-ctags.la:\ - :gtags_parser=Flex\:@prefix@/lib/gtags/exuberant-ctags.la:\ - :gtags_parser=Fortran\:@prefix@/lib/gtags/exuberant-ctags.la:\ - :gtags_parser=HTML\:@prefix@/lib/gtags/exuberant-ctags.la:\ - :gtags_parser=Java\:@prefix@/lib/gtags/exuberant-ctags.la:\ - :gtags_parser=JavaScript\:@prefix@/lib/gtags/exuberant-ctags.la:\ - :gtags_parser=Lisp\:@prefix@/lib/gtags/exuberant-ctags.la:\ - :gtags_parser=Lua\:@prefix@/lib/gtags/exuberant-ctags.la:\ - :gtags_parser=MatLab\:@prefix@/lib/gtags/exuberant-ctags.la:\ - :gtags_parser=OCaml\:@prefix@/lib/gtags/exuberant-ctags.la:\ - :gtags_parser=Pascal\:@prefix@/lib/gtags/exuberant-ctags.la:\ - :gtags_parser=Perl\:@prefix@/lib/gtags/exuberant-ctags.la:\ - :gtags_parser=PHP\:@prefix@/lib/gtags/exuberant-ctags.la:\ - :gtags_parser=Python\:@prefix@/lib/gtags/exuberant-ctags.la:\ - :gtags_parser=REXX\:@prefix@/lib/gtags/exuberant-ctags.la:\ - :gtags_parser=Ruby\:@prefix@/lib/gtags/exuberant-ctags.la:\ - :gtags_parser=Scheme\:@prefix@/lib/gtags/exuberant-ctags.la:\ - :gtags_parser=Sh\:@prefix@/lib/gtags/exuberant-ctags.la:\ - :gtags_parser=SLang\:@prefix@/lib/gtags/exuberant-ctags.la:\ - :gtags_parser=SML\:@prefix@/lib/gtags/exuberant-ctags.la:\ - :gtags_parser=SQL\:@prefix@/lib/gtags/exuberant-ctags.la:\ - :gtags_parser=Tcl\:@prefix@/lib/gtags/exuberant-ctags.la:\ - :gtags_parser=Tex\:@prefix@/lib/gtags/exuberant-ctags.la:\ - :gtags_parser=Vera\:@prefix@/lib/gtags/exuberant-ctags.la:\ - :gtags_parser=Verilog\:@prefix@/lib/gtags/exuberant-ctags.la:\ - :gtags_parser=VHDL\:@prefix@/lib/gtags/exuberant-ctags.la:\ - :gtags_parser=Vim\:@prefix@/lib/gtags/exuberant-ctags.la:\ - :gtags_parser=YACC\:@prefix@/lib/gtags/exuberant-ctags.la: + :gtags_parser=Asm\:@libdir@/gtags/exuberant-ctags.la:\ + :gtags_parser=Asp\:@libdir@/gtags/exuberant-ctags.la:\ + :gtags_parser=Awk\:@libdir@/gtags/exuberant-ctags.la:\ + :gtags_parser=Basic\:@libdir@/gtags/exuberant-ctags.la:\ + :gtags_parser=BETA\:@libdir@/gtags/exuberant-ctags.la:\ + :gtags_parser=C\:@libdir@/gtags/exuberant-ctags.la:\ + :gtags_parser=C++\:@libdir@/gtags/exuberant-ctags.la:\ + :gtags_parser=C#\:@libdir@/gtags/exuberant-ctags.la:\ + :gtags_parser=Cobol\:@libdir@/gtags/exuberant-ctags.la:\ + :gtags_parser=DosBatch\:@libdir@/gtags/exuberant-ctags.la:\ + :gtags_parser=Eiffel\:@libdir@/gtags/exuberant-ctags.la:\ + :gtags_parser=Erlang\:@libdir@/gtags/exuberant-ctags.la:\ + :gtags_parser=Flex\:@libdir@/gtags/exuberant-ctags.la:\ + :gtags_parser=Fortran\:@libdir@/gtags/exuberant-ctags.la:\ + :gtags_parser=HTML\:@libdir@/gtags/exuberant-ctags.la:\ + :gtags_parser=Java\:@libdir@/gtags/exuberant-ctags.la:\ + :gtags_parser=JavaScript\:@libdir@/gtags/exuberant-ctags.la:\ + :gtags_parser=Lisp\:@libdir@/gtags/exuberant-ctags.la:\ + :gtags_parser=Lua\:@libdir@/gtags/exuberant-ctags.la:\ + :gtags_parser=MatLab\:@libdir@/gtags/exuberant-ctags.la:\ + :gtags_parser=OCaml\:@libdir@/gtags/exuberant-ctags.la:\ + :gtags_parser=Pascal\:@libdir@/gtags/exuberant-ctags.la:\ + :gtags_parser=Perl\:@libdir@/gtags/exuberant-ctags.la:\ + :gtags_parser=PHP\:@libdir@/gtags/exuberant-ctags.la:\ + :gtags_parser=Python\:@libdir@/gtags/exuberant-ctags.la:\ + :gtags_parser=REXX\:@libdir@/gtags/exuberant-ctags.la:\ + :gtags_parser=Ruby\:@libdir@/gtags/exuberant-ctags.la:\ + :gtags_parser=Scheme\:@libdir@/gtags/exuberant-ctags.la:\ + :gtags_parser=Sh\:@libdir@/gtags/exuberant-ctags.la:\ + :gtags_parser=SLang\:@libdir@/gtags/exuberant-ctags.la:\ + :gtags_parser=SML\:@libdir@/gtags/exuberant-ctags.la:\ + :gtags_parser=SQL\:@libdir@/gtags/exuberant-ctags.la:\ + :gtags_parser=Tcl\:@libdir@/gtags/exuberant-ctags.la:\ + :gtags_parser=Tex\:@libdir@/gtags/exuberant-ctags.la:\ + :gtags_parser=Vera\:@libdir@/gtags/exuberant-ctags.la:\ + :gtags_parser=Verilog\:@libdir@/gtags/exuberant-ctags.la:\ + :gtags_parser=VHDL\:@libdir@/gtags/exuberant-ctags.la:\ + :gtags_parser=Vim\:@libdir@/gtags/exuberant-ctags.la:\ + :gtags_parser=YACC\:@libdir@/gtags/exuberant-ctags.la: # # Drupal configuration. # diff -pur global-6.3/libparser/parser.c global-6-3/libparser/parser.c --- global-6.3/libparser/parser.c 2014-06-09 10:46:06 +1000 +++ global-6-3/libparser/parser.c 2014-06-13 16:19:58 +1000 @@ -31,6 +31,11 @@ #include #endif #include +#if defined(_WIN32) && !defined(__CYGWIN__) +#define WIN32_LEAN_AND_MEAN +#include +#undef SLIST_ENTRY +#endif #include "parser.h" #include "internal.h" @@ -171,6 +176,11 @@ load_plugin_parser(const char *pluginspe if (p != NULL) *p++ = '\0'; q = strchr(lt_dl_name, ':'); +#ifdef _WIN32 + /* Assume a single-character name is a drive letter. */ + if (q == lt_dl_name + 1) + q = strchr(q + 1, ':'); +#endif if (q == NULL) { parser_name = "parser"; } else { @@ -179,11 +189,37 @@ load_plugin_parser(const char *pluginspe die_with_code(2, "syntax error in pluginspec '%s'.", pluginspec); parser_name = q; } +#if defined(_WIN32) && !defined(__CYGWIN__) + /* Bypass libtool and load the DLL directly, relative to us. */ + pent->handle = (lt_dlhandle)LoadLibrary(lt_dl_name); + if (pent->handle == NULL) { + q = strrchr(lt_dl_name, '/'); + if (q == NULL) + q = strrchr(lt_dl_name, '\\'); + if (q != NULL) + lt_dl_name = q + 1; + q = strrchr(lt_dl_name, '.'); + if (q != NULL && strcmp(q, ".la") == 0) + *q = '\0'; + pent->handle = (lt_dlhandle)LoadLibrary(lt_dl_name); + if (pent->handle == NULL) { + char dll[MAX_PATH]; + q = strrchr(_pgmptr, '\\'); + _snprintf(dll, MAX_PATH, "%.*s\\..\\lib\\gtags\\%s", q - _pgmptr, _pgmptr, lt_dl_name); + pent->handle = (lt_dlhandle)LoadLibrary(dll); + } + } + if (pent->handle == NULL) + die_with_code(2, "cannot open shared object '%s'.", lt_dl_name); + pent->entry.lt_dl_name = lt_dl_name; + pent->entry.parser = (PVOID)GetProcAddress((HINSTANCE)pent->handle, parser_name); +#else pent->handle = lt_dlopen(lt_dl_name); if (pent->handle == NULL) die_with_code(2, "cannot open shared object '%s'.", lt_dl_name); pent->entry.lt_dl_name = lt_dl_name; pent->entry.parser = lt_dlsym(pent->handle, parser_name); +#endif if (pent->entry.parser == NULL) die_with_code(2, "cannot find symbol '%s' in '%s'.", parser_name, lt_dl_name); pent->entry.parser_name = parser_name; @@ -205,7 +241,11 @@ unload_plugin_parser(void) return; while (!STAILQ_EMPTY(&plugin_list)) { pent = STAILQ_FIRST(&plugin_list); +#if defined(_WIN32) && !defined(__CYGWIN__) + FreeLibrary((HINSTANCE)pent->handle); +#else lt_dlclose(pent->handle); +#endif STAILQ_REMOVE_HEAD(&plugin_list, next); free(pent); } diff -pur global-6.3/plugin-factory/exuberant-ctags.c global-6-3/plugin-factory/exuberant-ctags.c --- global-6.3/plugin-factory/exuberant-ctags.c 2014-06-09 10:46:06 +1000 +++ global-6-3/plugin-factory/exuberant-ctags.c 2014-06-13 16:19:58 +1000 @@ -22,9 +22,6 @@ #include #endif #include -#if !defined(_WIN32) || defined(__CYGWIN__) -#include -#endif #include #include #include @@ -51,24 +48,15 @@ #define LANGMAP_OPTION "--langmap=" #define INITIAL_BUFSIZE 1024 -static char *argv[] = { - EXUBERANT_CTAGS, - NULL, -#ifdef USE_TYPE_STRING - "--gtags", -#endif - "-xu", - "--filter", - "--filter-terminator=" TERMINATOR "\n", - "--format=1", - NULL -}; -static pid_t pid; static FILE *ip, *op; static char *linebuf; static size_t bufsize; static char *ctagsnotfound = "Exuberant Ctags not found. Please see ./configure --help."; +#ifdef __GNUC__ +static void terminate_ctags(void) __attribute__((destructor)); +#endif + static void copy_langmap_converting_cpp(char *dst, const char *src) { @@ -89,6 +77,84 @@ copy_langmap_converting_cpp(char *dst, c strcpy(dst, src); } +#if defined(_WIN32) && !defined(__CYGWIN__) +#define WIN32_LEAN_AND_MEAN +#include +#include +static HANDLE pid; +static char argv[] = "ctags " + "--gtags " + "-xu --filter --filter-terminator=" TERMINATOR "\n " + "--format=1 " LANGMAP_OPTION; +static void +start_ctags(const struct parser_param *param) +{ + HANDLE opipe[2], ipipe[2]; + SECURITY_ATTRIBUTES sa; + STARTUPINFO si; + PROCESS_INFORMATION pi; + char* arg; + + arg = malloc(sizeof(argv) + strlen(param->langmap)); + if (arg == NULL) + param->die("short of memory."); + strcpy(arg, argv); + copy_langmap_converting_cpp(arg + sizeof(argv) - 1, param->langmap); + + sa.nLength = sizeof(sa); + sa.bInheritHandle = TRUE; + sa.lpSecurityDescriptor = NULL; + if (!CreatePipe(&opipe[0], &opipe[1], &sa, 0) || + !CreatePipe(&ipipe[0], &ipipe[1], &sa, 0)) + param->die("CreatePipe failed."); + SetHandleInformation(opipe[1], HANDLE_FLAG_INHERIT, 0); + SetHandleInformation(ipipe[0], HANDLE_FLAG_INHERIT, 0); + ZeroMemory(&si, sizeof(si)); + si.cb = sizeof(si); + si.hStdInput = opipe[0]; + si.hStdOutput = ipipe[1]; + si.hStdError = GetStdHandle(STD_ERROR_HANDLE); + si.dwFlags = STARTF_USESTDHANDLES; + CreateProcess(NULL, arg, NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi); + CloseHandle(opipe[0]); + CloseHandle(ipipe[1]); + CloseHandle(pi.hThread); + pid = pi.hProcess; + op = fdopen(_open_osfhandle((long)opipe[1], _O_WRONLY), "w"); + ip = fdopen(_open_osfhandle((long)ipipe[0], _O_RDONLY), "r"); + if (ip == NULL || op == NULL) + param->die("fdopen failed."); + + bufsize = INITIAL_BUFSIZE; + linebuf = malloc(bufsize); + if (linebuf == NULL) + param->die("short of memory."); +} +static void +terminate_ctags(void) { + if (op == NULL) + return; + free(linebuf); + fclose(op); + fclose(ip); + WaitForSingleObject(pid, INFINITE); + CloseHandle(pid); +} +#else +#include +static pid_t pid; +static char *argv[] = { + EXUBERANT_CTAGS, + NULL, +#ifdef USE_TYPE_STRING + "--gtags", +#endif + "-xu", + "--filter", + "--filter-terminator=" TERMINATOR "\n", + "--format=1", + NULL +}; static void start_ctags(const struct parser_param *param) { @@ -134,10 +200,6 @@ start_ctags(const struct parser_param *p param->die("short of memory."); } -#ifdef __GNUC__ -static void terminate_ctags(void) __attribute__((destructor)); -#endif - static void terminate_ctags(void) { @@ -149,6 +211,7 @@ terminate_ctags(void) while (waitpid(pid, NULL, 0) < 0 && errno == EINTR) ; } +#endif static char * get_line(const struct parser_param *param) diff -pur global-6.3/plugin-factory/Makefile.am global-6-3/plugin-factory/Makefile.am --- global-6.3/plugin-factory/Makefile.am 2014-06-09 10:46:06 +1000 +++ global-6-3/plugin-factory/Makefile.am 2014-06-13 16:19:57 +1000 @@ -10,15 +10,15 @@ # WITHOUT ANY WARRANTY, to the extent permitted by law; without even the # implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # -plugindir = ${libdir}/gtags +plugindir = ${prefix}/lib/gtags plugin_LTLIBRARIES = exuberant-ctags.la user-custom.la exuberant_ctags_la_SOURCES = exuberant-ctags.c -exuberant_ctags_la_LDFLAGS = -module -avoid-version +exuberant_ctags_la_LDFLAGS = -module -avoid-version -no-undefined # skeleton user_custom_la_SOURCES = user-custom.c -user_custom_la_LDFLAGS = -module -avoid-version +user_custom_la_LDFLAGS = -module -avoid-version -no-undefined gtagsdir = ${datadir}/gtags gtags_DATA = PLUGIN_HOWTO diff -pur global-6.3/plugin-factory/Makefile.in global-6-3/plugin-factory/Makefile.in --- global-6.3/plugin-factory/Makefile.in 2014-06-09 10:46:16 +1000 +++ global-6-3/plugin-factory/Makefile.in 2014-06-13 16:19:58 +1000 @@ -359,14 +359,14 @@ top_srcdir = @top_srcdir@ # WITHOUT ANY WARRANTY, to the extent permitted by law; without even the # implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # -plugindir = ${libdir}/gtags +plugindir = ${prefix}/lib/gtags plugin_LTLIBRARIES = exuberant-ctags.la user-custom.la exuberant_ctags_la_SOURCES = exuberant-ctags.c -exuberant_ctags_la_LDFLAGS = -module -avoid-version +exuberant_ctags_la_LDFLAGS = -module -avoid-version -no-undefined # skeleton user_custom_la_SOURCES = user-custom.c -user_custom_la_LDFLAGS = -module -avoid-version +user_custom_la_LDFLAGS = -module -avoid-version -no-undefined gtagsdir = ${datadir}/gtags gtags_DATA = PLUGIN_HOWTO EXTRA_DIST = $(gtags_DATA)