Mercurial > vim
changeset 3598:74adc9f7e15b v7.3.559
updated for version 7.3.559
Problem: home_replace() does not work with 8.3 filename.
Solution: Make ":p" expand 8.3 name to full path. (Yasuhiro Matsumoto)
author | Bram Moolenaar <bram@vim.org> |
---|---|
date | Wed, 20 Jun 2012 14:02:27 +0200 |
parents | 82699bff215d |
children | 05e7fe1f4b3c |
files | src/eval.c src/misc1.c src/version.c |
diffstat | 3 files changed, 44 insertions(+), 3 deletions(-) [+] |
line wrap: on
line diff
--- a/src/eval.c +++ b/src/eval.c @@ -23554,6 +23554,27 @@ repeat: return -1; } +#ifdef WIN3264 +# if _WIN32_WINNT >= 0x0500 + if (vim_strchr(*fnamep, '~') != NULL) + { + /* Expand 8.3 filename to full path. Needed to make sure the same + * file does not have two different names. + * Note: problem does not occur if _WIN32_WINNT < 0x0500. */ + p = alloc(_MAX_PATH + 1); + if (p != NULL) + { + if (GetLongPathName(*fnamep, p, MAXPATHL)) + { + vim_free(*bufp); + *bufp = *fnamep = p; + } + else + vim_free(p); + } + } +# endif +#endif /* Append a path separator to a directory. */ if (mch_isdir(*fnamep)) {
--- a/src/misc1.c +++ b/src/misc1.c @@ -4499,7 +4499,7 @@ home_replace(buf, src, dst, dstlen, one) { size_t dirlen = 0, envlen = 0; size_t len; - char_u *homedir_env; + char_u *homedir_env, *homedir_env_orig; char_u *p; if (src == NULL) @@ -4525,9 +4525,24 @@ home_replace(buf, src, dst, dstlen, one) dirlen = STRLEN(homedir); #ifdef VMS - homedir_env = mch_getenv((char_u *)"SYS$LOGIN"); + homedir_env_orig = homedir_env = mch_getenv((char_u *)"SYS$LOGIN"); #else - homedir_env = mch_getenv((char_u *)"HOME"); + homedir_env_orig = homedir_env = mch_getenv((char_u *)"HOME"); +#endif +#if defined(FEAT_MODIFY_FNAME) || defined(WIN3264) + if (vim_strchr(homedir_env, '~') != NULL) + { + int usedlen = 0; + int flen; + char_u *fbuf = NULL; + + flen = (int)STRLEN(homedir_env); + (void)modify_fname(":p", &usedlen, &homedir_env, &fbuf, &flen); + flen = (int)STRLEN(homedir_env); + if (flen > 0 && vim_ispathsep(homedir_env[flen - 1])) + /* Remove the trailing / that is added to a directory. */ + homedir_env[flen - 1] = NUL; + } #endif if (homedir_env != NULL && *homedir_env == NUL) @@ -4585,6 +4600,9 @@ home_replace(buf, src, dst, dstlen, one) /* if (dstlen == 0) out of space, what to do??? */ *dst = NUL; + + if (homedir_env != homedir_env_orig) + vim_free(homedir_env); } /*