--- /dev/null
+To: vim-dev@vim.org
+Subject: Patch 6.2.061
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=ISO-8859-1
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 6.2.061
+Problem: GUI: Using the left mouse button with the shift key should work
+ like "*" but it scrolls instead. (Martin Beller)
+Solution: Don't recognize an rxvt scroll wheel event when using the GUI.
+Files: src/term.c
+
+
+*** ../vim-6.2.060/src/term.c Fri Jul 25 22:25:04 2003
+--- src/term.c Sat Aug 9 15:43:24 2003
+***************
+*** 4053,4058 ****
+--- 4053,4061 ----
+ }
+ # ifdef FEAT_MOUSE_XTERM
+ else if (held_button == MOUSE_RELEASE
++ # ifdef FEAT_GUI
++ && !gui.in_use
++ # endif
+ && (mouse_code == 0x23 || mouse_code == 0x24))
+ {
+ /* Apparently used by rxvt scroll wheel. */
+*** ../vim-6.2.060/src/version.c Mon Aug 4 22:04:43 2003
+--- src/version.c Sat Aug 9 15:43:33 2003
+***************
+*** 632,633 ****
+--- 632,635 ----
+ { /* Add new patch number below this line */
++ /**/
++ 61,
+ /**/
+
+--
+From "know your smileys":
+ :~) A man with a tape recorder up his nose
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// Creator of Vim - Vi IMproved -- http://www.Vim.org \\\
+\\\ Project leader for A-A-P -- http://www.A-A-P.org ///
+ \\\ Help AIDS victims, buy here: http://ICCF-Holland.org/click1.html ///
--- /dev/null
+To: vim-dev@vim.org
+Subject: Patch 6.2.062
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=ISO-8859-1
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 6.2.062
+Problem: When one buffer uses a syntax with "containedin" and another
+ buffer does not, redrawing depends on what the current buffer is.
+ (Brett Pershing Stahlman)
+Solution: Use "syn_buf" instead of "curbuf" to get the b_syn_containedin
+ flag.
+Files: src/syntax.c
+
+
+*** ../vim-6.2.061/src/syntax.c Fri May 2 20:50:03 2003
+--- src/syntax.c Sun Aug 10 14:46:54 2003
+***************
+*** 1790,1796 ****
+ else
+ cur_si = NULL;
+
+! if (curbuf->b_syn_containedin || cur_si == NULL
+ || cur_si->si_cont_list != NULL)
+ {
+ /*
+--- 1790,1796 ----
+ else
+ cur_si = NULL;
+
+! if (syn_buf->b_syn_containedin || cur_si == NULL
+ || cur_si->si_cont_list != NULL)
+ {
+ /*
+*** ../vim-6.2.061/src/version.c Sat Aug 9 15:44:32 2003
+--- src/version.c Sun Aug 10 14:51:43 2003
+***************
+*** 632,633 ****
+--- 632,635 ----
+ { /* Add new patch number below this line */
++ /**/
++ 62,
+ /**/
+
+--
+From "know your smileys":
+ :q vi user saying, "How do I get out of this damn emacs editor?"
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// Creator of Vim - Vi IMproved -- http://www.Vim.org \\\
+\\\ Project leader for A-A-P -- http://www.A-A-P.org ///
+ \\\ Help AIDS victims, buy here: http://ICCF-Holland.org/click1.html ///
--- /dev/null
+To: vim-dev@vim.org
+Subject: Patch 6.2.063
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=ISO-8859-1
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 6.2.063
+Problem: When using custom completion end up with no matches.
+Solution: Make cmd_numfiles and cmd_files local to completion to avoid that
+ they are overwritten when ExpandOne() is called recursively by
+ f_glob().
+Files: src/eval.c, src/ex_docmd.c, src/ex_getln.c, src/proto/ex_getln.pro,
+ src/misc1.c, src/structs.h, src/tag.c
+
+
+*** ../vim-6.2.062/src/eval.c Sun Jul 27 15:01:56 2003
+--- src/eval.c Thu Jul 31 19:47:34 2003
+***************
+*** 3933,3941 ****
+ * for 'suffixes' and 'wildignore' */
+ if (argvars[1].var_type != VAR_UNKNOWN && get_var_number(&argvars[1]))
+ flags |= WILD_KEEP_ALL;
+ xpc.xp_context = EXPAND_FILES;
+- xpc.xp_backslash = XP_BS_NONE;
+ retvar->var_val.var_string = ExpandOne(&xpc, s, NULL, flags, WILD_ALL);
+ }
+ }
+
+--- 3935,3944 ----
+ * for 'suffixes' and 'wildignore' */
+ if (argvars[1].var_type != VAR_UNKNOWN && get_var_number(&argvars[1]))
+ flags |= WILD_KEEP_ALL;
++ ExpandInit(&xpc);
+ xpc.xp_context = EXPAND_FILES;
+ retvar->var_val.var_string = ExpandOne(&xpc, s, NULL, flags, WILD_ALL);
++ ExpandCleanup(&xpc);
+ }
+ }
+
+***************
+*** 4543,4553 ****
+ {
+ expand_T xpc;
+
+ xpc.xp_context = EXPAND_FILES;
+- xpc.xp_backslash = XP_BS_NONE;
+ retvar->var_type = VAR_STRING;
+ retvar->var_val.var_string = ExpandOne(&xpc, get_var_string(&argvars[0]),
+ NULL, WILD_USE_NL|WILD_SILENT, WILD_ALL);
+ }
+
+ /*
+--- 4546,4557 ----
+ {
+ expand_T xpc;
+
++ ExpandInit(&xpc);
+ xpc.xp_context = EXPAND_FILES;
+ retvar->var_type = VAR_STRING;
+ retvar->var_val.var_string = ExpandOne(&xpc, get_var_string(&argvars[0]),
+ NULL, WILD_USE_NL|WILD_SILENT, WILD_ALL);
++ ExpandCleanup(&xpc);
+ }
+
+ /*
+*** ../vim-6.2.062/src/ex_docmd.c Sun Jul 27 14:35:27 2003
+--- src/ex_docmd.c Sat Jul 26 18:36:31 2003
+***************
+*** 3694,3704 ****
+ {
+ expand_T xpc;
+
+ xpc.xp_context = EXPAND_FILES;
+! xpc.xp_backslash = XP_BS_NONE;
+! if ((p = ExpandOne(&xpc, eap->arg, NULL,
+ WILD_LIST_NOTFOUND|WILD_ADD_SLASH,
+! WILD_EXPAND_FREE)) == NULL)
+ return FAIL;
+ }
+ if (p != NULL)
+--- 3694,3706 ----
+ {
+ expand_T xpc;
+
++ ExpandInit(&xpc);
+ xpc.xp_context = EXPAND_FILES;
+! p = ExpandOne(&xpc, eap->arg, NULL,
+ WILD_LIST_NOTFOUND|WILD_ADD_SLASH,
+! WILD_EXPAND_FREE);
+! ExpandCleanup(&xpc);
+! if (p == NULL)
+ return FAIL;
+ }
+ if (p != NULL)
+*** ../vim-6.2.062/src/ex_getln.c Thu May 29 22:45:46 2003
+--- src/ex_getln.c Sat Jul 26 18:57:18 2003
+***************
+*** 35,43 ****
+
+ static struct cmdline_info ccline; /* current cmdline_info */
+
+- static int cmd_numfiles = -1; /* number of files found by
+- file name completion */
+- static char_u **cmd_files = NULL; /* list of files */
+ static int cmd_showtail; /* Only show path tail in lists ? */
+
+
+--- 35,40 ----
+***************
+*** 207,212 ****
+--- 204,211 ----
+ ccline.cmdlen = ccline.cmdpos = 0;
+ ccline.cmdbuff[0] = NUL;
+
++ ExpandInit(&xpc);
++
+ #ifdef FEAT_RIGHTLEFT
+ if (curwin->w_p_rl && *curwin->w_p_rlc == 's'
+ && (firstc == '/' || firstc == '?'))
+***************
+*** 339,345 ****
+ && c != K_PAGEDOWN && c != K_PAGEUP
+ && c != K_KPAGEDOWN && c != K_KPAGEUP
+ && c != K_LEFT && c != K_RIGHT
+! && (cmd_numfiles > 0 || (c != Ctrl_P && c != Ctrl_N)))
+ {
+ vim_free(lookfor);
+ lookfor = NULL;
+--- 338,344 ----
+ && c != K_PAGEDOWN && c != K_PAGEUP
+ && c != K_KPAGEDOWN && c != K_KPAGEUP
+ && c != K_LEFT && c != K_RIGHT
+! && (xpc.xp_numfiles > 0 || (c != Ctrl_P && c != Ctrl_N)))
+ {
+ vim_free(lookfor);
+ lookfor = NULL;
+***************
+*** 349,355 ****
+ /*
+ * <S-Tab> works like CTRL-P (unless 'wc' is <S-Tab>).
+ */
+! if (c != p_wc && c == K_S_TAB && cmd_numfiles != -1)
+ c = Ctrl_P;
+
+ #ifdef FEAT_WILDMENU
+--- 348,354 ----
+ /*
+ * <S-Tab> works like CTRL-P (unless 'wc' is <S-Tab>).
+ */
+! if (c != p_wc && c == K_S_TAB && xpc.xp_numfiles != -1)
+ c = Ctrl_P;
+
+ #ifdef FEAT_WILDMENU
+***************
+*** 371,377 ****
+ #endif
+
+ /* free expanded names when finished walking through matches */
+! if (cmd_numfiles != -1
+ && !(c == p_wc && KeyTyped) && c != p_wcm
+ && c != Ctrl_N && c != Ctrl_P && c != Ctrl_A
+ && c != Ctrl_L)
+--- 370,376 ----
+ #endif
+
+ /* free expanded names when finished walking through matches */
+! if (xpc.xp_numfiles != -1
+ && !(c == p_wc && KeyTyped) && c != p_wcm
+ && c != Ctrl_N && c != Ctrl_P && c != Ctrl_A
+ && c != Ctrl_L)
+***************
+*** 629,638 ****
+ */
+ if ((c == p_wc && !gotesc && KeyTyped) || c == p_wcm)
+ {
+! if (cmd_numfiles > 0) /* typed p_wc at least twice */
+ {
+ /* if 'wildmode' contains "list" may still need to list */
+! if (cmd_numfiles > 1
+ && !did_wild_list
+ && (wim_flags[wim_index] & WIM_LIST))
+ {
+--- 628,637 ----
+ */
+ if ((c == p_wc && !gotesc && KeyTyped) || c == p_wcm)
+ {
+! if (xpc.xp_numfiles > 0) /* typed p_wc at least twice */
+ {
+ /* if 'wildmode' contains "list" may still need to list */
+! if (xpc.xp_numfiles > 1
+ && !did_wild_list
+ && (wim_flags[wim_index] & WIM_LIST))
+ {
+***************
+*** 673,679 ****
+ /* when more than one match, and 'wildmode' first contains
+ * "list", or no change and 'wildmode' contains "longest,list",
+ * list all matches */
+! if (res == OK && cmd_numfiles > 1)
+ {
+ /* a "longest" that didn't do anything is skipped (but not
+ * "list:longest") */
+--- 672,678 ----
+ /* when more than one match, and 'wildmode' first contains
+ * "list", or no change and 'wildmode' contains "longest,list",
+ * list all matches */
+! if (res == OK && xpc.xp_numfiles > 1)
+ {
+ /* a "longest" that didn't do anything is skipped (but not
+ * "list:longest") */
+***************
+*** 713,719 ****
+ vim_beep();
+ }
+ #ifdef FEAT_WILDMENU
+! else if (cmd_numfiles == -1)
+ xpc.xp_context = EXPAND_NOTHING;
+ #endif
+ }
+--- 712,718 ----
+ vim_beep();
+ }
+ #ifdef FEAT_WILDMENU
+! else if (xpc.xp_numfiles == -1)
+ xpc.xp_context = EXPAND_NOTHING;
+ #endif
+ }
+***************
+*** 1207,1213 ****
+
+ case Ctrl_N: /* next match */
+ case Ctrl_P: /* previous match */
+! if (cmd_numfiles > 0)
+ {
+ if (nextwild(&xpc, (c == Ctrl_P) ? WILD_PREV : WILD_NEXT, 0)
+ == FAIL)
+--- 1206,1212 ----
+
+ case Ctrl_N: /* next match */
+ case Ctrl_P: /* previous match */
+! if (xpc.xp_numfiles > 0)
+ {
+ if (nextwild(&xpc, (c == Ctrl_P) ? WILD_PREV : WILD_NEXT, 0)
+ == FAIL)
+***************
+*** 1529,1534 ****
+--- 1528,1535 ----
+ cmd_fkmap = 0;
+ #endif
+
++ ExpandCleanup(&xpc);
++
+ #ifdef FEAT_SEARCH_EXTRA
+ if (did_incsearch)
+ {
+***************
+*** 2590,2596 ****
+ int difflen;
+ int v;
+
+! if (cmd_numfiles == -1)
+ {
+ set_expand_context(xp);
+ cmd_showtail = !glob_in_path_prefix(xp);
+--- 2591,2597 ----
+ int difflen;
+ int v;
+
+! if (xp->xp_numfiles == -1)
+ {
+ set_expand_context(xp);
+ cmd_showtail = !glob_in_path_prefix(xp);
+***************
+*** 2678,2686 ****
+ if (xp->xp_context == EXPAND_MAPPINGS && p2 == NULL)
+ return FAIL;
+
+! if (cmd_numfiles <= 0 && p2 == NULL)
+ beep_flush();
+! else if (cmd_numfiles == 1)
+ /* free expanded pattern */
+ (void)ExpandOne(xp, NULL, NULL, 0, WILD_FREE);
+
+--- 2679,2687 ----
+ if (xp->xp_context == EXPAND_MAPPINGS && p2 == NULL)
+ return FAIL;
+
+! if (xp->xp_numfiles <= 0 && p2 == NULL)
+ beep_flush();
+! else if (xp->xp_numfiles == 1)
+ /* free expanded pattern */
+ (void)ExpandOne(xp, NULL, NULL, 0, WILD_FREE);
+
+***************
+*** 2693,2699 ****
+ * Return a pointer to alloced memory containing the new string.
+ * Return NULL for failure.
+ *
+! * Results are cached in cmd_files and cmd_numfiles.
+ *
+ * mode = WILD_FREE: just free previously expanded matches
+ * mode = WILD_EXPAND_FREE: normal expansion, do not keep matches
+--- 2694,2700 ----
+ * Return a pointer to alloced memory containing the new string.
+ * Return NULL for failure.
+ *
+! * Results are cached in xp->xp_files and xp->xp_numfiles.
+ *
+ * mode = WILD_FREE: just free previously expanded matches
+ * mode = WILD_EXPAND_FREE: normal expansion, do not keep matches
+***************
+*** 2734,2745 ****
+ */
+ if (mode == WILD_NEXT || mode == WILD_PREV)
+ {
+! if (cmd_numfiles > 0)
+ {
+ if (mode == WILD_PREV)
+ {
+ if (findex == -1)
+! findex = cmd_numfiles;
+ --findex;
+ }
+ else /* mode == WILD_NEXT */
+--- 2735,2746 ----
+ */
+ if (mode == WILD_NEXT || mode == WILD_PREV)
+ {
+! if (xp->xp_numfiles > 0)
+ {
+ if (mode == WILD_PREV)
+ {
+ if (findex == -1)
+! findex = xp->xp_numfiles;
+ --findex;
+ }
+ else /* mode == WILD_NEXT */
+***************
+*** 2752,2762 ****
+ if (findex < 0)
+ {
+ if (orig_save == NULL)
+! findex = cmd_numfiles - 1;
+ else
+ findex = -1;
+ }
+! if (findex >= cmd_numfiles)
+ {
+ if (orig_save == NULL)
+ findex = 0;
+--- 2753,2763 ----
+ if (findex < 0)
+ {
+ if (orig_save == NULL)
+! findex = xp->xp_numfiles - 1;
+ else
+ findex = -1;
+ }
+! if (findex >= xp->xp_numfiles)
+ {
+ if (orig_save == NULL)
+ findex = 0;
+***************
+*** 2765,2786 ****
+ }
+ #ifdef FEAT_WILDMENU
+ if (p_wmnu)
+! win_redr_status_matches(xp, cmd_numfiles, cmd_files, findex,
+! cmd_showtail);
+ #endif
+ if (findex == -1)
+ return vim_strsave(orig_save);
+! return vim_strsave(cmd_files[findex]);
+ }
+ else
+ return NULL;
+ }
+
+ /* free old names */
+! if (cmd_numfiles != -1 && mode != WILD_ALL && mode != WILD_LONGEST)
+ {
+! FreeWild(cmd_numfiles, cmd_files);
+! cmd_numfiles = -1;
+ vim_free(orig_save);
+ orig_save = NULL;
+ }
+--- 2766,2787 ----
+ }
+ #ifdef FEAT_WILDMENU
+ if (p_wmnu)
+! win_redr_status_matches(xp, xp->xp_numfiles, xp->xp_files,
+! findex, cmd_showtail);
+ #endif
+ if (findex == -1)
+ return vim_strsave(orig_save);
+! return vim_strsave(xp->xp_files[findex]);
+ }
+ else
+ return NULL;
+ }
+
+ /* free old names */
+! if (xp->xp_numfiles != -1 && mode != WILD_ALL && mode != WILD_LONGEST)
+ {
+! FreeWild(xp->xp_numfiles, xp->xp_files);
+! xp->xp_numfiles = -1;
+ vim_free(orig_save);
+ orig_save = NULL;
+ }
+***************
+*** 2789,2795 ****
+ if (mode == WILD_FREE) /* only release file name */
+ return NULL;
+
+! if (cmd_numfiles == -1)
+ {
+ vim_free(orig_save);
+ orig_save = orig;
+--- 2790,2796 ----
+ if (mode == WILD_FREE) /* only release file name */
+ return NULL;
+
+! if (xp->xp_numfiles == -1)
+ {
+ vim_free(orig_save);
+ orig_save = orig;
+***************
+*** 2797,2803 ****
+ /*
+ * Do the expansion.
+ */
+! if (ExpandFromContext(xp, str, &cmd_numfiles, &cmd_files,
+ options) == FAIL)
+ {
+ #ifdef FNAME_ILLEGAL
+--- 2798,2804 ----
+ /*
+ * Do the expansion.
+ */
+! if (ExpandFromContext(xp, str, &xp->xp_numfiles, &xp->xp_files,
+ options) == FAIL)
+ {
+ #ifdef FNAME_ILLEGAL
+***************
+*** 2809,2815 ****
+ EMSG2(_(e_nomatch2), str);
+ #endif
+ }
+! else if (cmd_numfiles == 0)
+ {
+ if (!(options & WILD_SILENT))
+ EMSG2(_(e_nomatch2), str);
+--- 2810,2816 ----
+ EMSG2(_(e_nomatch2), str);
+ #endif
+ }
+! else if (xp->xp_numfiles == 0)
+ {
+ if (!(options & WILD_SILENT))
+ EMSG2(_(e_nomatch2), str);
+***************
+*** 2817,2836 ****
+ else
+ {
+ /* Escape the matches for use on the command line. */
+! ExpandEscape(xp, str, cmd_numfiles, cmd_files, options);
+
+ /*
+ * Check for matching suffixes in file names.
+ */
+ if (mode != WILD_ALL && mode != WILD_LONGEST)
+ {
+! if (cmd_numfiles)
+! non_suf_match = cmd_numfiles;
+ else
+ non_suf_match = 1;
+ if ((xp->xp_context == EXPAND_FILES
+ || xp->xp_context == EXPAND_DIRECTORIES)
+! && cmd_numfiles > 1)
+ {
+ /*
+ * More than one match; check suffix.
+--- 2818,2837 ----
+ else
+ {
+ /* Escape the matches for use on the command line. */
+! ExpandEscape(xp, str, xp->xp_numfiles, xp->xp_files, options);
+
+ /*
+ * Check for matching suffixes in file names.
+ */
+ if (mode != WILD_ALL && mode != WILD_LONGEST)
+ {
+! if (xp->xp_numfiles)
+! non_suf_match = xp->xp_numfiles;
+ else
+ non_suf_match = 1;
+ if ((xp->xp_context == EXPAND_FILES
+ || xp->xp_context == EXPAND_DIRECTORIES)
+! && xp->xp_numfiles > 1)
+ {
+ /*
+ * More than one match; check suffix.
+***************
+*** 2839,2845 ****
+ */
+ non_suf_match = 0;
+ for (i = 0; i < 2; ++i)
+! if (match_suffix(cmd_files[i]))
+ ++non_suf_match;
+ }
+ if (non_suf_match != 1)
+--- 2840,2846 ----
+ */
+ non_suf_match = 0;
+ for (i = 0; i < 2; ++i)
+! if (match_suffix(xp->xp_files[i]))
+ ++non_suf_match;
+ }
+ if (non_suf_match != 1)
+***************
+*** 2855,2887 ****
+ beep_flush();
+ }
+ if (!(non_suf_match != 1 && mode == WILD_EXPAND_FREE))
+! ss = vim_strsave(cmd_files[0]);
+ }
+ }
+ }
+
+ /* Find longest common part */
+! if (mode == WILD_LONGEST && cmd_numfiles > 0)
+ {
+! for (len = 0; cmd_files[0][len]; ++len)
+ {
+! for (i = 0; i < cmd_numfiles; ++i)
+ {
+ #ifdef CASE_INSENSITIVE_FILENAME
+ if (xp->xp_context == EXPAND_DIRECTORIES
+ || xp->xp_context == EXPAND_FILES
+ || xp->xp_context == EXPAND_BUFFERS)
+ {
+! if (TOLOWER_LOC(cmd_files[i][len]) !=
+! TOLOWER_LOC(cmd_files[0][len]))
+ break;
+ }
+ else
+ #endif
+! if (cmd_files[i][len] != cmd_files[0][len])
+ break;
+ }
+! if (i < cmd_numfiles)
+ {
+ if (!(options & WILD_NO_BEEP))
+ vim_beep();
+--- 2856,2888 ----
+ beep_flush();
+ }
+ if (!(non_suf_match != 1 && mode == WILD_EXPAND_FREE))
+! ss = vim_strsave(xp->xp_files[0]);
+ }
+ }
+ }
+
+ /* Find longest common part */
+! if (mode == WILD_LONGEST && xp->xp_numfiles > 0)
+ {
+! for (len = 0; xp->xp_files[0][len]; ++len)
+ {
+! for (i = 0; i < xp->xp_numfiles; ++i)
+ {
+ #ifdef CASE_INSENSITIVE_FILENAME
+ if (xp->xp_context == EXPAND_DIRECTORIES
+ || xp->xp_context == EXPAND_FILES
+ || xp->xp_context == EXPAND_BUFFERS)
+ {
+! if (TOLOWER_LOC(xp->xp_files[i][len]) !=
+! TOLOWER_LOC(xp->xp_files[0][len]))
+ break;
+ }
+ else
+ #endif
+! if (xp->xp_files[i][len] != xp->xp_files[0][len])
+ break;
+ }
+! if (i < xp->xp_numfiles)
+ {
+ if (!(options & WILD_NO_BEEP))
+ vim_beep();
+***************
+*** 2891,2930 ****
+ ss = alloc((unsigned)len + 1);
+ if (ss)
+ {
+! STRNCPY(ss, cmd_files[0], len);
+ ss[len] = NUL;
+ }
+ findex = -1; /* next p_wc gets first one */
+ }
+
+ /* Concatenate all matching names */
+! if (mode == WILD_ALL && cmd_numfiles > 0)
+ {
+ len = 0;
+! for (i = 0; i < cmd_numfiles; ++i)
+! len += (long_u)STRLEN(cmd_files[i]) + 1;
+ ss = lalloc(len, TRUE);
+ if (ss != NULL)
+ {
+ *ss = NUL;
+! for (i = 0; i < cmd_numfiles; ++i)
+ {
+! STRCAT(ss, cmd_files[i]);
+! if (i != cmd_numfiles - 1)
+ STRCAT(ss, (options & WILD_USE_NL) ? "\n" : " ");
+ }
+ }
+ }
+
+ if (mode == WILD_EXPAND_FREE || mode == WILD_ALL)
+! {
+! FreeWild(cmd_numfiles, cmd_files);
+! cmd_numfiles = -1;
+! }
+
+ return ss;
+ }
+
+ void
+ ExpandEscape(xp, str, numfiles, files, options)
+ expand_T *xp;
+--- 2892,2954 ----
+ ss = alloc((unsigned)len + 1);
+ if (ss)
+ {
+! STRNCPY(ss, xp->xp_files[0], len);
+ ss[len] = NUL;
+ }
+ findex = -1; /* next p_wc gets first one */
+ }
+
+ /* Concatenate all matching names */
+! if (mode == WILD_ALL && xp->xp_numfiles > 0)
+ {
+ len = 0;
+! for (i = 0; i < xp->xp_numfiles; ++i)
+! len += (long_u)STRLEN(xp->xp_files[i]) + 1;
+ ss = lalloc(len, TRUE);
+ if (ss != NULL)
+ {
+ *ss = NUL;
+! for (i = 0; i < xp->xp_numfiles; ++i)
+ {
+! STRCAT(ss, xp->xp_files[i]);
+! if (i != xp->xp_numfiles - 1)
+ STRCAT(ss, (options & WILD_USE_NL) ? "\n" : " ");
+ }
+ }
+ }
+
+ if (mode == WILD_EXPAND_FREE || mode == WILD_ALL)
+! ExpandCleanup(xp);
+
+ return ss;
+ }
+
++ /*
++ * Prepare an expand structure for use.
++ */
++ void
++ ExpandInit(xp)
++ expand_T *xp;
++ {
++ xp->xp_backslash = XP_BS_NONE;
++ xp->xp_numfiles = -1;
++ xp->xp_files = NULL;
++ }
++
++ /*
++ * Cleanup an expand structure after use.
++ */
++ void
++ ExpandCleanup(xp)
++ expand_T *xp;
++ {
++ if (xp->xp_numfiles >= 0)
++ {
++ FreeWild(xp->xp_numfiles, xp->xp_files);
++ xp->xp_numfiles = -1;
++ }
++ }
++
+ void
+ ExpandEscape(xp, str, numfiles, files, options)
+ expand_T *xp;
+***************
+*** 3078,3084 ****
+ int attr;
+ int showtail;
+
+! if (cmd_numfiles == -1)
+ {
+ set_expand_context(xp);
+ i = expand_cmdline(xp, ccline.cmdbuff, ccline.cmdpos,
+--- 3102,3108 ----
+ int attr;
+ int showtail;
+
+! if (xp->xp_numfiles == -1)
+ {
+ set_expand_context(xp);
+ i = expand_cmdline(xp, ccline.cmdbuff, ccline.cmdpos,
+***************
+*** 3090,3097 ****
+ }
+ else
+ {
+! num_files = cmd_numfiles;
+! files_found = cmd_files;
+ showtail = cmd_showtail;
+ }
+
+--- 3114,3121 ----
+ }
+ else
+ {
+! num_files = xp->xp_numfiles;
+! files_found = xp->xp_files;
+ showtail = cmd_showtail;
+ }
+
+***************
+*** 3215,3221 ****
+ cmdline_row = msg_row; /* will put it back later */
+ }
+
+! if (cmd_numfiles == -1)
+ FreeWild(num_files, files_found);
+
+ return EXPAND_OK;
+--- 3239,3245 ----
+ cmdline_row = msg_row; /* will put it back later */
+ }
+
+! if (xp->xp_numfiles == -1)
+ FreeWild(num_files, files_found);
+
+ return EXPAND_OK;
+*** ../vim-6.2.062/src/proto/ex_getln.pro Sun Jun 1 12:26:09 2003
+--- src/proto/ex_getln.pro Sat Jul 26 18:38:51 2003
+***************
+*** 14,19 ****
+--- 14,21 ----
+ void compute_cmdrow __ARGS((void));
+ void gotocmdline __ARGS((int clr));
+ char_u *ExpandOne __ARGS((expand_T *xp, char_u *str, char_u *orig, int options, int mode));
++ void ExpandInit __ARGS((expand_T *xp));
++ void ExpandCleanup __ARGS((expand_T *xp));
+ void ExpandEscape __ARGS((expand_T *xp, char_u *str, int numfiles, char_u **files, int options));
+ void tilde_replace __ARGS((char_u *orig_pat, int num_files, char_u **files));
+ char_u *sm_gettail __ARGS((char_u *s));
+*** ../vim-6.2.062/src/misc1.c Thu May 29 20:32:05 2003
+--- src/misc1.c Sat Jul 26 18:37:24 2003
+***************
+*** 3212,3221 ****
+ {
+ expand_T xpc;
+
+ xpc.xp_context = EXPAND_FILES;
+- xpc.xp_backslash = XP_BS_NONE;
+ var = ExpandOne(&xpc, dst, NULL,
+ WILD_ADD_SLASH|WILD_SILENT, WILD_EXPAND_FREE);
+ mustfree = TRUE;
+ }
+
+--- 3212,3222 ----
+ {
+ expand_T xpc;
+
++ ExpandInit(&xpc);
+ xpc.xp_context = EXPAND_FILES;
+ var = ExpandOne(&xpc, dst, NULL,
+ WILD_ADD_SLASH|WILD_SILENT, WILD_EXPAND_FREE);
++ ExpandCleanup(&xpc);
+ mustfree = TRUE;
+ }
+
+*** ../vim-6.2.062/src/structs.h Mon May 26 21:08:40 2003
+--- src/structs.h Sat Jul 26 18:30:51 2003
+***************
+*** 376,381 ****
+--- 376,384 ----
+ char_u *xp_pattern; /* start of item to expand */
+ char_u *xp_arg; /* generic expansion argument */
+ int xp_backslash; /* one of the XP_BS_ values */
++ int xp_numfiles; /* number of files found by
++ file name completion */
++ char_u **xp_files; /* list of files */
+ } expand_T;
+
+ /* values for xp_backslash */
+*** ../vim-6.2.062/src/tag.c Sun Jun 1 14:41:25 2003
+--- src/tag.c Thu Jul 31 18:27:34 2003
+***************
+*** 2811,2820 ****
+ */
+ if (expand && mch_has_wildcard(fname))
+ {
+ xpc.xp_context = EXPAND_FILES;
+- xpc.xp_backslash = XP_BS_NONE;
+ expanded_fname = ExpandOne(&xpc, (char_u *)fname, NULL,
+ WILD_LIST_NOTFOUND|WILD_SILENT, WILD_EXPAND_FREE);
+ if (expanded_fname != NULL)
+ fname = expanded_fname;
+ }
+--- 2811,2821 ----
+ */
+ if (expand && mch_has_wildcard(fname))
+ {
++ ExpandInit(&xpc);
+ xpc.xp_context = EXPAND_FILES;
+ expanded_fname = ExpandOne(&xpc, (char_u *)fname, NULL,
+ WILD_LIST_NOTFOUND|WILD_SILENT, WILD_EXPAND_FREE);
++ ExpandCleanup(&xpc);
+ if (expanded_fname != NULL)
+ fname = expanded_fname;
+ }
+*** ../vim-6.2.062/src/version.c Sun Aug 10 14:52:30 2003
+--- src/version.c Sun Aug 10 22:14:52 2003
+***************
+*** 632,633 ****
+--- 632,635 ----
+ { /* Add new patch number below this line */
++ /**/
++ 63,
+ /**/
+
+--
+From "know your smileys":
+ ...---... SOS
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// Creator of Vim - Vi IMproved -- http://www.Vim.org \\\
+\\\ Project leader for A-A-P -- http://www.A-A-P.org ///
+ \\\ Help AIDS victims, buy here: http://ICCF-Holland.org/click1.html ///
--- /dev/null
+To: vim-dev@vim.org
+Subject: Patch 6.2.064
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=ISO-8859-1
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 6.2.064
+Problem: resolve() only handles one symbolic link, need to repeat it to
+ resolve all of them. Then need to simplify the file name.
+Solution: Make resolve() resolve all symbolic links and simplify the result.
+ Add simplify() to just simplify a file name. Fix that test49
+ doesn't work if /tmp is a symbolic link. (Servatius Brandt)
+Files: runtime/doc/eval.txt, src/eval.c, src/tag.c,
+ src/testdir/test49.vim
+
+
+*** ../vim-6.2.063/runtime/doc/eval.txt Sun Jun 1 14:45:23 2003
+--- runtime/doc/eval.txt Thu Aug 7 19:31:16 2003
+***************
+*** 1,4 ****
+! *eval.txt* For Vim version 6.2. Last change: 2003 Jun 01
+
+
+ VIM REFERENCE MANUAL by Bram Moolenaar
+--- 1,4 ----
+! *eval.txt* For Vim version 6.2. Last change: 2003 Aug 07
+
+
+ VIM REFERENCE MANUAL by Bram Moolenaar
+***************
+*** 885,890 ****
+--- 887,893 ----
+ setline( {lnum}, {line}) Number set line {lnum} to {line}
+ setreg( {n}, {v}[, {opt}]) Number set register to value and type
+ setwinvar( {nr}, {varname}, {val}) set {varname} in window {nr} to {val}
++ simplify( {filename}) String simplify filename as much as possible
+ strftime( {format}[, {time}]) String time in specified format
+ stridx( {haystack}, {needle}) Number first index of {needle} in {haystack}
+ strlen( {expr}) Number length of the String {expr}
+***************
+*** 2104,2116 ****
+ successfully, and non-zero when the renaming failed.
+ This function is not available in the |sandbox|.
+
+! resolve({filename}) *resolve()*
+ On MS-Windows, when {filename} is a shortcut (a .lnk file),
+! returns the path the shortcut points to.
+! On Unix, when {filename} is a symbolic link, returns the path
+! the symlink points to. This only happens once, the returned
+! path could be a symlink again.
+! Otherwise {filename} is returned.
+
+ search({pattern} [, {flags}]) *search()*
+ Search for regexp pattern {pattern}. The search starts at the
+--- 2112,2129 ----
+ successfully, and non-zero when the renaming failed.
+ This function is not available in the |sandbox|.
+
+! resolve({filename}) *resolve()* *E655*
+ On MS-Windows, when {filename} is a shortcut (a .lnk file),
+! returns the path the shortcut points to in a simplified form.
+! On Unix, repeat resolving symbolic links in all path
+! components of {filename} and return the simplified result.
+! To cope with link cycles, resolving of symbolic links is
+! stopped after 100 iterations.
+! On other systems, return the simplified {filename}.
+! The simplification step is done as by |simplify()|.
+! resolve() keeps a leading path component specifying the
+! current directory (provided the result is still a relative
+! path name) and also keeps a trailing path separator.
+
+ search({pattern} [, {flags}]) *search()*
+ Search for regexp pattern {pattern}. The search starts at the
+***************
+*** 2302,2307 ****
+--- 2315,2335 ----
+ :call setwinvar(2, "myvar", "foobar")
+ < This function is not available in the |sandbox|.
+
++ simplify({filename}) *simplify()*
++ Simplify the file name as much as possible without changing
++ the meaning. Shortcuts (on MS-Windows) or symbolic links (on
++ Unix) are not resolved. If the first path component in
++ {filename} designates the current directory, this will be
++ valid for the result as well. A trailing path separator is
++ not removed either.
++ Example: >
++ simplify("./dir/.././/file/") == "./file/"
++ < Note: The combination "dir/.." is only removed if "dir" is
++ a searchable directory or does not exist. On Unix, it is also
++ removed when "dir" is a symbolic link within the same
++ directory. In order to resolve all the involved symbolic
++ links before simplifying the path name, use |resolve()|.
++
+ strftime({format} [, {time}]) *strftime()*
+ The result is a String, which is a formatted date and time, as
+ specified by the {format} string. The given {time} is used,
+*** ../vim-6.2.063/src/eval.c Sun Aug 10 22:24:37 2003
+--- src/eval.c Thu Jul 31 19:47:34 2003
+***************
+*** 318,323 ****
+--- 318,324 ----
+ static void f_serverlist __ARGS((VAR argvars, VAR retvar));
+ static void f_setline __ARGS((VAR argvars, VAR retvar));
+ static void f_setreg __ARGS((VAR argvars, VAR retvar));
++ static void f_simplify __ARGS((VAR argvars, VAR retvar));
+ static void find_some_match __ARGS((VAR argvars, VAR retvar, int start));
+ static void f_strftime __ARGS((VAR argvars, VAR retvar));
+ static void f_stridx __ARGS((VAR argvars, VAR retvar));
+***************
+*** 2812,2817 ****
+--- 2813,2819 ----
+ {"setline", 2, 2, f_setline},
+ {"setreg", 2, 3, f_setreg},
+ {"setwinvar", 3, 3, f_setwinvar},
++ {"simplify", 1, 1, f_simplify},
+ #ifdef HAVE_STRFTIME
+ {"strftime", 1, 2, f_strftime},
+ #endif
+***************
+*** 5808,5813 ****
+--- 5810,5816 ----
+ VAR retvar;
+ {
+ char_u *p;
++ int limit = 100;
+
+ p = get_var_string(&argvars[0]);
+ #ifdef FEAT_SHORTCUT
+***************
+*** 5826,5858 ****
+ char_u buf[MAXPATHL + 1];
+ char_u *cpy;
+ int len;
+
+! len = readlink((char *)p, (char *)buf, MAXPATHL);
+! if (len > 0)
+ {
+! buf[len] = NUL;
+! if (gettail(p) > p && !mch_isFullName(buf))
+ {
+! /* symlink is relative to directory of argument */
+! cpy = alloc((unsigned)(STRLEN(p) + STRLEN(buf) + 1));
+! if (cpy != NULL)
+ {
+! STRCPY(cpy, p);
+! STRCPY(gettail(cpy), buf);
+! retvar->var_val.var_string = cpy;
+! p = NULL;
+ }
+ }
+ else
+! p = buf;
+ }
+! if (p != NULL)
+! retvar->var_val.var_string = vim_strsave(p);
+ }
+ # else
+ retvar->var_val.var_string = vim_strsave(p);
+ # endif
+ #endif
+ retvar->var_type = VAR_STRING;
+ }
+
+--- 5829,6020 ----
+ char_u buf[MAXPATHL + 1];
+ char_u *cpy;
+ int len;
++ char_u *remain = NULL;
++ char_u *q;
++ int is_relative_to_current = FALSE;
++ int has_trailing_pathsep = FALSE;
+
+! p = vim_strsave(p);
+!
+! if (p[0] == '.' && (vim_ispathsep(p[1])
+! || (p[1] == '.' && (vim_ispathsep(p[2])))))
+! is_relative_to_current = TRUE;
+!
+! len = STRLEN(p);
+! if (len > 0 && vim_ispathsep(p[len-1]))
+! has_trailing_pathsep = TRUE;
+!
+! q = getnextcomp(p);
+! if (*q != NUL)
+! {
+! /* Separate the first path component in "p", and keep the
+! * remainder (beginning with the path separator). */
+! remain = vim_strsave(q - 1);
+! q[-1] = NUL;
+! }
+!
+! for(;;)
+ {
+! for (;;)
+ {
+! len = readlink((char *)p, (char *)buf, MAXPATHL);
+! if (len <= 0)
+! break;
+! buf[len] = NUL;
+!
+! if (limit-- == 0)
+! {
+! vim_free(p);
+! vim_free(remain);
+! EMSG(_("E655: Too much symbolic links (cycle?)"));
+! retvar->var_val.var_string = NULL;
+! goto fail;
+! }
+!
+! /* Ensure that the result will have a trailing path separator
+! * if the argument has one. */
+! if (remain == NULL && has_trailing_pathsep)
+! add_pathsep(buf);
+!
+! /* Separate the first path component in the link value and
+! * concatenate the remainders. */
+! q = getnextcomp(vim_ispathsep(*buf) ? buf + 1 : buf);
+! if (*q != NUL)
+! {
+! if (remain == NULL)
+! remain = vim_strsave(q - 1);
+! else
+! {
+! cpy = vim_strnsave(q-1, STRLEN(q-1)+STRLEN(remain));
+! if (cpy != NULL)
+! {
+! STRCAT(cpy, remain);
+! vim_free(remain);
+! remain = cpy;
+! }
+! }
+! q[-1] = NUL;
+! }
+!
+! q = gettail(p);
+! if (q > p && *q == NUL)
+! {
+! /* Ignore trailing path separator. */
+! q[-1] = NUL;
+! q = gettail(p);
+! }
+! if (q > p && !mch_isFullName(buf))
+! {
+! /* symlink is relative to directory of argument */
+! cpy = alloc((unsigned)(STRLEN(p) + STRLEN(buf) + 1));
+! if (cpy != NULL)
+! {
+! STRCPY(cpy, p);
+! STRCPY(gettail(cpy), buf);
+! vim_free(p);
+! p = cpy;
+! }
+! }
+! else
+ {
+! vim_free(p);
+! p = vim_strsave(buf);
+ }
+ }
++
++ if (remain == NULL)
++ break;
++
++ /* Append the first path component of "remain" to "p". */
++ q = getnextcomp(remain + 1);
++ len = q - remain - (*q != NUL);
++ cpy = vim_strnsave(p, STRLEN(p) + len);
++ if (cpy != NULL)
++ {
++ STRNCAT(cpy, remain, len);
++ vim_free(p);
++ p = cpy;
++ }
++ /* Shorten "remain". */
++ if (*q != NUL)
++ STRCPY(remain, q - 1);
+ else
+! {
+! vim_free(remain);
+! remain = NULL;
+! }
+ }
+!
+! /* If the result is a relative path name, make it explicitly relative to
+! * the current directory if and only if the argument had this form. */
+! if (!vim_ispathsep(*p))
+! {
+! if (is_relative_to_current
+! && *p != NUL
+! && !(p[0] == '.'
+! && (p[1] == NUL
+! || vim_ispathsep(p[1])
+! || (p[1] == '.'
+! && (p[2] == NUL
+! || vim_ispathsep(p[2]))))))
+! {
+! /* Prepend "./". */
+! cpy = vim_strnsave((char_u *)"./", 2 + STRLEN(p));
+! if (cpy != NULL)
+! {
+! STRCAT(cpy, p);
+! vim_free(p);
+! p = cpy;
+! }
+! }
+! else if (!is_relative_to_current)
+! {
+! /* Strip leading "./". */
+! q = p;
+! while (q[0] == '.' && vim_ispathsep(q[1]))
+! q += 2;
+! if (q > p)
+! mch_memmove(p, p + 2, STRLEN(p + 2) + (size_t)1);
+! }
+! }
+!
+! /* Ensure that the result will have no trailing path separator
+! * if the argument had none. But keep "/" or "//". */
+! if (!has_trailing_pathsep)
+! {
+! q = p + STRLEN(p);
+! while ((q > p + 2 || (q == p + 2 && !vim_ispathsep(*p)))
+! && vim_ispathsep(q[-1]))
+! --q;
+! *q = NUL;
+! }
+!
+! retvar->var_val.var_string = p;
+ }
+ # else
+ retvar->var_val.var_string = vim_strsave(p);
+ # endif
+ #endif
++
++ simplify_filename(retvar->var_val.var_string);
++
++ fail:
++ retvar->var_type = VAR_STRING;
++ }
++
++ /*
++ * "simplify()" function
++ */
++ static void
++ f_simplify(argvars, retvar)
++ VAR argvars;
++ VAR retvar;
++ {
++ char_u *p;
++
++ p = get_var_string(&argvars[0]);
++ retvar->var_val.var_string = vim_strsave(p);
++ simplify_filename(retvar->var_val.var_string); /* simplify in place */
+ retvar->var_type = VAR_STRING;
+ }
+
+*** ../vim-6.2.063/src/tag.c Sun Aug 10 22:24:37 2003
+--- src/tag.c Thu Jul 31 18:27:34 2003
+***************
+*** 2864,2875 ****
+ #ifndef AMIGA /* Amiga doesn't have "..", it uses "/" */
+ int components = 0;
+ char_u *p, *tail, *start;
+! #ifdef UNIX
+! char_u *orig = vim_strsave(filename);
+!
+! if (orig == NULL)
+! return;
+! #endif
+
+ p = filename;
+ #ifdef BACKSLASH_IN_FILENAME
+--- 2864,2871 ----
+ #ifndef AMIGA /* Amiga doesn't have "..", it uses "/" */
+ int components = 0;
+ char_u *p, *tail, *start;
+! int stripping_disabled = FALSE;
+! int relative = TRUE;
+
+ p = filename;
+ #ifdef BACKSLASH_IN_FILENAME
+***************
+*** 2877,2889 ****
+ p += 2;
+ #endif
+
+! while (vim_ispathsep(*p))
+! ++p;
+! start = p; /* remember start after "c:/" or "/" or "//" */
+
+ do
+ {
+! /* At this point "p" is pointing to the char following a "/". */
+ #ifdef VMS
+ /* VMS allows device:[path] - don't strip the [ in directory */
+ if ((*p == '[' || *p == '<') && p > filename && p[-1] == ':')
+--- 2873,2891 ----
+ p += 2;
+ #endif
+
+! if (vim_ispathsep(*p))
+! {
+! relative = FALSE;
+! do
+! ++p;
+! while (vim_ispathsep(*p));
+! }
+! start = p; /* remember start after "c:/" or "/" or "///" */
+
+ do
+ {
+! /* At this point "p" is pointing to the char following a single "/"
+! * or "p" is at the "start" of the (absolute or relative) path name. */
+ #ifdef VMS
+ /* VMS allows device:[path] - don't strip the [ in directory */
+ if ((*p == '[' || *p == '<') && p > filename && p[-1] == ':')
+***************
+*** 2898,2952 ****
+ /* ":: composition: vms host/passwd component */
+ ++components;
+ p = getnextcomp(p + 2);
+-
+ }
+ else
+ #endif
+ if (vim_ispathsep(*p))
+ movetail(p, p + 1); /* remove duplicate "/" */
+! else if (p[0] == '.' && vim_ispathsep(p[1]))
+! movetail(p, p + 2); /* strip "./" */
+! else if (p[0] == '.' && p[1] == '.' && vim_ispathsep(p[2]))
+ {
+ if (components > 0) /* strip one preceding component */
+ {
+! tail = p + 3; /* skip to after "../" or "..///" */
+! while (vim_ispathsep(*tail))
+! ++tail;
+! --p;
+! /* skip back to after previous '/' */
+! while (p > start && !vim_ispathsep(p[-1]))
+! --p;
+! /* skip back to after first '/' in a row */
+! while (p - 1 > start && vim_ispathsep(p[-2]))
+ --p;
+! movetail(p, tail); /* strip previous component */
+! --components;
+ }
+- else /* leading "../" */
+- p += 3; /* skip to char after "/" */
+ }
+ else
+ {
+ ++components; /* simple path component */
+ p = getnextcomp(p);
+ }
+! } while (p != NULL && *p != NUL);
+!
+! #ifdef UNIX
+! /* Check that the new file name is really the same file. This will not be
+! * the case when using symbolic links: "dir/link/../name" != "dir/name". */
+! {
+! struct stat orig_st, new_st;
+!
+! if ( mch_stat((char *)orig, &orig_st) < 0
+! || mch_stat((char *)filename, &new_st) < 0
+! || orig_st.st_ino != new_st.st_ino
+! || orig_st.st_dev != new_st.st_dev)
+! STRCPY(filename, orig);
+! vim_free(orig);
+! }
+! #endif
+ #endif /* !AMIGA */
+ }
+
+--- 2900,3064 ----
+ /* ":: composition: vms host/passwd component */
+ ++components;
+ p = getnextcomp(p + 2);
+ }
+ else
+ #endif
+ if (vim_ispathsep(*p))
+ movetail(p, p + 1); /* remove duplicate "/" */
+! else if (p[0] == '.' && (vim_ispathsep(p[1]) || p[1] == NUL))
+! {
+! if (p == start && relative)
+! p += 1 + (p[1] != NUL); /* keep single "." or leading "./" */
+! else
+! {
+! /* Strip "./" or ".///". If we are at the end of the file name
+! * and there is no trailing path separator, either strip "/." if
+! * we are after "start", or strip "." if we are at the beginning
+! * of an absolute path name . */
+! tail = p + 1;
+! if (p[1] != NUL)
+! while (vim_ispathsep(*tail))
+! ++tail;
+! else if (p > start)
+! --p; /* strip preceding path separator */
+! movetail(p, tail);
+! }
+! }
+! else if (p[0] == '.' && p[1] == '.' &&
+! (vim_ispathsep(p[2]) || p[2] == NUL))
+ {
++ /* Skip to after ".." or "../" or "..///". */
++ tail = p + 2;
++ while (vim_ispathsep(*tail))
++ ++tail;
++
+ if (components > 0) /* strip one preceding component */
+ {
+! int do_strip = FALSE;
+! char_u saved_char;
+! struct stat st, new_st;
+!
+! /* Don't strip for an erroneous file name. */
+! if (!stripping_disabled)
+! {
+! /* If the preceding component does not exist in the file
+! * system, we strip it. On Unix, we don't accept a symbolic
+! * link that refers to a non-existent file. */
+! saved_char = p[-1];
+! p[-1] = NUL;
+! #ifdef UNIX
+! if (mch_lstat((char *)filename, &st) < 0)
+! #else
+! if (mch_stat((char *)filename, &st) < 0)
+! #endif
+! do_strip = TRUE;
+! p[-1] = saved_char;
+!
+ --p;
+! /* Skip back to after previous '/'. */
+! while (p > start && !vim_ispathsep(p[-1]))
+! --p;
+!
+! if (!do_strip)
+! {
+! /* If the component exists in the file system, check
+! * that stripping it won't change the meaning of the
+! * file name. First get information about the
+! * unstripped file name. This may fail if the component
+! * to strip is not a searchable directory (but a regular
+! * file, for instance), since the trailing "/.." cannot
+! * be applied then. We don't strip it then since we
+! * don't want to replace an erroneous file name by
+! * a valid one, and we disable stripping of later
+! * components. */
+! saved_char = *tail;
+! *tail = NUL;
+! if (mch_stat((char *)filename, &st) >= 0)
+! do_strip = TRUE;
+! else
+! stripping_disabled = TRUE;
+! *tail = saved_char;
+! #ifdef UNIX
+! if (do_strip)
+! {
+! /* On Unix, the check for the unstripped file name
+! * above works also for a symbolic link pointing to
+! * a searchable directory. But then the parent of
+! * the directory pointed to by the link must be the
+! * same as the stripped file name. (The latter
+! * exists in the file system since it is the
+! * component's parent directory.) */
+! if (p == start && relative)
+! (void)mch_stat(".", &new_st);
+! else
+! {
+! saved_char = *p;
+! *p = NUL;
+! (void)mch_stat((char *)filename, &new_st);
+! *p = saved_char;
+! }
+!
+! if (new_st.st_ino != st.st_ino ||
+! new_st.st_dev != st.st_dev)
+! {
+! do_strip = FALSE;
+! /* We don't disable stripping of later
+! * components since the unstripped path name is
+! * still valid. */
+! }
+! }
+! #endif
+! }
+! }
+!
+! if (!do_strip)
+! {
+! /* Skip the ".." or "../" and reset the counter for the
+! * components that might be stripped later on. */
+! p = tail;
+! components = 0;
+! }
+! else
+! {
+! /* Strip previous component. If the result would get empty
+! * and there is no trailing path separator, leave a single
+! * "." instead. If we are at the end of the file name and
+! * there is no trailing path separator and a preceding
+! * component is left after stripping, strip its trailing
+! * path separator as well. */
+! if (p == start && relative && tail[-1] == '.')
+! {
+! *p++ = '.';
+! *p = NUL;
+! }
+! else
+! {
+! if (p > start && tail[-1] == '.')
+! --p;
+! movetail(p, tail); /* strip previous component */
+! }
+!
+! --components;
+! }
+! }
+! else if (p == start && !relative) /* leading "/.." or "/../" */
+! movetail(p, tail); /* strip ".." or "../" */
+! else
+! {
+! if (p == start + 2 && p[-2] == '.') /* leading "./../" */
+! {
+! movetail(p - 2, p); /* strip leading "./" */
+! tail -= 2;
+! }
+! p = tail; /* skip to char after ".." or "../" */
+ }
+ }
+ else
+ {
+ ++components; /* simple path component */
+ p = getnextcomp(p);
+ }
+! } while (*p != NUL);
+ #endif /* !AMIGA */
+ }
+
+*** ../vim-6.2.063/src/testdir/test49.vim Fri May 30 21:45:31 2003
+--- src/testdir/test49.vim Thu Jul 31 18:25:02 2003
+***************
+*** 1,6 ****
+ " Vim script language tests
+ " Author: Servatius Brandt <Servatius.Brandt@fujitsu-siemens.com>
+! " Last Change: 2003 May 30
+
+ "-------------------------------------------------------------------------------
+ " Test environment {{{1
+--- 1,6 ----
+ " Vim script language tests
+ " Author: Servatius Brandt <Servatius.Brandt@fujitsu-siemens.com>
+! " Last Change: 2003 Jul 30
+
+ "-------------------------------------------------------------------------------
+ " Test environment {{{1
+***************
+*** 5076,5082 ****
+ Xpath 1048576 " X: 1048576
+ let exception = v:exception
+ let throwpoint = v:throwpoint
+! call CHECK(7, "autsch", scriptT, '\<6\>')
+ finally
+ Xpath 2097152 " X: 2097152
+ let exception = v:exception
+--- 5076,5085 ----
+ Xpath 1048576 " X: 1048576
+ let exception = v:exception
+ let throwpoint = v:throwpoint
+! " Symbolic links in tempname()s are not resolved, whereas resolving
+! " is done for v:throwpoint. Resolve the temporary file name for
+! " scriptT, so that it can be matched against v:throwpoint.
+! call CHECK(7, "autsch", resolve(scriptT), '\<6\>')
+ finally
+ Xpath 2097152 " X: 2097152
+ let exception = v:exception
+***************
+*** 5091,5097 ****
+ Xpath 8388608 " X: 8388608
+ let exception = v:exception
+ let throwpoint = v:throwpoint
+! call CHECK(9, "brrrr", scriptT, '\<8\>')
+ finally
+ Xpath 16777216 " X: 16777216
+ let exception = v:exception
+--- 5094,5101 ----
+ Xpath 8388608 " X: 8388608
+ let exception = v:exception
+ let throwpoint = v:throwpoint
+! " Resolve scriptT for matching it against v:throwpoint.
+! call CHECK(9, "brrrr", resolve(scriptT), '\<8\>')
+ finally
+ Xpath 16777216 " X: 16777216
+ let exception = v:exception
+*** ../vim-6.2.063/src/version.c Sun Aug 10 22:24:37 2003
+--- src/version.c Sun Aug 10 22:26:34 2003
+***************
+*** 632,633 ****
+--- 632,635 ----
+ { /* Add new patch number below this line */
++ /**/
++ 64,
+ /**/
+
+--
+From "know your smileys":
+ :-{} Too much lipstick
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// Creator of Vim - Vi IMproved -- http://www.Vim.org \\\
+\\\ Project leader for A-A-P -- http://www.A-A-P.org ///
+ \\\ Help AIDS victims, buy here: http://ICCF-Holland.org/click1.html ///
--- /dev/null
+To: vim-dev@vim.org
+Subject: Patch 6.2.065
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=ISO-8859-1
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 6.2.065
+Problem: ":windo 123" only updates other windows when entering them.
+ (Walter Briscoe)
+Solution: Update the topline before going to the next window.
+Files: src/ex_cmds2.c
+
+
+*** ../vim-6.2.064/src/ex_cmds2.c Mon Jun 30 22:27:28 2003
+--- src/ex_cmds2.c Sun Jul 27 12:54:45 2003
+***************
+*** 1687,1700 ****
+ break;
+ }
+
+! #ifdef FEAT_SCROLLBIND
+! if (eap->cmdidx == CMD_windo && curwin->w_p_scb)
+ {
+ /* required when 'scrollbind' has been set */
+! validate_cursor(); /* may need to update w_leftcol */
+! do_check_scrollbind(TRUE);
+! }
+ #endif
+ }
+ listcmd_busy = FALSE;
+ }
+--- 1687,1701 ----
+ break;
+ }
+
+! if (eap->cmdidx == CMD_windo)
+ {
++ validate_cursor(); /* cursor may have moved */
++ #ifdef FEAT_SCROLLBIND
+ /* required when 'scrollbind' has been set */
+! if (curwin->w_p_scb)
+! do_check_scrollbind(TRUE);
+ #endif
++ }
+ }
+ listcmd_busy = FALSE;
+ }
+*** ../vim-6.2.064/src/version.c Sun Aug 10 22:31:29 2003
+--- src/version.c Sun Aug 10 22:33:26 2003
+***************
+*** 632,633 ****
+--- 632,635 ----
+ { /* Add new patch number below this line */
++ /**/
++ 65,
+ /**/
+
+--
+From "know your smileys":
+ =):-) Uncle Sam
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// Creator of Vim - Vi IMproved -- http://www.Vim.org \\\
+\\\ Project leader for A-A-P -- http://www.A-A-P.org ///
+ \\\ Help AIDS victims, buy here: http://ICCF-Holland.org/click1.html ///
--- /dev/null
+To: vim-dev@vim.org
+Subject: Patch 6.2.066 (extra)
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=ISO-8859-1
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 6.2.066 (extra)
+Problem: Ruby interface doesn't work with Ruby 1.8.0.
+Solution: Change "defout" to "stdout". (Aron Grifis)
+ Change dynamic loading. (Taro Muraoka)
+Files: src/if_ruby.c, src/Make_mvc.mak
+
+
+*** ../vim-6.2.065/src/if_ruby.c Sat Apr 19 15:21:16 2003
+--- src/if_ruby.c Fri Aug 8 20:43:45 2003
+***************
+*** 12,18 ****
+ #include <string.h>
+
+ #ifdef _WIN32
+! # define NT
+ # ifndef DYNAMIC_RUBY
+ # define IMPORT /* For static dll usage __declspec(dllimport) */
+ # define RUBYEXTERN __declspec(dllimport)
+--- 12,20 ----
+ #include <string.h>
+
+ #ifdef _WIN32
+! # if !defined(DYNAMIC_RUBY_VER) || (DYNAMIC_RUBY_VER < 18)
+! # define NT
+! # endif
+ # ifndef DYNAMIC_RUBY
+ # define IMPORT /* For static dll usage __declspec(dllimport) */
+ # define RUBYEXTERN __declspec(dllimport)
+***************
+*** 33,38 ****
+--- 35,49 ----
+ # define rb_cNilClass (*dll_rb_cNilClass)
+ # define rb_cSymbol (*dll_rb_cSymbol)
+ # define rb_cTrueClass (*dll_rb_cTrueClass)
++ # if defined(DYNAMIC_RUBY_VER) && DYNAMIC_RUBY_VER >= 18
++ /*
++ * On ver 1.8, all Ruby functions are exported with "__declspce(dllimport)"
++ * in ruby.h. But it cause trouble for these variables, because it is
++ * defined in this file. When defined this RUBY_EXPORT it modified to
++ * "extern" and be able to avoid this problem.
++ */
++ # define RUBY_EXPORT
++ # endif
+ #endif
+
+ #include <ruby.h>
+***************
+*** 83,89 ****
+ #define rb_define_module_function dll_rb_define_module_function
+ #define rb_define_singleton_method dll_rb_define_singleton_method
+ #define rb_define_virtual_variable dll_rb_define_virtual_variable
+! #define rb_defout (*dll_rb_defout)
+ #define rb_eArgError (*dll_rb_eArgError)
+ #define rb_eIndexError (*dll_rb_eIndexError)
+ #define rb_eRuntimeError (*dll_rb_eRuntimeError)
+--- 94,100 ----
+ #define rb_define_module_function dll_rb_define_module_function
+ #define rb_define_singleton_method dll_rb_define_singleton_method
+ #define rb_define_virtual_variable dll_rb_define_virtual_variable
+! #define rb_stdout (*dll_rb_stdout)
+ #define rb_eArgError (*dll_rb_eArgError)
+ #define rb_eIndexError (*dll_rb_eIndexError)
+ #define rb_eRuntimeError (*dll_rb_eRuntimeError)
+***************
+*** 111,116 ****
+--- 122,130 ----
+ #define ruby_errinfo (*dll_ruby_errinfo)
+ #define ruby_init dll_ruby_init
+ #define ruby_init_loadpath dll_ruby_init_loadpath
++ #if defined(DYNAMIC_RUBY_VER) && DYNAMIC_RUBY_VER >= 18
++ # define rb_w32_snprintf dll_rb_w32_snprintf
++ #endif
+
+ /*
+ * Pointers for dynamic link
+***************
+*** 133,139 ****
+ static void (*dll_rb_define_module_function) (VALUE,const char*,VALUE(*)(),int);
+ static void (*dll_rb_define_singleton_method) (VALUE,const char*,VALUE(*)(),int);
+ static void (*dll_rb_define_virtual_variable) (const char*,VALUE(*)(),void(*)());
+! static VALUE *dll_rb_defout;
+ static VALUE *dll_rb_eArgError;
+ static VALUE *dll_rb_eIndexError;
+ static VALUE *dll_rb_eRuntimeError;
+--- 147,153 ----
+ static void (*dll_rb_define_module_function) (VALUE,const char*,VALUE(*)(),int);
+ static void (*dll_rb_define_singleton_method) (VALUE,const char*,VALUE(*)(),int);
+ static void (*dll_rb_define_virtual_variable) (const char*,VALUE(*)(),void(*)());
+! static VALUE *dll_rb_stdout;
+ static VALUE *dll_rb_eArgError;
+ static VALUE *dll_rb_eIndexError;
+ static VALUE *dll_rb_eRuntimeError;
+***************
+*** 162,167 ****
+--- 176,182 ----
+ static VALUE *dll_ruby_errinfo;
+ static void (*dll_ruby_init) (void);
+ static void (*dll_ruby_init_loadpath) (void);
++ static int (*dll_rb_w32_snprintf)(char*, size_t, const char*, ...);
+
+ static HINSTANCE hinstRuby = 0; /* Instance of ruby.dll */
+
+***************
+*** 193,199 ****
+ {"rb_define_module_function", (RUBY_PROC*)&dll_rb_define_module_function},
+ {"rb_define_singleton_method", (RUBY_PROC*)&dll_rb_define_singleton_method},
+ {"rb_define_virtual_variable", (RUBY_PROC*)&dll_rb_define_virtual_variable},
+! {"rb_defout", (RUBY_PROC*)&dll_rb_defout},
+ {"rb_eArgError", (RUBY_PROC*)&dll_rb_eArgError},
+ {"rb_eIndexError", (RUBY_PROC*)&dll_rb_eIndexError},
+ {"rb_eRuntimeError", (RUBY_PROC*)&dll_rb_eRuntimeError},
+--- 208,214 ----
+ {"rb_define_module_function", (RUBY_PROC*)&dll_rb_define_module_function},
+ {"rb_define_singleton_method", (RUBY_PROC*)&dll_rb_define_singleton_method},
+ {"rb_define_virtual_variable", (RUBY_PROC*)&dll_rb_define_virtual_variable},
+! {"rb_stdout", (RUBY_PROC*)&dll_rb_stdout},
+ {"rb_eArgError", (RUBY_PROC*)&dll_rb_eArgError},
+ {"rb_eIndexError", (RUBY_PROC*)&dll_rb_eIndexError},
+ {"rb_eRuntimeError", (RUBY_PROC*)&dll_rb_eRuntimeError},
+***************
+*** 221,226 ****
+--- 236,242 ----
+ {"ruby_errinfo", (RUBY_PROC*)&dll_ruby_errinfo},
+ {"ruby_init", (RUBY_PROC*)&dll_ruby_init},
+ {"ruby_init_loadpath", (RUBY_PROC*)&dll_ruby_init_loadpath},
++ {"rb_w32_snprintf", (RUBY_PROC*)&dll_rb_w32_snprintf},
+ {"", NULL},
+ };
+
+***************
+*** 782,792 ****
+ static void ruby_io_init(void)
+ {
+ #ifndef DYNAMIC_RUBY
+! RUBYEXTERN VALUE rb_defout;
+ #endif
+
+! rb_defout = rb_obj_alloc(rb_cObject);
+! rb_define_singleton_method(rb_defout, "write", vim_message, 1);
+ rb_define_global_function("p", f_p, -1);
+ }
+
+--- 798,808 ----
+ static void ruby_io_init(void)
+ {
+ #ifndef DYNAMIC_RUBY
+! RUBYEXTERN VALUE rb_stdout;
+ #endif
+
+! rb_stdout = rb_obj_alloc(rb_cObject);
+! rb_define_singleton_method(rb_stdout, "write", vim_message, 1);
+ rb_define_global_function("p", f_p, -1);
+ }
+
+*** ../vim-6.2.065/src/Make_mvc.mak Sun Jul 27 15:09:30 2003
+--- src/Make_mvc.mak Fri Aug 8 20:43:46 2003
+***************
+*** 506,515 ****
+--- 506,527 ----
+ !ifndef RUBY_VER_LONG
+ RUBY_VER_LONG = 1.6
+ !endif
++
++ !if $(RUBY_VER) >= 18
++ !ifndef RUBY_PLATFORM
++ RUBY_PLATFORM = i386-mswin32
++ !endif
++ !ifndef RUBY_INSTALL_NAME
++ RUBY_INSTALL_NAME = msvcrt-ruby$(RUBY_VER)
++ !endif
++ !else
+ !ifndef RUBY_PLATFORM
+ RUBY_PLATFORM = i586-mswin32
+ !endif
++ !ifndef RUBY_INSTALL_NAME
+ RUBY_INSTALL_NAME = mswin32-ruby$(RUBY_VER)
++ !endif
++ !endif # $(RUBY_VER) >= 18
+
+ !message Ruby requested (version $(RUBY_VER)) - root dir is "$(RUBY)"
+ CFLAGS = $(CFLAGS) -DFEAT_RUBY
+***************
+*** 519,525 ****
+ # Do we want to load Ruby dynamically?
+ !if "$(DYNAMIC_RUBY)" == "yes"
+ !message Ruby DLL will be loaded dynamically
+! CFLAGS = $(CFLAGS) -DDYNAMIC_RUBY -DDYNAMIC_RUBY_DLL=\"$(RUBY_INSTALL_NAME).dll\"
+ !undef RUBY_LIB
+ !endif
+ !endif # RUBY
+--- 531,537 ----
+ # Do we want to load Ruby dynamically?
+ !if "$(DYNAMIC_RUBY)" == "yes"
+ !message Ruby DLL will be loaded dynamically
+! CFLAGS = $(CFLAGS) -DDYNAMIC_RUBY -DDYNAMIC_RUBY_DLL=\"$(RUBY_INSTALL_NAME).dll\" -DDYNAMIC_RUBY_VER=$(RUBY_VER)
+ !undef RUBY_LIB
+ !endif
+ !endif # RUBY
+*** ../vim-6.2.065/src/version.c Sun Aug 10 22:34:58 2003
+--- src/version.c Sun Aug 10 22:36:36 2003
+***************
+*** 632,633 ****
+--- 632,635 ----
+ { /* Add new patch number below this line */
++ /**/
++ 66,
+ /**/
+
+--
+From "know your smileys":
+ <<<:-{ Worf (Never smiles anyways, so he's a bad smiley)
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// Creator of Vim - Vi IMproved -- http://www.Vim.org \\\
+\\\ Project leader for A-A-P -- http://www.A-A-P.org ///
+ \\\ Help AIDS victims, buy here: http://ICCF-Holland.org/click1.html ///
--- /dev/null
+To: vim-dev@vim.org
+Subject: Patch 6.2.067
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=ISO-8859-1
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 6.2.067
+Problem: When searching for a string that starts with a composing character
+ the command line isn't drawn properly.
+Solution: Don't count the space to draw the composing character on and
+ adjust the cursor column after drawing the string.
+Files: src/message.c
+
+
+*** ../vim-6.2.066/src/message.c Thu Jul 24 21:48:47 2003
+--- src/message.c Sun Aug 3 16:16:49 2003
+***************
+*** 1166,1175 ****
+ /* If the string starts with a composing character first draw a space on
+ * which the composing char can be drawn. */
+ if (enc_utf8 && utf_iscomposing(utf_ptr2char(msgstr)))
+- {
+ msg_puts_attr((char_u *)" ", attr);
+- retval += 1;
+- }
+ #endif
+
+ /*
+--- 1166,1172 ----
+***************
+*** 2080,2085 ****
+--- 2077,2088 ----
+ msg_didout = TRUE; /* remember that line is not empty */
+ screen_puts_len(t_s, (int)(s - t_s), msg_row, msg_col, attr);
+ msg_col += t_col;
++ #ifdef FEAT_MBYTE
++ /* If the string starts with a composing character don't increment the
++ * column position for it. */
++ if (enc_utf8 && utf_iscomposing(utf_ptr2char(t_s)))
++ --msg_col;
++ #endif
+ if (msg_col >= Columns)
+ {
+ msg_col = 0;
+*** ../vim-6.2.066/src/version.c Sun Aug 10 22:37:55 2003
+--- src/version.c Sun Aug 10 22:39:21 2003
+***************
+*** 632,633 ****
+--- 632,635 ----
+ { /* Add new patch number below this line */
++ /**/
++ 67,
+ /**/
+
+--
+From "know your smileys":
+ (X0||) Double hamburger with lettuce and tomato
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// Creator of Vim - Vi IMproved -- http://www.Vim.org \\\
+\\\ Project leader for A-A-P -- http://www.A-A-P.org ///
+ \\\ Help AIDS victims, buy here: http://ICCF-Holland.org/click1.html ///
--- /dev/null
+To: vim-dev@vim.org
+Subject: Patch 6.2.068
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=ISO-8859-1
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 6.2.068
+Problem: Events for the netbeans interface that include a file name with
+ special characters don't work properly.
+Solution: Use nb_quote() on the file name. (Sergey Khorev)
+Files: src/netbeans.c
+
+
+*** ../vim-6.2.067/src/netbeans.c Sun Jul 27 14:16:53 2003
+--- src/netbeans.c Sun Aug 10 22:08:26 2003
+***************
+*** 839,844 ****
+--- 832,838 ----
+
+ /*
+ * Send a response with text.
++ * "result" must have been quoted already (using nb_quote()).
+ */
+ static void
+ nb_reply_text(int cmdno, char_u *result)
+***************
+*** 2136,2142 ****
+
+ sprintf(buffer, "0:fileOpened=%d \"%s\" %s %s\n",
+ 0,
+! filename,
+ "F", /* open in NetBeans */
+ "F"); /* modified */
+
+--- 2160,2166 ----
+
+ sprintf(buffer, "0:fileOpened=%d \"%s\" %s %s\n",
+ 0,
+! nb_quote((char_u *)filename),
+ "F", /* open in NetBeans */
+ "F"); /* modified */
+
+***************
+*** 2354,2360 ****
+ if (bufno == -1)
+ {
+ nbdebug(("got keycommand for non-NetBeans buffer, opening...\n"));
+! sprintf(buf, "0:fileOpened=%d \"%s\" %s %s\n", 0, curbuf->b_ffname,
+ "T", /* open in NetBeans */
+ "F"); /* modified */
+ nbdebug(("EVT: %s", buf));
+--- 2378,2386 ----
+ if (bufno == -1)
+ {
+ nbdebug(("got keycommand for non-NetBeans buffer, opening...\n"));
+! sprintf(buf, "0:fileOpened=%d \"%s\" %s %s\n", 0,
+! curbuf->b_ffname == NULL ? (char_u *)""
+! : nb_quote(curbuf->b_ffname),
+ "T", /* open in NetBeans */
+ "F"); /* modified */
+ nbdebug(("EVT: %s", buf));
+*** ../vim-6.2.067/src/version.c Sun Aug 10 22:39:59 2003
+--- src/version.c Sun Aug 10 22:42:14 2003
+***************
+*** 632,633 ****
+--- 632,635 ----
+ { /* Add new patch number below this line */
++ /**/
++ 68,
+ /**/
+
+--
+From "know your smileys":
+ :-X My lips are sealed
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// Creator of Vim - Vi IMproved -- http://www.Vim.org \\\
+\\\ Project leader for A-A-P -- http://www.A-A-P.org ///
+ \\\ Help AIDS victims, buy here: http://ICCF-Holland.org/click1.html ///
--- /dev/null
+To: vim-dev@vim.org
+Subject: Patch 6.2.069
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=ISO-8859-1
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 6.2.069 (after 6.2.064)
+Problem: Unused variables "limit" and "new_st" and unused label "fail" in
+ some situation. (Bill McCarthy)
+Solution: Put the declarations inside an #ifdef. (Servatius Brandt)
+Files: src/eval.c, src/tag.c
+
+
+*** ../vim-6.2.068/src/eval.c Sun Aug 10 22:31:29 2003
+--- src/eval.c Mon Aug 11 09:54:12 2003
+***************
+*** 5810,5816 ****
+ VAR retvar;
+ {
+ char_u *p;
+- int limit = 100;
+
+ p = get_var_string(&argvars[0]);
+ #ifdef FEAT_SHORTCUT
+--- 5810,5815 ----
+***************
+*** 5833,5838 ****
+--- 5832,5838 ----
+ char_u *q;
+ int is_relative_to_current = FALSE;
+ int has_trailing_pathsep = FALSE;
++ int limit = 100;
+
+ p = vim_strsave(p);
+
+***************
+*** 5853,5859 ****
+ q[-1] = NUL;
+ }
+
+! for(;;)
+ {
+ for (;;)
+ {
+--- 5853,5859 ----
+ q[-1] = NUL;
+ }
+
+! for (;;)
+ {
+ for (;;)
+ {
+***************
+*** 5998,6004 ****
+--- 5998,6006 ----
+
+ simplify_filename(retvar->var_val.var_string);
+
++ #ifdef HAVE_READLINK
+ fail:
++ #endif
+ retvar->var_type = VAR_STRING;
+ }
+
+*** ../vim-6.2.068/src/tag.c Sun Aug 10 22:31:29 2003
+--- src/tag.c Mon Aug 11 21:18:10 2003
+***************
+*** 2936,2942 ****
+ {
+ int do_strip = FALSE;
+ char_u saved_char;
+! struct stat st, new_st;
+
+ /* Don't strip for an erroneous file name. */
+ if (!stripping_disabled)
+--- 2936,2942 ----
+ {
+ int do_strip = FALSE;
+ char_u saved_char;
+! struct stat st;
+
+ /* Don't strip for an erroneous file name. */
+ if (!stripping_disabled)
+***************
+*** 2961,2966 ****
+--- 2961,2968 ----
+
+ if (!do_strip)
+ {
++ struct stat new_st;
++
+ /* If the component exists in the file system, check
+ * that stripping it won't change the meaning of the
+ * file name. First get information about the
+*** ../vim-6.2.068/src/version.c Sun Aug 10 22:43:27 2003
+--- src/version.c Mon Aug 11 23:03:28 2003
+***************
+*** 632,633 ****
+--- 632,635 ----
+ { /* Add new patch number below this line */
++ /**/
++ 69,
+ /**/
+
+--
+I AM THANKFUL...
+...for the clothes that fit a little too snug because it
+means I have more than enough to eat.
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// Creator of Vim - Vi IMproved -- http://www.Vim.org \\\
+\\\ Project leader for A-A-P -- http://www.A-A-P.org ///
+ \\\ Help AIDS victims, buy here: http://ICCF-Holland.org/click1.html ///
--- /dev/null
+To: vim-dev@vim.org
+Subject: Patch 6.2.070
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=ISO-8859-1
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 6.2.070 (after 6.2.069)
+Problem: Still unused variable "new_st". (Bill McCarthy)
+Solution: Move the declaration to the right block this time.
+Files: src/tag.c
+
+
+*** ../vim-6.2.069/src/tag.c Mon Aug 11 23:03:53 2003
+--- src/tag.c Tue Aug 12 10:08:43 2003
+***************
+*** 2961,2968 ****
+
+ if (!do_strip)
+ {
+- struct stat new_st;
+-
+ /* If the component exists in the file system, check
+ * that stripping it won't change the meaning of the
+ * file name. First get information about the
+--- 2961,2966 ----
+***************
+*** 2983,2988 ****
+--- 2981,2988 ----
+ #ifdef UNIX
+ if (do_strip)
+ {
++ struct stat new_st;
++
+ /* On Unix, the check for the unstripped file name
+ * above works also for a symbolic link pointing to
+ * a searchable directory. But then the parent of
+*** ../vim-6.2.069/src/version.c Mon Aug 11 23:03:53 2003
+--- src/version.c Tue Aug 12 19:57:51 2003
+***************
+*** 632,633 ****
+--- 632,635 ----
+ { /* Add new patch number below this line */
++ /**/
++ 70,
+ /**/
+
+--
+hundred-and-one symptoms of being an internet addict:
+97. Your mother tells you to remember something, and you look for
+ a File/Save command.
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// Creator of Vim - Vi IMproved -- http://www.Vim.org \\\
+\\\ Project leader for A-A-P -- http://www.A-A-P.org ///
+ \\\ Help AIDS victims, buy here: http://ICCF-Holland.org/click1.html ///
--- /dev/null
+To: vim-dev@vim.org
+Subject: Patch 6.2.071
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=ISO-8859-1
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 6.2.071
+Problem: 'statusline' can only contain 50 % items. (Antony Scriven)
+Solution: Allow 80 items and mention it in the docs.
+Files: runtime/doc/options.txt, src/vim.h
+
+
+*** ../vim-6.2.070/runtime/doc/options.txt Sun Jun 1 12:20:34 2003
+--- runtime/doc/options.txt Tue Aug 12 11:03:40 2003
+***************
+*** 1,4 ****
+! *options.txt* For Vim version 6.2. Last change: 2003 May 29
+
+
+ VIM REFERENCE MANUAL by Bram Moolenaar
+--- 1,4 ----
+! *options.txt* For Vim version 6.2. Last change: 2003 Aug 12
+
+
+ VIM REFERENCE MANUAL by Bram Moolenaar
+***************
+*** 5379,5385 ****
+ normal text. Each status line item is of the form:
+ %-0{minwid}.{maxwid}{item}
+ All fields except the {item} is optional. A single percent sign can
+! be given as "%%".
+
+ Note that the only effect of 'ruler' when this option is set (and
+ 'laststatus' is 2) is controlling the output of |CTRL-G|.
+--- 5383,5389 ----
+ normal text. Each status line item is of the form:
+ %-0{minwid}.{maxwid}{item}
+ All fields except the {item} is optional. A single percent sign can
+! be given as "%%". Up to 80 items can be specified.
+
+ Note that the only effect of 'ruler' when this option is set (and
+ 'laststatus' is 2) is controlling the output of |CTRL-G|.
+*** ../vim-6.2.070/src/vim.h Mon Jul 28 14:38:38 2003
+--- src/vim.h Tue Aug 12 11:06:05 2003
+***************
+*** 1258,1264 ****
+ #endif
+
+ #define SHOWCMD_COLS 10 /* columns needed by shown command */
+! #define STL_MAX_ITEM 50 /* max count of %<flag> in statusline*/
+
+ typedef void *vim_acl_T; /* dummy to pass an ACL to a function */
+
+--- 1258,1264 ----
+ #endif
+
+ #define SHOWCMD_COLS 10 /* columns needed by shown command */
+! #define STL_MAX_ITEM 80 /* max nr of %<flag> in statusline */
+
+ typedef void *vim_acl_T; /* dummy to pass an ACL to a function */
+
+*** ../vim-6.2.070/src/version.c Tue Aug 12 19:58:43 2003
+--- src/version.c Tue Aug 12 20:00:00 2003
+***************
+*** 632,633 ****
+--- 632,635 ----
+ { /* Add new patch number below this line */
++ /**/
++ 71,
+ /**/
+
+--
+hundred-and-one symptoms of being an internet addict:
+98. The Alta Vista administrators ask you what sites are missing
+ in their index files.
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// Creator of Vim - Vi IMproved -- http://www.Vim.org \\\
+\\\ Project leader for A-A-P -- http://www.A-A-P.org ///
+ \\\ Help AIDS victims, buy here: http://ICCF-Holland.org/click1.html ///