forked from aniani/vim
updated for version 7.1-100
This commit is contained in:
204
src/if_cscope.c
204
src/if_cscope.c
@@ -24,11 +24,6 @@
|
|||||||
/* not UNIX, must be WIN32 */
|
/* not UNIX, must be WIN32 */
|
||||||
# include "vimio.h"
|
# include "vimio.h"
|
||||||
# include <fcntl.h>
|
# include <fcntl.h>
|
||||||
# include <process.h>
|
|
||||||
# define STDIN_FILENO 0
|
|
||||||
# define STDOUT_FILENO 1
|
|
||||||
# define STDERR_FILENO 2
|
|
||||||
# define pipe(fds) _pipe(fds, 256, O_TEXT|O_NOINHERIT)
|
|
||||||
#endif
|
#endif
|
||||||
#include "if_cscope.h"
|
#include "if_cscope.h"
|
||||||
|
|
||||||
@@ -65,7 +60,7 @@ static char * cs_manage_matches __ARGS((char **, char **, int, mcmd_e));
|
|||||||
static char * cs_parse_results __ARGS((int cnumber, char *buf, int bufsize, char **context, char **linenumber, char **search));
|
static char * cs_parse_results __ARGS((int cnumber, char *buf, int bufsize, char **context, char **linenumber, char **search));
|
||||||
static char * cs_pathcomponents __ARGS((char *path));
|
static char * cs_pathcomponents __ARGS((char *path));
|
||||||
static void cs_print_tags_priv __ARGS((char **, char **, int));
|
static void cs_print_tags_priv __ARGS((char **, char **, int));
|
||||||
static int cs_read_prompt __ARGS((int ));
|
static int cs_read_prompt __ARGS((int));
|
||||||
static void cs_release_csp __ARGS((int, int freefnpp));
|
static void cs_release_csp __ARGS((int, int freefnpp));
|
||||||
static int cs_reset __ARGS((exarg_T *eap));
|
static int cs_reset __ARGS((exarg_T *eap));
|
||||||
static char * cs_resolve_file __ARGS((int, char *));
|
static char * cs_resolve_file __ARGS((int, char *));
|
||||||
@@ -504,7 +499,7 @@ staterr:
|
|||||||
#if defined(UNIX)
|
#if defined(UNIX)
|
||||||
else if (S_ISREG(statbuf.st_mode) || S_ISLNK(statbuf.st_mode))
|
else if (S_ISREG(statbuf.st_mode) || S_ISLNK(statbuf.st_mode))
|
||||||
#else
|
#else
|
||||||
/* substitute define S_ISREG from os_unix.h */
|
/* WIN32 - substitute define S_ISREG from os_unix.h */
|
||||||
else if (((statbuf.st_mode) & S_IFMT) == S_IFREG)
|
else if (((statbuf.st_mode) & S_IFMT) == S_IFREG)
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
@@ -717,17 +712,23 @@ cs_create_cmd(csoption, pattern)
|
|||||||
cs_create_connection(i)
|
cs_create_connection(i)
|
||||||
int i;
|
int i;
|
||||||
{
|
{
|
||||||
int to_cs[2], from_cs[2], len;
|
#ifdef UNIX
|
||||||
char *prog, *cmd, *ppath = NULL;
|
int to_cs[2], from_cs[2];
|
||||||
#ifndef UNIX
|
#endif
|
||||||
int in_save, out_save, err_save;
|
int len;
|
||||||
long_i ph;
|
char *prog, *cmd, *ppath = NULL;
|
||||||
# ifdef FEAT_GUI
|
#ifdef WIN32
|
||||||
HWND activewnd = NULL;
|
int fd;
|
||||||
HWND consolewnd = NULL;
|
SECURITY_ATTRIBUTES sa;
|
||||||
# endif
|
PROCESS_INFORMATION pi;
|
||||||
|
STARTUPINFO si;
|
||||||
|
BOOL pipe_stdin = FALSE, pipe_stdout = FALSE;
|
||||||
|
HANDLE stdin_rd, stdout_rd;
|
||||||
|
HANDLE stdout_wr, stdin_wr;
|
||||||
|
BOOL created;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined(UNIX)
|
||||||
/*
|
/*
|
||||||
* Cscope reads from to_cs[0] and writes to from_cs[1]; vi reads from
|
* Cscope reads from to_cs[0] and writes to from_cs[1]; vi reads from
|
||||||
* from_cs[0] and writes to to_cs[1].
|
* from_cs[0] and writes to to_cs[1].
|
||||||
@@ -748,18 +749,12 @@ err_closing:
|
|||||||
return CSCOPE_FAILURE;
|
return CSCOPE_FAILURE;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(UNIX)
|
|
||||||
switch (csinfo[i].pid = fork())
|
switch (csinfo[i].pid = fork())
|
||||||
{
|
{
|
||||||
case -1:
|
case -1:
|
||||||
(void)EMSG(_("E622: Could not fork for cscope"));
|
(void)EMSG(_("E622: Could not fork for cscope"));
|
||||||
goto err_closing;
|
goto err_closing;
|
||||||
case 0: /* child: run cscope. */
|
case 0: /* child: run cscope. */
|
||||||
#else
|
|
||||||
in_save = dup(STDIN_FILENO);
|
|
||||||
out_save = dup(STDOUT_FILENO);
|
|
||||||
err_save = dup(STDERR_FILENO);
|
|
||||||
#endif
|
|
||||||
if (dup2(to_cs[0], STDIN_FILENO) == -1)
|
if (dup2(to_cs[0], STDIN_FILENO) == -1)
|
||||||
PERROR("cs_create_connection 1");
|
PERROR("cs_create_connection 1");
|
||||||
if (dup2(from_cs[1], STDOUT_FILENO) == -1)
|
if (dup2(from_cs[1], STDOUT_FILENO) == -1)
|
||||||
@@ -768,15 +763,32 @@ err_closing:
|
|||||||
PERROR("cs_create_connection 3");
|
PERROR("cs_create_connection 3");
|
||||||
|
|
||||||
/* close unused */
|
/* close unused */
|
||||||
#if defined(UNIX)
|
|
||||||
(void)close(to_cs[1]);
|
(void)close(to_cs[1]);
|
||||||
(void)close(from_cs[0]);
|
(void)close(from_cs[0]);
|
||||||
#else
|
#else
|
||||||
/* On win32 we must close opposite ends because we are the parent */
|
/* WIN32 */
|
||||||
(void)close(to_cs[0]);
|
/* Create pipes to communicate with cscope */
|
||||||
to_cs[0] = -1;
|
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
|
||||||
(void)close(from_cs[1]);
|
sa.bInheritHandle = TRUE;
|
||||||
from_cs[1] = -1;
|
sa.lpSecurityDescriptor = NULL;
|
||||||
|
|
||||||
|
if (!(pipe_stdin = CreatePipe(&stdin_rd, &stdin_wr, &sa, 0))
|
||||||
|
|| !(pipe_stdout = CreatePipe(&stdout_rd, &stdout_wr, &sa, 0)))
|
||||||
|
{
|
||||||
|
(void)EMSG(_("E566: Could not create cscope pipes"));
|
||||||
|
err_closing:
|
||||||
|
if (pipe_stdin)
|
||||||
|
{
|
||||||
|
CloseHandle(stdin_rd);
|
||||||
|
CloseHandle(stdin_wr);
|
||||||
|
}
|
||||||
|
if (pipe_stdout)
|
||||||
|
{
|
||||||
|
CloseHandle(stdout_rd);
|
||||||
|
CloseHandle(stdout_wr);
|
||||||
|
}
|
||||||
|
return CSCOPE_FAILURE;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
/* expand the cscope exec for env var's */
|
/* expand the cscope exec for env var's */
|
||||||
if ((prog = (char *)alloc(MAXPATHL + 1)) == NULL)
|
if ((prog = (char *)alloc(MAXPATHL + 1)) == NULL)
|
||||||
@@ -784,6 +796,7 @@ err_closing:
|
|||||||
#ifdef UNIX
|
#ifdef UNIX
|
||||||
return CSCOPE_FAILURE;
|
return CSCOPE_FAILURE;
|
||||||
#else
|
#else
|
||||||
|
/* WIN32 */
|
||||||
goto err_closing;
|
goto err_closing;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
@@ -800,6 +813,7 @@ err_closing:
|
|||||||
#ifdef UNIX
|
#ifdef UNIX
|
||||||
return CSCOPE_FAILURE;
|
return CSCOPE_FAILURE;
|
||||||
#else
|
#else
|
||||||
|
/* WIN32 */
|
||||||
goto err_closing;
|
goto err_closing;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
@@ -818,6 +832,7 @@ err_closing:
|
|||||||
#ifdef UNIX
|
#ifdef UNIX
|
||||||
return CSCOPE_FAILURE;
|
return CSCOPE_FAILURE;
|
||||||
#else
|
#else
|
||||||
|
/* WIN32 */
|
||||||
goto err_closing;
|
goto err_closing;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
@@ -826,6 +841,7 @@ err_closing:
|
|||||||
#if defined(UNIX)
|
#if defined(UNIX)
|
||||||
(void)sprintf(cmd, "exec %s -dl -f %s", prog, csinfo[i].fname);
|
(void)sprintf(cmd, "exec %s -dl -f %s", prog, csinfo[i].fname);
|
||||||
#else
|
#else
|
||||||
|
/* WIN32 */
|
||||||
(void)sprintf(cmd, "%s -dl -f %s", prog, csinfo[i].fname);
|
(void)sprintf(cmd, "%s -dl -f %s", prog, csinfo[i].fname);
|
||||||
#endif
|
#endif
|
||||||
if (csinfo[i].ppath != NULL)
|
if (csinfo[i].ppath != NULL)
|
||||||
@@ -851,60 +867,6 @@ err_closing:
|
|||||||
exit(127);
|
exit(127);
|
||||||
/* NOTREACHED */
|
/* NOTREACHED */
|
||||||
default: /* parent. */
|
default: /* parent. */
|
||||||
#else
|
|
||||||
# ifdef FEAT_GUI
|
|
||||||
activewnd = GetForegroundWindow(); /* on win9x cscope steals focus */
|
|
||||||
/* Dirty hack to hide annoying console window */
|
|
||||||
if (AllocConsole())
|
|
||||||
{
|
|
||||||
char *title;
|
|
||||||
title = (char *)alloc(1024);
|
|
||||||
if (title == NULL)
|
|
||||||
FreeConsole();
|
|
||||||
else
|
|
||||||
{
|
|
||||||
GetConsoleTitle(title, 1024); /* save for future restore */
|
|
||||||
SetConsoleTitle(
|
|
||||||
"GVIMCS{5499421B-CBEF-45b0-85EF-38167FDEA5C5}GVIMCS");
|
|
||||||
Sleep(40); /* as stated in MS KB we must wait 40 ms */
|
|
||||||
consolewnd = FindWindow(NULL,
|
|
||||||
"GVIMCS{5499421B-CBEF-45b0-85EF-38167FDEA5C5}GVIMCS");
|
|
||||||
if (consolewnd != NULL)
|
|
||||||
ShowWindow(consolewnd, SW_HIDE);
|
|
||||||
SetConsoleTitle(title);
|
|
||||||
vim_free(title);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
# endif
|
|
||||||
/* May be use &shell, &shellquote etc */
|
|
||||||
# ifdef __BORLANDC__
|
|
||||||
/* BCC 5.5 uses a different function name for spawnlp */
|
|
||||||
ph = (long_i)spawnlp(P_NOWAIT, prog, cmd, NULL);
|
|
||||||
# else
|
|
||||||
ph = (long_i)_spawnlp(_P_NOWAIT, prog, cmd, NULL);
|
|
||||||
# endif
|
|
||||||
vim_free(prog);
|
|
||||||
vim_free(cmd);
|
|
||||||
# ifdef FEAT_GUI
|
|
||||||
/* Dirty hack part two */
|
|
||||||
if (activewnd != NULL)
|
|
||||||
/* restoring focus */
|
|
||||||
SetForegroundWindow(activewnd);
|
|
||||||
if (consolewnd != NULL)
|
|
||||||
FreeConsole();
|
|
||||||
|
|
||||||
# endif
|
|
||||||
if (ph == -1)
|
|
||||||
{
|
|
||||||
PERROR(_("cs_create_connection exec failed"));
|
|
||||||
(void)EMSG(_("E623: Could not spawn cscope process"));
|
|
||||||
goto err_closing;
|
|
||||||
}
|
|
||||||
/* else */
|
|
||||||
csinfo[i].pid = 0;
|
|
||||||
csinfo[i].hProc = (HANDLE)ph;
|
|
||||||
|
|
||||||
#endif /* !UNIX */
|
|
||||||
/*
|
/*
|
||||||
* Save the file descriptors for later duplication, and
|
* Save the file descriptors for later duplication, and
|
||||||
* reopen as streams.
|
* reopen as streams.
|
||||||
@@ -914,22 +876,52 @@ err_closing:
|
|||||||
if ((csinfo[i].fr_fp = fdopen(from_cs[0], "r")) == NULL)
|
if ((csinfo[i].fr_fp = fdopen(from_cs[0], "r")) == NULL)
|
||||||
PERROR(_("cs_create_connection: fdopen for fr_fp failed"));
|
PERROR(_("cs_create_connection: fdopen for fr_fp failed"));
|
||||||
|
|
||||||
#if defined(UNIX)
|
|
||||||
/* close unused */
|
/* close unused */
|
||||||
(void)close(to_cs[0]);
|
(void)close(to_cs[0]);
|
||||||
(void)close(from_cs[1]);
|
(void)close(from_cs[1]);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
#else
|
#else
|
||||||
/* restore stdhandles */
|
/* WIN32 */
|
||||||
dup2(in_save, STDIN_FILENO);
|
/* Create a new process to run cscope and use pipes to talk with it */
|
||||||
dup2(out_save, STDOUT_FILENO);
|
GetStartupInfo(&si);
|
||||||
dup2(err_save, STDERR_FILENO);
|
si.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW;
|
||||||
close(in_save);
|
si.wShowWindow = SW_HIDE; /* Hide child application window */
|
||||||
close(out_save);
|
si.hStdOutput = stdout_wr;
|
||||||
close(err_save);
|
si.hStdError = stdout_wr;
|
||||||
#endif
|
si.hStdInput = stdin_rd;
|
||||||
|
created = CreateProcess(NULL, cmd, NULL, NULL, TRUE, CREATE_NEW_CONSOLE,
|
||||||
|
NULL, NULL, &si, &pi);
|
||||||
|
vim_free(prog);
|
||||||
|
vim_free(cmd);
|
||||||
|
|
||||||
|
if (!created)
|
||||||
|
{
|
||||||
|
PERROR(_("cs_create_connection exec failed"));
|
||||||
|
(void)EMSG(_("E623: Could not spawn cscope process"));
|
||||||
|
goto err_closing;
|
||||||
|
}
|
||||||
|
/* else */
|
||||||
|
csinfo[i].pid = pi.dwProcessId;
|
||||||
|
csinfo[i].hProc = pi.hProcess;
|
||||||
|
CloseHandle(pi.hThread);
|
||||||
|
|
||||||
|
/* TODO - tidy up after failure to create files on pipe handles. */
|
||||||
|
if (((fd = _open_osfhandle((intptr_t)stdin_wr, _O_TEXT|_O_APPEND)) < 0)
|
||||||
|
|| ((csinfo[i].to_fp = _fdopen(fd, "w")) == NULL))
|
||||||
|
PERROR(_("cs_create_connection: fdopen for to_fp failed"));
|
||||||
|
if (((fd = _open_osfhandle((intptr_t)stdout_rd, _O_TEXT|_O_RDONLY)) < 0)
|
||||||
|
|| ((csinfo[i].fr_fp = _fdopen(fd, "r")) == NULL))
|
||||||
|
PERROR(_("cs_create_connection: fdopen for fr_fp failed"));
|
||||||
|
|
||||||
|
/* Close handles for file descriptors inherited by the cscope process */
|
||||||
|
CloseHandle(stdin_rd);
|
||||||
|
CloseHandle(stdout_wr);
|
||||||
|
|
||||||
|
#endif /* !UNIX */
|
||||||
|
|
||||||
return CSCOPE_SUCCESS;
|
return CSCOPE_SUCCESS;
|
||||||
} /* cs_create_connection */
|
} /* cs_create_connection */
|
||||||
|
|
||||||
@@ -2097,8 +2089,8 @@ cs_read_prompt(i)
|
|||||||
/*
|
/*
|
||||||
* PRIVATE: cs_release_csp
|
* PRIVATE: cs_release_csp
|
||||||
*
|
*
|
||||||
* does the actual free'ing for the cs ptr with an optional flag of whether
|
* Does the actual free'ing for the cs ptr with an optional flag of whether
|
||||||
* or not to free the filename. called by cs_kill and cs_reset.
|
* or not to free the filename. Called by cs_kill and cs_reset.
|
||||||
*/
|
*/
|
||||||
static void
|
static void
|
||||||
cs_release_csp(i, freefnpp)
|
cs_release_csp(i, freefnpp)
|
||||||
@@ -2116,10 +2108,13 @@ cs_release_csp(i, freefnpp)
|
|||||||
(void)fputs("q\n", csinfo[i].to_fp);
|
(void)fputs("q\n", csinfo[i].to_fp);
|
||||||
(void)fflush(csinfo[i].to_fp);
|
(void)fflush(csinfo[i].to_fp);
|
||||||
}
|
}
|
||||||
/* give cscope chance to exit normally */
|
if (csinfo[i].hProc != NULL)
|
||||||
if (csinfo[i].hProc != NULL
|
{
|
||||||
&& WaitForSingleObject(csinfo[i].hProc, 1000) == WAIT_TIMEOUT)
|
/* Give cscope a chance to exit normally */
|
||||||
TerminateProcess(csinfo[i].hProc, 0);
|
if (WaitForSingleObject(csinfo[i].hProc, 1000) == WAIT_TIMEOUT)
|
||||||
|
TerminateProcess(csinfo[i].hProc, 0);
|
||||||
|
CloseHandle(csinfo[i].hProc);
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (csinfo[i].fr_fp != NULL)
|
if (csinfo[i].fr_fp != NULL)
|
||||||
@@ -2302,6 +2297,21 @@ cs_show(eap)
|
|||||||
return CSCOPE_SUCCESS;
|
return CSCOPE_SUCCESS;
|
||||||
} /* cs_show */
|
} /* cs_show */
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* PUBLIC: cs_end
|
||||||
|
*
|
||||||
|
* Only called when VIM exits to quit any cscope sessions.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
cs_end()
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < CSCOPE_MAX_CONNECTIONS; i++)
|
||||||
|
cs_release_csp(i, TRUE);
|
||||||
|
}
|
||||||
|
|
||||||
#endif /* FEAT_CSCOPE */
|
#endif /* FEAT_CSCOPE */
|
||||||
|
|
||||||
/* the end */
|
/* the end */
|
||||||
|
@@ -72,7 +72,7 @@ typedef struct csi {
|
|||||||
ino_t st_ino; /* inode number of cscope db */
|
ino_t st_ino; /* inode number of cscope db */
|
||||||
#else
|
#else
|
||||||
# if defined(WIN32)
|
# if defined(WIN32)
|
||||||
int pid; /* Can't get pid so set it to 0 ;) */
|
DWORD pid; /* PID of the connected cscope process. */
|
||||||
HANDLE hProc; /* cscope process handle */
|
HANDLE hProc; /* cscope process handle */
|
||||||
DWORD nVolume; /* Volume serial number, instead of st_dev */
|
DWORD nVolume; /* Volume serial number, instead of st_dev */
|
||||||
DWORD nIndexHigh; /* st_ino has no meaning in the Windows */
|
DWORD nIndexHigh; /* st_ino has no meaning in the Windows */
|
||||||
|
11
src/main.c
11
src/main.c
@@ -1331,6 +1331,9 @@ getout(exitval)
|
|||||||
#ifdef FEAT_NETBEANS_INTG
|
#ifdef FEAT_NETBEANS_INTG
|
||||||
netbeans_end();
|
netbeans_end();
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef FEAT_CSCOPE
|
||||||
|
cs_end();
|
||||||
|
#endif
|
||||||
|
|
||||||
mch_exit(exitval);
|
mch_exit(exitval);
|
||||||
}
|
}
|
||||||
@@ -3671,7 +3674,13 @@ build_drop_cmd(filec, filev, tabs, sendReply)
|
|||||||
mainerr_arg_missing((char_u *)filev[-1]);
|
mainerr_arg_missing((char_u *)filev[-1]);
|
||||||
if (mch_dirname(cwd, MAXPATHL) != OK)
|
if (mch_dirname(cwd, MAXPATHL) != OK)
|
||||||
return NULL;
|
return NULL;
|
||||||
if ((p = vim_strsave_escaped_ext(cwd, PATH_ESC_CHARS, '\\', TRUE)) == NULL)
|
if ((p = vim_strsave_escaped_ext(cwd,
|
||||||
|
#ifdef BACKSLASH_IN_FILENAME
|
||||||
|
"", /* rem_backslash() will tell what chars to escape */
|
||||||
|
#else
|
||||||
|
PATH_ESC_CHARS,
|
||||||
|
#endif
|
||||||
|
'\\', TRUE)) == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
ga_init2(&ga, 1, 100);
|
ga_init2(&ga, 1, 100);
|
||||||
ga_concat(&ga, (char_u *)"<C-\\><C-N>:cd ");
|
ga_concat(&ga, (char_u *)"<C-\\><C-N>:cd ");
|
||||||
|
@@ -6,4 +6,5 @@ int cs_fgets __ARGS((char_u *buf, int size));
|
|||||||
void cs_free_tags __ARGS((void));
|
void cs_free_tags __ARGS((void));
|
||||||
void cs_print_tags __ARGS((void));
|
void cs_print_tags __ARGS((void));
|
||||||
int cs_connection __ARGS((int num, char_u *dbpath, char_u *ppath));
|
int cs_connection __ARGS((int num, char_u *dbpath, char_u *ppath));
|
||||||
|
void cs_end __ARGS((void));
|
||||||
/* vim: set ft=c : */
|
/* vim: set ft=c : */
|
||||||
|
@@ -666,6 +666,8 @@ static char *(features[]) =
|
|||||||
|
|
||||||
static int included_patches[] =
|
static int included_patches[] =
|
||||||
{ /* Add new patch number below this line */
|
{ /* Add new patch number below this line */
|
||||||
|
/**/
|
||||||
|
100,
|
||||||
/**/
|
/**/
|
||||||
99,
|
99,
|
||||||
/**/
|
/**/
|
||||||
|
Reference in New Issue
Block a user