Mercurial > vim
diff src/memline.c @ 5432:38b948f534e4 v7.4.066
updated for version 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)
author | Bram Moolenaar <bram@vim.org> |
---|---|
date | Mon, 04 Nov 2013 02:54:12 +0100 |
parents | 04736b4030ec |
children | fa31c5b82424 |
line wrap: on
line diff
--- a/src/memline.c +++ b/src/memline.c @@ -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,9 +4605,13 @@ 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; }