Patch 7.4.066
Problem:    MS-Windows: When there is a colon in the file name (sub-stream
            feature) the swap file name is wrong.
Solution:   Change the colon to "%". (Yasuhiro Matsumoto)
Files:      src/fileio.c, src/memline.c, src/misc1.c, src/proto/misc1.pro


*** ../vim-7.4.065/src/memline.c        2013-05-06 04:01:02.000000000 +0200
--- src/memline.c       2013-11-04 02:52:44.000000000 +0100
***************
*** 4014,4019 ****
--- 4014,4026 ----
      else
        retval = concat_fnames(dname, tail, TRUE);
  
+ #ifdef WIN3264
+     if (retval != NULL)
+       for (t = gettail(retval); *t != NUL; mb_ptr_adv(t))
+           if (*t == ':')
+               *t = '%';
+ #endif
+ 
      return retval;
  }
  
***************
*** 4137,4148 ****
  #ifndef SHORT_FNAME
      int               r;
  #endif
  
  #if !defined(SHORT_FNAME) \
!                    && ((!defined(UNIX) && !defined(OS2)) || defined(ARCHIE))
  # define CREATE_DUMMY_FILE
      FILE      *dummyfd = NULL;
  
      /*
       * If we start editing a new file, e.g. "test.doc", which resides on an
       * MSDOS compatible filesystem, it is possible that the file
--- 4144,4172 ----
  #ifndef SHORT_FNAME
      int               r;
  #endif
+     char_u    *buf_fname = buf->b_fname;
  
  #if !defined(SHORT_FNAME) \
!               && ((!defined(UNIX) && !defined(OS2)) || defined(ARCHIE))
  # define CREATE_DUMMY_FILE
      FILE      *dummyfd = NULL;
  
+ # ifdef WIN3264
+     if (buf_fname != NULL && !mch_isFullName(buf_fname)
+                                      && vim_strchr(gettail(buf_fname), ':'))
+     {
+       char_u *t;
+ 
+       buf_fname = vim_strsave(buf_fname);
+       if (buf_fname == NULL)
+           buf_fname = buf->b_fname;
+       else
+           for (t = gettail(buf_fname); *t != NUL; mb_ptr_adv(t))
+               if (*t == ':')
+                   *t = '%';
+     }
+ # endif
+ 
      /*
       * If we start editing a new file, e.g. "test.doc", which resides on an
       * MSDOS compatible filesystem, it is possible that the file
***************
*** 4150,4158 ****
       * this problem we temporarily create "test.doc".  Don't do this when the
       * check below for a 8.3 file name is used.
       */
!     if (!(buf->b_p_sn || buf->b_shortname) && buf->b_fname != NULL
!                                            && mch_getperm(buf->b_fname) < 0)
!       dummyfd = mch_fopen((char *)buf->b_fname, "w");
  #endif
  
      /*
--- 4174,4182 ----
       * this problem we temporarily create "test.doc".  Don't do this when the
       * check below for a 8.3 file name is used.
       */
!     if (!(buf->b_p_sn || buf->b_shortname) && buf_fname != NULL
!                                            && mch_getperm(buf_fname) < 0)
!       dummyfd = mch_fopen((char *)buf_fname, "w");
  #endif
  
      /*
***************
*** 4171,4177 ****
      if (dir_name == NULL)         /* out of memory */
        fname = NULL;
      else
!       fname = makeswapname(buf->b_fname, buf->b_ffname, buf, dir_name);
  
      for (;;)
      {
--- 4195,4201 ----
      if (dir_name == NULL)         /* out of memory */
        fname = NULL;
      else
!       fname = makeswapname(buf_fname, buf->b_ffname, buf, dir_name);
  
      for (;;)
      {
***************
*** 4204,4210 ****
             * It either contains two dots, is longer than 8 chars, or starts
             * with a dot.
             */
!           tail = gettail(buf->b_fname);
            if (       vim_strchr(tail, '.') != NULL
                    || STRLEN(tail) > (size_t)8
                    || *gettail(fname) == '.')
--- 4228,4234 ----
             * It either contains two dots, is longer than 8 chars, or starts
             * with a dot.
             */
!           tail = gettail(buf_fname);
            if (       vim_strchr(tail, '.') != NULL
                    || STRLEN(tail) > (size_t)8
                    || *gettail(fname) == '.')
***************
*** 4273,4279 ****
                    {
                        buf->b_shortname = TRUE;
                        vim_free(fname);
!                       fname = makeswapname(buf->b_fname, buf->b_ffname,
                                                               buf, dir_name);
                        continue;       /* try again with b_shortname set */
                    }
--- 4297,4303 ----
                    {
                        buf->b_shortname = TRUE;
                        vim_free(fname);
!                       fname = makeswapname(buf_fname, buf->b_ffname,
                                                               buf, dir_name);
                        continue;       /* try again with b_shortname set */
                    }
***************
*** 4344,4350 ****
                {
                    buf->b_shortname = TRUE;
                    vim_free(fname);
!                   fname = makeswapname(buf->b_fname, buf->b_ffname,
                                                               buf, dir_name);
                    continue;       /* try again with '.' replaced with '_' */
                }
--- 4368,4374 ----
                {
                    buf->b_shortname = TRUE;
                    vim_free(fname);
!                   fname = makeswapname(buf_fname, buf->b_ffname,
                                                               buf, dir_name);
                    continue;       /* try again with '.' replaced with '_' */
                }
***************
*** 4356,4362 ****
             * viewing a help file or when the path of the file is different
             * (happens when all .swp files are in one directory).
             */
!           if (!recoverymode && buf->b_fname != NULL
                                && !buf->b_help && !(buf->b_flags & BF_DUMMY))
            {
                int             fd;
--- 4380,4386 ----
             * viewing a help file or when the path of the file is different
             * (happens when all .swp files are in one directory).
             */
!           if (!recoverymode && buf_fname != NULL
                                && !buf->b_help && !(buf->b_flags & BF_DUMMY))
            {
                int             fd;
***************
*** 4433,4439 ****
                    {
                        fclose(dummyfd);
                        dummyfd = NULL;
!                       mch_remove(buf->b_fname);
                        did_use_dummy = TRUE;
                    }
  #endif
--- 4457,4463 ----
                    {
                        fclose(dummyfd);
                        dummyfd = NULL;
!                       mch_remove(buf_fname);
                        did_use_dummy = TRUE;
                    }
  #endif
***************
*** 4448,4454 ****
                     * user anyway.
                     */
                    if (swap_exists_action != SEA_NONE
!                           && has_autocmd(EVENT_SWAPEXISTS, buf->b_fname, buf))
                        choice = do_swapexists(buf, fname);
  
                    if (choice == 0)
--- 4472,4478 ----
                     * user anyway.
                     */
                    if (swap_exists_action != SEA_NONE
!                           && has_autocmd(EVENT_SWAPEXISTS, buf_fname, buf))
                        choice = do_swapexists(buf, fname);
  
                    if (choice == 0)
***************
*** 4549,4555 ****
  #ifdef CREATE_DUMMY_FILE
                    /* Going to try another name, need the dummy file again. */
                    if (did_use_dummy)
!                       dummyfd = mch_fopen((char *)buf->b_fname, "w");
  #endif
                }
            }
--- 4573,4579 ----
  #ifdef CREATE_DUMMY_FILE
                    /* Going to try another name, need the dummy file again. */
                    if (did_use_dummy)
!                       dummyfd = mch_fopen((char *)buf_fname, "w");
  #endif
                }
            }
***************
*** 4581,4589 ****
      if (dummyfd != NULL)      /* file has been created temporarily */
      {
        fclose(dummyfd);
!       mch_remove(buf->b_fname);
      }
  #endif
      return fname;
  }
  
--- 4605,4617 ----
      if (dummyfd != NULL)      /* file has been created temporarily */
      {
        fclose(dummyfd);
!       mch_remove(buf_fname);
      }
  #endif
+ #ifdef WIN3264
+     if (buf_fname != buf->b_fname)
+       vim_free(buf_fname);
+ #endif
      return fname;
  }
  
*** ../vim-7.4.065/src/misc1.c  2013-10-06 17:46:48.000000000 +0200
--- src/misc1.c 2013-11-04 02:44:28.000000000 +0100
***************
*** 4808,4816 ****
  
      if (fname == NULL)
        return (char_u *)"";
!     for (p1 = p2 = fname; *p2; )      /* find last part of path */
      {
!       if (vim_ispathsep(*p2))
            p1 = p2 + 1;
        mb_ptr_adv(p2);
      }
--- 4808,4816 ----
  
      if (fname == NULL)
        return (char_u *)"";
!     for (p1 = p2 = get_past_head(fname); *p2; )       /* find last part of 
path */
      {
!       if (vim_ispathsep_nocolon(*p2))
            p1 = p2 + 1;
        mb_ptr_adv(p2);
      }
***************
*** 4929,4935 ****
  }
  
  /*
!  * return TRUE if 'c' is a path separator.
   */
      int
  vim_ispathsep(c)
--- 4929,4936 ----
  }
  
  /*
!  * Return TRUE if 'c' is a path separator.
!  * Note that for MS-Windows this includes the colon.
   */
      int
  vim_ispathsep(c)
***************
*** 4952,4957 ****
--- 4953,4972 ----
  #endif
  }
  
+ /*
+  * Like vim_ispathsep(c), but exclude the colon for MS-Windows.
+  */
+     int
+ vim_ispathsep_nocolon(c)
+     int c;
+ {
+     return vim_ispathsep(c)
+ #ifdef BACKSLASH_IN_FILENAME
+       && c != ':'
+ #endif
+       ;
+ }
+ 
  #if defined(FEAT_SEARCHPATH) || defined(PROTO)
  /*
   * return TRUE if 'c' is a path list separator.
*** ../vim-7.4.065/src/proto/misc1.pro  2013-08-10 13:37:20.000000000 +0200
--- src/proto/misc1.pro 2013-11-04 02:44:30.000000000 +0100
***************
*** 69,74 ****
--- 69,75 ----
  char_u *getnextcomp __ARGS((char_u *fname));
  char_u *get_past_head __ARGS((char_u *path));
  int vim_ispathsep __ARGS((int c));
+ int vim_ispathsep_nocolon __ARGS((int c));
  int vim_ispathlistsep __ARGS((int c));
  void shorten_dir __ARGS((char_u *str));
  int dir_of_file_exists __ARGS((char_u *fname));
*** ../vim-7.4.065/src/version.c        2013-11-04 02:00:55.000000000 +0100
--- src/version.c       2013-11-04 02:50:35.000000000 +0100
***************
*** 740,741 ****
--- 740,743 ----
  {   /* Add new patch number below this line */
+ /**/
+     66,
  /**/

-- 
Females are strictly forbidden to appear unshaven in public.
                [real standing law in New Mexico, United States of America]

 /// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net   \\\
///        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\  an exciting new programming language -- http://www.Zimbu.org        ///
 \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///

-- 
-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/groups/opt_out.

Raspunde prin e-mail lui