# HG changeset patch # User Bram Moolenaar # Date 1340193747 -7200 # Node ID 74adc9f7e15b8c088abd04de35615cad6c83a811 # Parent 82699bff215dea7a0e0a1fd0203f6ffcc75a5a1b 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) diff --git a/src/eval.c b/src/eval.c --- 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)) { diff --git a/src/misc1.c b/src/misc1.c --- 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); } /* diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -715,6 +715,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 559, +/**/ 558, /**/ 557,