Blob Blame History Raw
To: vim-dev@vim.org
Subject: Patch 7.2.228
Fcc: outbox
From: Bram Moolenaar <Bram@moolenaar.net>
Mime-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
------------

Patch 7.2.228
Problem:    Cscope is limited to 8 connections.
Solution:   Allocated the connection array to handle any number of
	    connections. (Dominique Pelle)
Files:	    runtime/doc/if_cscop.txt, src/if_cscope.h, src/if_cscope.c


*** ../vim-7.2.227/runtime/doc/if_cscop.txt	2009-03-18 14:30:46.000000000 +0100
--- runtime/doc/if_cscop.txt	2009-07-09 15:40:48.000000000 +0200
***************
*** 355,367 ****
  The DJGPP-built version from http://cscope.sourceforge.net is known to not
  work with Vim.
  
! There are a couple of hard-coded limitations:
! 
!     1. The maximum number of cscope connections allowed is 8.  Do you
!     really need more?
! 
!     2. Doing a |:tjump| when |:cstag| searches the tag files is not
!     configurable (e.g., you can't do a tselect instead).
  
  ==============================================================================
  6. Suggested usage					*cscope-suggestions*
--- 355,362 ----
  The DJGPP-built version from http://cscope.sourceforge.net is known to not
  work with Vim.
  
! Hard-coded limitation: doing a |:tjump| when |:cstag| searches the tag files
! is not configurable (e.g., you can't do a tselect instead).
  
  ==============================================================================
  6. Suggested usage					*cscope-suggestions*
*** ../vim-7.2.227/src/if_cscope.h	2008-08-25 04:35:13.000000000 +0200
--- src/if_cscope.h	2009-07-09 15:39:32.000000000 +0200
***************
*** 25,31 ****
  
  #define CSCOPE_SUCCESS		0
  #define CSCOPE_FAILURE		-1
- #define CSCOPE_MAX_CONNECTIONS	8   /* you actually need more? */
  
  #define	CSCOPE_DBFILE		"cscope.out"
  #define	CSCOPE_PROMPT		">> "
--- 25,30 ----
*** ../vim-7.2.227/src/if_cscope.c	2009-05-16 17:29:37.000000000 +0200
--- src/if_cscope.c	2009-07-09 15:39:32.000000000 +0200
***************
*** 46,52 ****
  static int	    cs_find __ARGS((exarg_T *eap));
  static int	    cs_find_common __ARGS((char *opt, char *pat, int, int, int));
  static int	    cs_help __ARGS((exarg_T *eap));
- static void	    cs_init __ARGS((void));
  static void	    clear_csinfo __ARGS((int i));
  static int	    cs_insert_filelist __ARGS((char *, char *, char *,
  			struct stat *));
--- 46,51 ----
***************
*** 66,72 ****
  static int	    cs_show __ARGS((exarg_T *eap));
  
  
! static csinfo_T	    csinfo[CSCOPE_MAX_CONNECTIONS];
  static int	    eap_arg_len;    /* length of eap->arg, set in
  				       cs_lookup_cmd() */
  static cscmd_T	    cs_cmds[] =
--- 65,74 ----
  static int	    cs_show __ARGS((exarg_T *eap));
  
  
! static csinfo_T *   csinfo = NULL;
! static int	    csinfo_size = 0;	/* number of items allocated in
! 					   csinfo[] */
! 
  static int	    eap_arg_len;    /* length of eap->arg, set in
  				       cs_lookup_cmd() */
  static cscmd_T	    cs_cmds[] =
***************
*** 144,166 ****
  	}
      case EXP_CSCOPE_KILL:
  	{
! 	    static char_u	connection[2];
  
  	    /* ":cscope kill" accepts connection numbers or partial names of
  	     * the pathname of the cscope database as argument.  Only complete
  	     * with connection numbers. -1 can also be used to kill all
  	     * connections. */
! 	    for (i = 0, current_idx = 0; i < CSCOPE_MAX_CONNECTIONS; i++)
  	    {
  		if (csinfo[i].fname == NULL)
  		    continue;
  		if (current_idx++ == idx)
  		{
! 		    /* Connection number fits in one character since
! 		     * CSCOPE_MAX_CONNECTIONS is < 10 */
! 		    connection[0] = i + '0';
! 		    connection[1] = NUL;
! 		    return connection;
  		}
  	    }
  	    return (current_idx == idx && idx > 0) ? (char_u *)"-1" : NULL;
--- 146,165 ----
  	}
      case EXP_CSCOPE_KILL:
  	{
! 	    static char	connection[5];
  
  	    /* ":cscope kill" accepts connection numbers or partial names of
  	     * the pathname of the cscope database as argument.  Only complete
  	     * with connection numbers. -1 can also be used to kill all
  	     * connections. */
! 	    for (i = 0, current_idx = 0; i < csinfo_size; i++)
  	    {
  		if (csinfo[i].fname == NULL)
  		    continue;
  		if (current_idx++ == idx)
  		{
! 		    vim_snprintf(connection, sizeof(connection), "%d", i);
! 		    return (char_u *)connection;
  		}
  	    }
  	    return (current_idx == idx && idx > 0) ? (char_u *)"-1" : NULL;
***************
*** 223,229 ****
  {
      cscmd_T *cmdp;
  
-     cs_init();
      if ((cmdp = cs_lookup_cmd(eap)) == NULL)
      {
  	cs_help(eap);
--- 222,227 ----
***************
*** 284,291 ****
  {
      int ret = FALSE;
  
-     cs_init();
- 
      if (*eap->arg == NUL)
      {
  	(void)EMSG(_("E562: Usage: cstag <ident>"));
--- 282,287 ----
***************
*** 441,447 ****
      if (num < 0 || num > 4 || (num > 0 && !dbpath))
  	return FALSE;
  
!     for (i = 0; i < CSCOPE_MAX_CONNECTIONS; i++)
      {
  	if (!csinfo[i].fname)
  	    continue;
--- 437,443 ----
      if (num < 0 || num > 4 || (num > 0 && !dbpath))
  	return FALSE;
  
!     for (i = 0; i < csinfo_size; i++)
      {
  	if (!csinfo[i].fname)
  	    continue;
***************
*** 684,690 ****
      short i;
      short cnt = 0;
  
!     for (i = 0; i < CSCOPE_MAX_CONNECTIONS; i++)
      {
  	if (csinfo[i].fname != NULL)
  	    cnt++;
--- 680,686 ----
      short i;
      short cnt = 0;
  
!     for (i = 0; i < csinfo_size; i++)
      {
  	if (csinfo[i].fname != NULL)
  	    cnt++;
***************
*** 1112,1118 ****
  {
      int i;
      char *cmd;
!     int nummatches[CSCOPE_MAX_CONNECTIONS], totmatches;
  #ifdef FEAT_QUICKFIX
      char cmdletter;
      char *qfpos;
--- 1108,1115 ----
  {
      int i;
      char *cmd;
!     int *nummatches;
!     int totmatches;
  #ifdef FEAT_QUICKFIX
      char cmdletter;
      char *qfpos;
***************
*** 1123,1135 ****
      if (cmd == NULL)
  	return FALSE;
  
      /* send query to all open connections, then count the total number
       * of matches so we can alloc matchesp all in one swell foop
       */
!     for (i = 0; i < CSCOPE_MAX_CONNECTIONS; i++)
  	nummatches[i] = 0;
      totmatches = 0;
!     for (i = 0; i < CSCOPE_MAX_CONNECTIONS; i++)
      {
  	if (csinfo[i].fname == NULL || csinfo[i].to_fp == NULL)
  	    continue;
--- 1120,1136 ----
      if (cmd == NULL)
  	return FALSE;
  
+     nummatches = (int *)alloc(sizeof(int)*csinfo_size);
+     if (nummatches == NULL)
+ 	return FALSE;
+ 
      /* send query to all open connections, then count the total number
       * of matches so we can alloc matchesp all in one swell foop
       */
!     for (i = 0; i < csinfo_size; i++)
  	nummatches[i] = 0;
      totmatches = 0;
!     for (i = 0; i < csinfo_size; i++)
      {
  	if (csinfo[i].fname == NULL || csinfo[i].to_fp == NULL)
  	    continue;
***************
*** 1154,1160 ****
--- 1155,1164 ----
  	char *buf;
  
  	if (!verbose)
+ 	{
+ 	    vim_free(nummatches);
  	    return FALSE;
+ 	}
  
  	buf = (char *)alloc((unsigned)(strlen(opt) + strlen(pat) + strlen(nf)));
  	if (buf == NULL)
***************
*** 1165,1170 ****
--- 1169,1175 ----
  	    (void)EMSG(buf);
  	    vim_free(buf);
  	}
+ 	vim_free(nummatches);
  	return FALSE;
      }
  
***************
*** 1217,1222 ****
--- 1222,1228 ----
  		(void)EMSG(buf);
  		vim_free(buf);
  	    }
+ 	    vim_free(nummatches);
  	    return FALSE;
  	}
      }
***************
*** 1264,1269 ****
--- 1270,1276 ----
  	}
  	mch_remove(tmp);
  	vim_free(tmp);
+ 	vim_free(nummatches);
  	return TRUE;
      }
      else
***************
*** 1275,1280 ****
--- 1282,1288 ----
  	/* read output */
  	cs_fill_results((char *)pat, totmatches, nummatches, &matches,
  							 &contexts, &matched);
+ 	vim_free(nummatches);
  	if (matches == NULL)
  	    return FALSE;
  
***************
*** 1328,1353 ****
  } /* cs_help */
  
  
- /*
-  * PRIVATE: cs_init
-  *
-  * initialize cscope structure if not already
-  */
-     static void
- cs_init()
- {
-     short i;
-     static int init_already = FALSE;
- 
-     if (init_already)
- 	return;
- 
-     for (i = 0; i < CSCOPE_MAX_CONNECTIONS; i++)
- 	clear_csinfo(i);
- 
-     init_already = TRUE;
- } /* cs_init */
- 
      static void
  clear_csinfo(i)
      int	    i;
--- 1336,1341 ----
***************
*** 1444,1450 ****
  #endif
  
      i = -1; /* can be set to the index of an empty item in csinfo */
!     for (j = 0; j < CSCOPE_MAX_CONNECTIONS; j++)
      {
  	if (csinfo[j].fname != NULL
  #if defined(UNIX)
--- 1432,1438 ----
  #endif
  
      i = -1; /* can be set to the index of an empty item in csinfo */
!     for (j = 0; j < csinfo_size; j++)
      {
  	if (csinfo[j].fname != NULL
  #if defined(UNIX)
***************
*** 1471,1479 ****
  
      if (i == -1)
      {
! 	if (p_csverbose)
! 	    (void)EMSG(_("E569: maximum number of cscope connections reached"));
! 	return -1;
      }
  
      if ((csinfo[i].fname = (char *)alloc((unsigned)strlen(fname)+1)) == NULL)
--- 1459,1483 ----
  
      if (i == -1)
      {
! 	i = csinfo_size;
! 	if (csinfo_size == 0)
! 	{
! 	    /* First time allocation: allocate only 1 connection. It should
! 	     * be enough for most users.  If more is needed, csinfo will be
! 	     * reallocated. */
! 	    csinfo_size = 1;
! 	    csinfo = (csinfo_T *)alloc_clear(sizeof(csinfo_T));
! 	}
! 	else
! 	{
! 	    /* Reallocate space for more connections. */
! 	    csinfo_size *= 2;
! 	    csinfo = vim_realloc(csinfo, sizeof(csinfo_T)*csinfo_size);
! 	}
! 	if (csinfo == NULL)
! 	    return -1;
! 	for (j = csinfo_size/2; j < csinfo_size; j++)
! 	    clear_csinfo(j);
      }
  
      if ((csinfo[i].fname = (char *)alloc((unsigned)strlen(fname)+1)) == NULL)
***************
*** 1580,1594 ****
  	/* It must be part of a name.  We will try to find a match
  	 * within all the names in the csinfo data structure
  	 */
! 	for (i = 0; i < CSCOPE_MAX_CONNECTIONS; i++)
  	{
  	    if (csinfo[i].fname != NULL && strstr(csinfo[i].fname, stok))
  		break;
  	}
      }
  
!     if ((i >= CSCOPE_MAX_CONNECTIONS || i < -1 || csinfo[i].fname == NULL)
! 	    && i != -1)
      {
  	if (p_csverbose)
  	    (void)EMSG2(_("E261: cscope connection %s not found"), stok);
--- 1584,1597 ----
  	/* It must be part of a name.  We will try to find a match
  	 * within all the names in the csinfo data structure
  	 */
! 	for (i = 0; i < csinfo_size; i++)
  	{
  	    if (csinfo[i].fname != NULL && strstr(csinfo[i].fname, stok))
  		break;
  	}
      }
  
!     if ((i != -1) && (i >= csinfo_size || i < -1 || csinfo[i].fname == NULL))
      {
  	if (p_csverbose)
  	    (void)EMSG2(_("E261: cscope connection %s not found"), stok);
***************
*** 1597,1603 ****
      {
  	if (i == -1)
  	{
! 	    for (i = 0; i < CSCOPE_MAX_CONNECTIONS; i++)
  	    {
  		if (csinfo[i].fname)
  		    cs_kill_execute(i, csinfo[i].fname);
--- 1600,1606 ----
      {
  	if (i == -1)
  	{
! 	    for (i = 0; i < csinfo_size; i++)
  	    {
  		if (csinfo[i].fname)
  		    cs_kill_execute(i, csinfo[i].fname);
***************
*** 1857,1863 ****
      if (buf == NULL)
  	return;
  
!     for (i = 0; i < CSCOPE_MAX_CONNECTIONS; i++)
      {
  	if (nummatches_a[i] < 1)
  	    continue;
--- 1860,1866 ----
      if (buf == NULL)
  	return;
  
!     for (i = 0; i < csinfo_size; i++)
      {
  	if (nummatches_a[i] < 1)
  	    continue;
***************
*** 1929,1935 ****
      if ((cntxts = (char **)alloc(sizeof(char *) * totmatches)) == NULL)
  	goto parse_out;
  
!     for (i = 0; i < CSCOPE_MAX_CONNECTIONS; i++)
      {
  	if (nummatches_a[i] < 1)
  	    continue;
--- 1932,1938 ----
      if ((cntxts = (char **)alloc(sizeof(char *) * totmatches)) == NULL)
  	goto parse_out;
  
!     for (i = 0; i < csinfo_size; i++)
      {
  	if (nummatches_a[i] < 1)
  	    continue;
***************
*** 2383,2392 ****
      int	i;
      char buf[20]; /* for sprintf " (#%d)" */
  
      /* malloc our db and ppath list */
!     dblist = (char **)alloc(CSCOPE_MAX_CONNECTIONS * sizeof(char *));
!     pplist = (char **)alloc(CSCOPE_MAX_CONNECTIONS * sizeof(char *));
!     fllist = (char **)alloc(CSCOPE_MAX_CONNECTIONS * sizeof(char *));
      if (dblist == NULL || pplist == NULL || fllist == NULL)
      {
  	vim_free(dblist);
--- 2386,2398 ----
      int	i;
      char buf[20]; /* for sprintf " (#%d)" */
  
+     if (csinfo_size == 0)
+ 	return CSCOPE_SUCCESS;
+ 
      /* malloc our db and ppath list */
!     dblist = (char **)alloc(csinfo_size * sizeof(char *));
!     pplist = (char **)alloc(csinfo_size * sizeof(char *));
!     fllist = (char **)alloc(csinfo_size * sizeof(char *));
      if (dblist == NULL || pplist == NULL || fllist == NULL)
      {
  	vim_free(dblist);
***************
*** 2395,2401 ****
  	return CSCOPE_FAILURE;
      }
  
!     for (i = 0; i < CSCOPE_MAX_CONNECTIONS; i++)
      {
  	dblist[i] = csinfo[i].fname;
  	pplist[i] = csinfo[i].ppath;
--- 2401,2407 ----
  	return CSCOPE_FAILURE;
      }
  
!     for (i = 0; i < csinfo_size; i++)
      {
  	dblist[i] = csinfo[i].fname;
  	pplist[i] = csinfo[i].ppath;
***************
*** 2405,2411 ****
      }
  
      /* rebuild the cscope connection list */
!     for (i = 0; i < CSCOPE_MAX_CONNECTIONS; i++)
      {
  	if (dblist[i] != NULL)
  	{
--- 2411,2417 ----
      }
  
      /* rebuild the cscope connection list */
!     for (i = 0; i < csinfo_size; i++)
      {
  	if (dblist[i] != NULL)
  	{
***************
*** 2502,2508 ****
  	MSG_PUTS_ATTR(
  	    _(" # pid    database name                       prepend path\n"),
  	    hl_attr(HLF_T));
! 	for (i = 0; i < CSCOPE_MAX_CONNECTIONS; i++)
  	{
  	    if (csinfo[i].fname == NULL)
  		continue;
--- 2508,2514 ----
  	MSG_PUTS_ATTR(
  	    _(" # pid    database name                       prepend path\n"),
  	    hl_attr(HLF_T));
! 	for (i = 0; i < csinfo_size; i++)
  	{
  	    if (csinfo[i].fname == NULL)
  		continue;
***************
*** 2531,2538 ****
  {
      int i;
  
!     for (i = 0; i < CSCOPE_MAX_CONNECTIONS; i++)
  	cs_release_csp(i, TRUE);
  }
  
  #endif	/* FEAT_CSCOPE */
--- 2537,2546 ----
  {
      int i;
  
!     for (i = 0; i < csinfo_size; i++)
  	cs_release_csp(i, TRUE);
+     vim_free(csinfo);
+     csinfo_size = 0;
  }
  
  #endif	/* FEAT_CSCOPE */
*** ../vim-7.2.227/src/version.c	2009-07-09 20:13:59.000000000 +0200
--- src/version.c	2009-07-09 21:21:48.000000000 +0200
***************
*** 678,679 ****
--- 678,681 ----
  {   /* Add new patch number below this line */
+ /**/
+     228,
  /**/

-- 
hundred-and-one symptoms of being an internet addict:
84. Books in your bookcase bear the names Bongo, WinSock and Inside OLE

 /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net   \\\
///        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\        download, build and distribute -- http://www.A-A-P.org        ///
 \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///