]> granicus.if.org Git - vim/commitdiff
updated for version 7.4.066 v7.4.066
authorBram Moolenaar <Bram@vim.org>
Mon, 4 Nov 2013 01:54:12 +0000 (02:54 +0100)
committerBram Moolenaar <Bram@vim.org>
Mon, 4 Nov 2013 01:54:12 +0000 (02:54 +0100)
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)

src/memline.c
src/misc1.c
src/proto/misc1.pro
src/version.c

index 836ee047199727c9467d53544c1e416d37f98f28..2f08557f825b5f7e09155c221d450232f72c1594 100644 (file)
@@ -4014,6 +4014,13 @@ get_file_in_dir(fname, dname)
     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,12 +4144,29 @@ findswapname(buf, dirp, old_fname)
 #ifndef SHORT_FNAME
     int                r;
 #endif
+    char_u     *buf_fname = buf->b_fname;
 
 #if !defined(SHORT_FNAME) \
-                    && ((!defined(UNIX) && !defined(OS2)) || defined(ARCHIE))
+               && ((!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,9 +4174,9 @@ findswapname(buf, dirp, old_fname)
      * 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");
+    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,7 +4195,7 @@ findswapname(buf, dirp, old_fname)
     if (dir_name == NULL)          /* out of memory */
        fname = NULL;
     else
-       fname = makeswapname(buf->b_fname, buf->b_ffname, buf, dir_name);
+       fname = makeswapname(buf_fname, buf->b_ffname, buf, dir_name);
 
     for (;;)
     {
@@ -4204,7 +4228,7 @@ findswapname(buf, dirp, old_fname)
             * It either contains two dots, is longer than 8 chars, or starts
             * with a dot.
             */
-           tail = gettail(buf->b_fname);
+           tail = gettail(buf_fname);
            if (       vim_strchr(tail, '.') != NULL
                    || STRLEN(tail) > (size_t)8
                    || *gettail(fname) == '.')
@@ -4273,7 +4297,7 @@ findswapname(buf, dirp, old_fname)
                    {
                        buf->b_shortname = TRUE;
                        vim_free(fname);
-                       fname = makeswapname(buf->b_fname, buf->b_ffname,
+                       fname = makeswapname(buf_fname, buf->b_ffname,
                                                               buf, dir_name);
                        continue;       /* try again with b_shortname set */
                    }
@@ -4344,7 +4368,7 @@ findswapname(buf, dirp, old_fname)
                {
                    buf->b_shortname = TRUE;
                    vim_free(fname);
-                   fname = makeswapname(buf->b_fname, buf->b_ffname,
+                   fname = makeswapname(buf_fname, buf->b_ffname,
                                                               buf, dir_name);
                    continue;       /* try again with '.' replaced with '_' */
                }
@@ -4356,7 +4380,7 @@ findswapname(buf, dirp, old_fname)
             * 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
+           if (!recoverymode && buf_fname != NULL
                                && !buf->b_help && !(buf->b_flags & BF_DUMMY))
            {
                int             fd;
@@ -4433,7 +4457,7 @@ findswapname(buf, dirp, old_fname)
                    {
                        fclose(dummyfd);
                        dummyfd = NULL;
-                       mch_remove(buf->b_fname);
+                       mch_remove(buf_fname);
                        did_use_dummy = TRUE;
                    }
 #endif
@@ -4448,7 +4472,7 @@ findswapname(buf, dirp, old_fname)
                     * user anyway.
                     */
                    if (swap_exists_action != SEA_NONE
-                           && has_autocmd(EVENT_SWAPEXISTS, buf->b_fname, buf))
+                           && has_autocmd(EVENT_SWAPEXISTS, buf_fname, buf))
                        choice = do_swapexists(buf, fname);
 
                    if (choice == 0)
@@ -4549,7 +4573,7 @@ findswapname(buf, dirp, old_fname)
 #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");
+                       dummyfd = mch_fopen((char *)buf_fname, "w");
 #endif
                }
            }
@@ -4581,8 +4605,12 @@ findswapname(buf, dirp, old_fname)
     if (dummyfd != NULL)       /* file has been created temporarily */
     {
        fclose(dummyfd);
-       mch_remove(buf->b_fname);
+       mch_remove(buf_fname);
     }
+#endif
+#ifdef WIN3264
+    if (buf_fname != buf->b_fname)
+       vim_free(buf_fname);
 #endif
     return fname;
 }
index 2063d427e321fa5999aae1d5bdc178cd9b193b49..c349015ba022c5bf5314f499488e165fa778691d 100644 (file)
@@ -4808,9 +4808,9 @@ gettail(fname)
 
     if (fname == NULL)
        return (char_u *)"";
-    for (p1 = p2 = fname; *p2; )       /* find last part of path */
+    for (p1 = p2 = get_past_head(fname); *p2; )        /* find last part of path */
     {
-       if (vim_ispathsep(*p2))
+       if (vim_ispathsep_nocolon(*p2))
            p1 = p2 + 1;
        mb_ptr_adv(p2);
     }
@@ -4929,7 +4929,8 @@ get_past_head(path)
 }
 
 /*
- * return TRUE if 'c' is a path separator.
+ * Return TRUE if 'c' is a path separator.
+ * Note that for MS-Windows this includes the colon.
  */
     int
 vim_ispathsep(c)
@@ -4952,6 +4953,20 @@ vim_ispathsep(c)
 #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.
index 035453569e6673c892bfb0ee5d9cce4883ecc391..d6672e4948b70dca1c7abc96ebea222d797379c1 100644 (file)
@@ -69,6 +69,7 @@ char_u *gettail_sep __ARGS((char_u *fname));
 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));
index 02cca4348ba6c57d3733e1c7741517f7c69a3fbd..615d86db590d165440785ea737dedcb3ef074ff8 100644 (file)
@@ -738,6 +738,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    66,
 /**/
     65,
 /**/