To: [email protected]
Subject: Patch 6.2f.033
Fcc: outbox
From: Bram Moolenaar <[email protected]>
Mime-Version: 1.0
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 8bit
------------

Patch 6.2f.033
Problem:    Cscope: re-entrance problem for ":cscope" command.  Checking for
           duplicate database didn't work well for Win95.  Didn't check for
           duplicate databases after an empty entry.
Solution:   Don't set postponed_split too early.  Remember first empty
           database entry. (Sergey Khorev)
Files:      src/if_cscope.c


*** ../vim-6.2f.032/src/if_cscope.c     Fri May 30 12:13:02 2003
--- src/if_cscope.c     Fri May 30 23:16:45 2003
***************
*** 43,48 ****
--- 43,49 ----
 static int        cs_cnt_matches __ARGS((int idx));
 static char *     cs_create_cmd __ARGS((char *csoption, char *pattern));
 static int        cs_create_connection __ARGS((int i));
+ static void       do_cscope_general __ARGS((exarg_T *eap, int make_split));
 static void       cs_file_results __ARGS((FILE *, int *));
 static void       cs_fill_results __ARGS((char *, int , int *, char ***,
                       char ***, int *));
***************
*** 95,112 ****
 }

 /*
!  * PUBLIC functions
!  ****************************************************************************/
!
! /*
!  * PUBLIC: do_cscope
  *
  * find the command, print help if invalid, and the then call the
!  * corresponding command function
  */
!     void
! do_cscope(eap)
!     exarg_T *eap;
 {
     cscmd_T *cmdp;

--- 96,111 ----
 }

 /*
!  * PRIVATE: do_cscope_general
  *
  * find the command, print help if invalid, and the then call the
!  * corresponding command function,
!  * called from do_cscope and do_scscope
  */
!     static void
! do_cscope_general(eap, make_split)
!     exarg_T   *eap;
!     int               make_split; /* whether to split window */
 {
     cscmd_T *cmdp;

***************
*** 114,139 ****
     if ((cmdp = cs_lookup_cmd(eap)) == NULL)
     {
       cs_help(eap);
- #ifdef FEAT_WINDOWS
-       postponed_split = 0;
- #endif
       return;
     }

 #ifdef FEAT_WINDOWS
!     if (postponed_split && !cmdp->cansplit)
     {
!       (void)MSG_PUTS(_("This cscope command does not support splitting the window.\n"));
!       postponed_split = 0;
!       return;
     }
 #endif

     cmdp->func(eap);
! #ifdef FEAT_WINDOWS
!     postponed_split = 0; /* restore state */
! #endif
! } /* do_cscope */

 /*
  * PUBLIC: do_scscope
--- 113,145 ----
     if ((cmdp = cs_lookup_cmd(eap)) == NULL)
     {
       cs_help(eap);
       return;
     }

 #ifdef FEAT_WINDOWS
!     if (make_split)
     {
!       if (!cmdp->cansplit)
!       {
!           (void)MSG_PUTS(_("This cscope command does not support splitting the window.\n"));
!           return;
!       }
!       postponed_split = -1;
     }
 #endif

     cmdp->func(eap);
! }
!
! /*
!  * PUBLIC: do_cscope
!  */
!     void
! do_cscope(eap)
!     exarg_T *eap;
! {
!     do_cscope_general(eap, FALSE);
! }

 /*
  * PUBLIC: do_scscope
***************
*** 144,153 ****
 do_scscope(eap)
     exarg_T *eap;
 {
! #ifdef FEAT_WINDOWS
!     postponed_split = -1;
! #endif
!     do_cscope(eap);
 }

 /*
--- 150,156 ----
 do_scscope(eap)
     exarg_T *eap;
 {
!     do_cscope_general(eap, TRUE);
 }

 /*
***************
*** 1211,1259 ****
     char *flags;
     struct stat *sb;
 {
!     short i;
 #ifndef UNIX
!     HANDLE hFile;
     BY_HANDLE_FILE_INFORMATION bhfi;
!     hFile = CreateFile (fname, GENERIC_READ, 0, NULL, OPEN_EXISTING,
!                       FILE_ATTRIBUTE_NORMAL, NULL);
!     if (hFile == INVALID_HANDLE_VALUE)
!     {
!       if (p_csverbose)
       {
!           char *cant_msg = _("E625: cannot open cscope database: %s");
!           char *winmsg = GetWin32Error();
!           if (winmsg != NULL)
           {
!               (void)EMSG2(cant_msg, winmsg);
!               LocalFree(winmsg);
           }
!           else
!               /* subst filename if can't get error text */
!               (void)EMSG2(cant_msg, fname);
       }
-       return -1;
-     }
-     if (!GetFileInformationByHandle(hFile, &bhfi))
-     {
       CloseHandle(hFile);
-       if (p_csverbose)
-           (void)EMSG(_("E626: cannot get cscope database information"));
-       return -1;
     }
-     else
-       CloseHandle(hFile);
 #endif

!     for (i = 0; i < CSCOPE_MAX_CONNECTIONS; i++)
     {
!       if (csinfo[i].fname
 #if defined(UNIX)
!           && csinfo[i].st_dev == sb->st_dev && csinfo[i].st_ino == sb->st_ino
 #else
!           && csinfo[i].nVolume == bhfi.dwVolumeSerialNumber
!           && csinfo[i].nIndexHigh == bhfi.nFileIndexHigh
!           && csinfo[i].nIndexLow == bhfi.nFileIndexLow
 #endif
           )
       {
--- 1214,1273 ----
     char *flags;
     struct stat *sb;
 {
!     short     i, j;
 #ifndef UNIX
!     HANDLE    hFile;
     BY_HANDLE_FILE_INFORMATION bhfi;
!
!     vim_memset(&bhfi, 0, sizeof(bhfi));
!     /* On windows 9x GetFileInformationByHandle doesn't work, so skip it */
!     if (!mch_windows95())
!     {
!       hFile = CreateFile(fname, FILE_READ_ATTRIBUTES, 0, NULL, OPEN_EXISTING,
!                                                FILE_ATTRIBUTE_NORMAL, NULL);
!       if (hFile == INVALID_HANDLE_VALUE)
       {
!           if (p_csverbose)
           {
!               char *cant_msg = _("E625: cannot open cscope database: %s");
!               char *winmsg = GetWin32Error();
!
!               if (winmsg != NULL)
!               {
!                   (void)EMSG2(cant_msg, winmsg);
!                   LocalFree(winmsg);
!               }
!               else
!                   /* subst filename if can't get error text */
!                   (void)EMSG2(cant_msg, fname);
           }
!           return -1;
!       }
!       if (!GetFileInformationByHandle(hFile, &bhfi))
!       {
!           CloseHandle(hFile);
!           if (p_csverbose)
!               (void)EMSG(_("E626: cannot get cscope database information"));
!           return -1;
       }
       CloseHandle(hFile);
     }
 #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)
!           && csinfo[j].st_dev == sb->st_dev && csinfo[j].st_ino == sb->st_ino
 #else
!           /* compare pathnames first */
!           && ((fullpathcmp(csinfo[j].fname, fname, FALSE) & FPC_SAME)
!               /* if not Windows 9x, test index file atributes too */
!               || (!mch_windows95()
!                   && csinfo[j].nVolume == bhfi.dwVolumeSerialNumber
!                   && csinfo[j].nIndexHigh == bhfi.nFileIndexHigh
!                   && csinfo[j].nIndexLow == bhfi.nFileIndexLow))
 #endif
           )
       {
***************
*** 1262,1272 ****
           return -1;
       }

!       if (csinfo[i].fname == NULL)
!           break;
     }

!     if (i == CSCOPE_MAX_CONNECTIONS)
     {
       if (p_csverbose)
           (void)EMSG(_("E569: maximum number of cscope connections reached"));
--- 1276,1286 ----
           return -1;
       }

!       if (csinfo[j].fname == NULL && i == -1)
!           i = j; /* remember first empty entry */
     }

!     if (i == -1)
     {
       if (p_csverbose)
           (void)EMSG(_("E569: maximum number of cscope connections reached"));
*** ../vim-6.2f.032/src/version.c       Fri May 30 21:54:48 2003
--- src/version.c       Fri May 30 23:21:28 2003
***************
*** 632,633 ****
--- 632,635 ----
 {   /* Add new patch number below this line */
+ /**/
+     33,
 /**/

--
Give a man a computer program and you give him a headache,
but teach him to program computers and you give him the power
to create headaches for others for the rest of his life...
       R. B. Forest

/// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net   \\\
///          Creator of Vim - Vi IMproved -- http://www.Vim.org          \\\
\\\              Project leader for A-A-P -- http://www.A-A-P.org        ///
\\\     Help AIDS victims, buy at Amazon -- http://ICCF.nl/click1.html ///