To: vim-dev@vim.org Subject: patch 7.0.208 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 8bit ------------ Patch 7.0.208 (after 7.0.171 and 7.0.180) Problem: VMS: changes to path handling cause more trouble than they solve. Solution: Revert changes. Files: src/buffer.c, src/memline.c, src/os_unix.c *** ../vim-7.0.207/src/buffer.c Tue Nov 28 17:44:51 2006 --- src/buffer.c Mon Mar 5 21:34:41 2007 *************** *** 4145,4157 **** /* * Force expanding the path always for Unix, because symbolic links may * mess up the full path name, even though it starts with a '/'. - * Also expand always for VMS, it may have alternate paths that need to be - * resolved. * Also expand when there is ".." in the file name, try to remove it, * because "c:/src/../README" is equal to "c:/README". * For MS-Windows also expand names like "longna~1" to "longname". */ ! #if defined(UNIX) || defined(VMS) return FullName_save(fname, TRUE); #else if (!vim_isAbsName(fname) || strstr((char *)fname, "..") != NULL --- 4145,4155 ---- /* * Force expanding the path always for Unix, because symbolic links may * mess up the full path name, even though it starts with a '/'. * Also expand when there is ".." in the file name, try to remove it, * because "c:/src/../README" is equal to "c:/README". * For MS-Windows also expand names like "longna~1" to "longname". */ ! #ifdef UNIX return FullName_save(fname, TRUE); #else if (!vim_isAbsName(fname) || strstr((char *)fname, "..") != NULL *** ../vim-7.0.207/src/memline.c Tue Feb 13 04:03:05 2007 --- src/memline.c Mon Mar 5 21:34:41 2007 *************** *** 3592,3600 **** #else (buf->b_p_sn || buf->b_shortname), #endif ! #if defined(VMS) || defined(RISCOS) ! /* Avoid problems if fname has special chars, eg . ! * For VMS always use full path for swapfile. */ ffname, #else # ifdef HAVE_READLINK --- 3592,3599 ---- #else (buf->b_p_sn || buf->b_shortname), #endif ! #ifdef RISCOS ! /* Avoid problems if fname has special chars, eg */ ffname, #else # ifdef HAVE_READLINK *** ../vim-7.0.207/src/os_unix.c Tue Feb 27 16:51:07 2007 --- src/os_unix.c Mon Mar 5 21:40:31 2007 *************** *** 2214,2262 **** int len; int force; /* also expand when already absolute path */ { - #ifdef VMS - /* - * VMS does this in a completely different way. - * - * By default a file found in a complex path is written to the first - * directory in the path and not to the original directory. This - * behaviour should be avoided for the existing files and we need to find - * the exact path of the edited file. - */ - { - char_u *fixed_fname = vms_fixfilename(fname); - int fd = mch_open((char *)fixed_fname, O_RDONLY | O_EXTRA, 0); - - if (fd > 0) - { - char nbuf[MAXNAMLEN]; - - /* File exists, use getname() to get the real name. */ - if (getname(fd, nbuf)) - vim_strncpy(fixed_fname, (char_u *)nbuf, (size_t)(len - 1)); - close(fd); - } - - if (STRLEN(fixed_fname) >= len) - return FAIL; - - STRCPY(buf, fixed_fname); - } - - #else /* not VMS */ - int l; ! # ifdef OS2 int only_drive; /* file name is only a drive letter */ ! # endif ! # ifdef HAVE_FCHDIR int fd = -1; static int dont_fchdir = FALSE; /* TRUE when fchdir() doesn't work */ ! # endif char_u olddir[MAXPATHL]; char_u *p; int retval = OK; /* expand it if forced or not an absolute path */ if (force || !mch_isFullName(fname)) { --- 2214,2235 ---- int len; int force; /* also expand when already absolute path */ { int l; ! #ifdef OS2 int only_drive; /* file name is only a drive letter */ ! #endif ! #ifdef HAVE_FCHDIR int fd = -1; static int dont_fchdir = FALSE; /* TRUE when fchdir() doesn't work */ ! #endif char_u olddir[MAXPATHL]; char_u *p; int retval = OK; + #ifdef VMS + fname = vms_fixfilename(fname); + #endif + /* expand it if forced or not an absolute path */ if (force || !mch_isFullName(fname)) { *************** *** 2265,2280 **** * and then do the getwd() (and get back to where we were). * This will get the correct path name with "../" things. */ ! # ifdef OS2 only_drive = 0; if (((p = vim_strrchr(fname, '/')) != NULL) || ((p = vim_strrchr(fname, '\\')) != NULL) || (((p = vim_strchr(fname, ':')) != NULL) && ++only_drive)) ! # else if ((p = vim_strrchr(fname, '/')) != NULL) ! # endif { ! # ifdef HAVE_FCHDIR /* * Use fchdir() if possible, it's said to be faster and more * reliable. But on SunOS 4 it might not work. Check this by --- 2238,2253 ---- * and then do the getwd() (and get back to where we were). * This will get the correct path name with "../" things. */ ! #ifdef OS2 only_drive = 0; if (((p = vim_strrchr(fname, '/')) != NULL) || ((p = vim_strrchr(fname, '\\')) != NULL) || (((p = vim_strchr(fname, ':')) != NULL) && ++only_drive)) ! #else if ((p = vim_strrchr(fname, '/')) != NULL) ! #endif { ! #ifdef HAVE_FCHDIR /* * Use fchdir() if possible, it's said to be faster and more * reliable. But on SunOS 4 it might not work. Check this by *************** *** 2290,2303 **** dont_fchdir = TRUE; /* don't try again */ } } ! # endif /* Only change directory when we are sure we can return to where * we are now. After doing "su" chdir(".") might not work. */ if ( ! # ifdef HAVE_FCHDIR fd < 0 && ! # endif (mch_dirname(olddir, MAXPATHL) == FAIL || mch_chdir((char *)olddir) != 0)) { --- 2263,2276 ---- dont_fchdir = TRUE; /* don't try again */ } } ! #endif /* Only change directory when we are sure we can return to where * we are now. After doing "su" chdir(".") might not work. */ if ( ! #ifdef HAVE_FCHDIR fd < 0 && ! #endif (mch_dirname(olddir, MAXPATHL) == FAIL || mch_chdir((char *)olddir) != 0)) { *************** *** 2306,2312 **** } else { ! # ifdef OS2 /* * compensate for case where ':' from "D:" was the only * path separator detected in the file name; the _next_ --- 2279,2285 ---- } else { ! #ifdef OS2 /* * compensate for case where ':' from "D:" was the only * path separator detected in the file name; the _next_ *************** *** 2314,2320 **** */ if (only_drive) p++; ! # endif /* The directory is copied into buf[], to be able to remove * the file name without changing it (could be a string in * read-only memory) */ --- 2287,2293 ---- */ if (only_drive) p++; ! #endif /* The directory is copied into buf[], to be able to remove * the file name without changing it (could be a string in * read-only memory) */ *************** *** 2329,2342 **** fname = p + 1; *buf = NUL; } ! # ifdef OS2 if (only_drive) { p--; if (retval != FAIL) fname--; } ! # endif } } if (mch_dirname(buf, len) == FAIL) --- 2302,2315 ---- fname = p + 1; *buf = NUL; } ! #ifdef OS2 if (only_drive) { p--; if (retval != FAIL) fname--; } ! #endif } } if (mch_dirname(buf, len) == FAIL) *************** *** 2346,2359 **** } if (p != NULL) { ! # ifdef HAVE_FCHDIR if (fd >= 0) { l = fchdir(fd); close(fd); } else ! # endif l = mch_chdir((char *)olddir); if (l != 0) EMSG(_(e_prev_dir)); --- 2319,2332 ---- } if (p != NULL) { ! #ifdef HAVE_FCHDIR if (fd >= 0) { l = fchdir(fd); close(fd); } else ! #endif l = mch_chdir((char *)olddir); if (l != 0) EMSG(_(e_prev_dir)); *************** *** 2362,2373 **** --- 2335,2348 ---- l = STRLEN(buf); if (l >= len) retval = FAIL; + #ifndef VMS else { if (l > 0 && buf[l - 1] != '/' && *fname != NUL && STRCMP(fname, ".") != 0) STRCAT(buf, "/"); } + #endif } /* Catch file names which are too long. */ *************** *** 2377,2384 **** /* Do not append ".", "/dir/." is equal to "/dir". */ if (STRCMP(fname, ".") != 0) STRCAT(buf, fname); - - #endif /* VMS */ return OK; } --- 2352,2357 ---- *** ../vim-7.0.207/src/version.c Sun Mar 4 21:25:44 2007 --- src/version.c Tue Mar 6 20:22:52 2007 *************** *** 668,669 **** --- 668,671 ---- { /* Add new patch number below this line */ + /**/ + 208, /**/ -- hundred-and-one symptoms of being an internet addict: 262. Your computer has it's own phone line - but your daughter doesn't. /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ \\\ download, build and distribute -- http://www.A-A-P.org /// \\\ help me help AIDS victims -- http://ICCF-Holland.org ///