| 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 |
| |
| |
| |
| |
| |
| *** 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* |
| |
| |
| |
| *** 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 ---- |
| |
| |
| |
| *** 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 */ |
| |
| |
| |
| *** 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 /// |