r1971 - trunk/vim

randy at linuxfromscratch.org randy at linuxfromscratch.org
Thu Sep 25 12:03:36 PDT 2008


Author: randy
Date: 2008-09-25 13:03:36 -0600 (Thu, 25 Sep 2008)
New Revision: 1971

Added:
   trunk/vim/vim-7.2-fixes-2.patch
Log:
Added a patch for Vim which contains upstream patches 1-22

Added: trunk/vim/vim-7.2-fixes-2.patch
===================================================================
--- trunk/vim/vim-7.2-fixes-2.patch	                        (rev 0)
+++ trunk/vim/vim-7.2-fixes-2.patch	2008-09-25 19:03:36 UTC (rev 1971)
@@ -0,0 +1,884 @@
+Submitted By:            Randy McMurchy <randy_at_linuxfromscratch_dot_org>
+Date:                    2008-09-25
+Initial Package Version: 7.2
+Upstream Status:         Already in upstream patch repo
+Origin:                  Upstream
+Description:             This patch is upstream patch numbers 1 thru 22
+                         (excludes patch #'s 7 and 22 as they are for the
+                         "extra" tarball which we don't use)
+
+
+diff -Naur vim72-orig/runtime/scripts.vim vim72/runtime/scripts.vim
+--- vim72-orig/runtime/scripts.vim	2008-08-08 22:27:21.000000000 +0000
++++ vim72/runtime/scripts.vim	2008-09-25 18:11:56.000000000 +0000
+@@ -234,6 +234,10 @@
+   elseif s:line1 =~ '\<DTD\s\+XHTML\s'
+     set ft=xhtml
+ 
++    " HTML (e.g.: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN")
++  elseif s:line1 =~? '\<DOCTYPE\s\+html\>'
++    set ft=html
++
+     " PDF
+   elseif s:line1 =~ '^%PDF-'
+     set ft=pdf
+diff -Naur vim72-orig/src/buffer.c vim72/src/buffer.c
+--- vim72-orig/src/buffer.c	2008-08-06 11:00:48.000000000 +0000
++++ vim72/src/buffer.c	2008-09-25 18:12:31.000000000 +0000
+@@ -1351,11 +1351,12 @@
+ 	}
+     }
+ #ifdef FEAT_AUTOCMD
++    /* An autocommand may have deleted "buf", already entered it (e.g., when
++     * it did ":bunload") or aborted the script processing! */
+ # ifdef FEAT_EVAL
+-    /* An autocommand may have deleted buf or aborted the script processing! */
+-    if (buf_valid(buf) && !aborting())
++    if (buf_valid(buf) && buf != curbuf && !aborting())
+ # else
+-    if (buf_valid(buf))	    /* an autocommand may have deleted buf! */
++    if (buf_valid(buf) && buf != curbuf)
+ # endif
+ #endif
+ 	enter_buffer(buf);
+diff -Naur vim72-orig/src/eval.c vim72/src/eval.c
+--- vim72-orig/src/eval.c	2008-08-07 19:37:22.000000000 +0000
++++ vim72/src/eval.c	2008-09-25 18:13:01.000000000 +0000
+@@ -1256,23 +1256,26 @@
+ 
+ /*
+  * Top level evaluation function, returning a string.
++ * When "convert" is TRUE convert a List into a sequence of lines and convert
++ * a Float to a String.
+  * Return pointer to allocated memory, or NULL for failure.
+  */
+     char_u *
+-eval_to_string(arg, nextcmd, dolist)
++eval_to_string(arg, nextcmd, convert)
+     char_u	*arg;
+     char_u	**nextcmd;
+-    int		dolist;		/* turn List into sequence of lines */
++    int		convert;
+ {
+     typval_T	tv;
+     char_u	*retval;
+     garray_T	ga;
++    char_u	numbuf[NUMBUFLEN];
+ 
+     if (eval0(arg, &tv, nextcmd, TRUE) == FAIL)
+ 	retval = NULL;
+     else
+     {
+-	if (dolist && tv.v_type == VAR_LIST)
++	if (convert && tv.v_type == VAR_LIST)
+ 	{
+ 	    ga_init2(&ga, (int)sizeof(char), 80);
+ 	    if (tv.vval.v_list != NULL)
+@@ -1280,6 +1283,13 @@
+ 	    ga_append(&ga, NUL);
+ 	    retval = (char_u *)ga.ga_data;
+ 	}
++#ifdef FEAT_FLOAT
++	else if (convert && tv.v_type == VAR_FLOAT)
++	{
++	    vim_snprintf((char *)numbuf, NUMBUFLEN, "%g", tv.vval.v_float);
++	    retval = vim_strsave(numbuf);
++	}
++#endif
+ 	else
+ 	    retval = vim_strsave(get_tv_string(&tv));
+ 	clear_tv(&tv);
+@@ -3657,8 +3667,8 @@
+ }
+ 
+ /*
+- * Return TRUE if typeval "tv" is locked: Either tha value is locked itself or
+- * it refers to a List or Dictionary that is locked.
++ * Return TRUE if typeval "tv" is locked: Either that value is locked itself
++ * or it refers to a List or Dictionary that is locked.
+  */
+     static int
+ tv_islocked(tv)
+@@ -15838,10 +15848,9 @@
+     if (res == FAIL)
+ 	res = ITEM_COMPARE_FAIL;
+     else
+-	/* return value has wrong type */
+ 	res = get_tv_number_chk(&rettv, &item_compare_func_err);
+     if (item_compare_func_err)
+-	res = ITEM_COMPARE_FAIL;
++	res = ITEM_COMPARE_FAIL;  /* return value has wrong type */
+     clear_tv(&rettv);
+     return res;
+ }
+@@ -16658,7 +16667,7 @@
+     col = get_tv_number(&argvars[1]) - 1;	/* -1 on type error */
+ 
+     if (lnum >= 1 && lnum <= curbuf->b_ml.ml_line_count
+-	    && col >= 0 && col < (long)STRLEN(ml_get(lnum))
++	    && col >= 0 && (col == 0 || col < (long)STRLEN(ml_get(lnum)))
+ 	    && rettv_list_alloc(rettv) != FAIL)
+     {
+ 	(void)syn_get_id(curwin, lnum, (colnr_T)col, FALSE, NULL, TRUE);
+@@ -20590,6 +20599,9 @@
+     int		st_len = 0;
+ 
+     todo = (int)func_hashtab.ht_used;
++    if (todo == 0)
++	return;     /* nothing to dump */
++
+     sorttab = (ufunc_T **)alloc((unsigned)(sizeof(ufunc_T) * todo));
+ 
+     for (hi = func_hashtab.ht_array; todo > 0; ++hi)
+@@ -20638,6 +20650,8 @@
+ 							      prof_self_cmp);
+ 	prof_sort_list(fd, sorttab, st_len, "SELF", TRUE);
+     }
++
++    vim_free(sorttab);
+ }
+ 
+     static void
+@@ -21204,7 +21218,7 @@
+ 	if (!fp->uf_profiling && has_profiling(FALSE, fp->uf_name, NULL))
+ 	    func_do_profile(fp);
+ 	if (fp->uf_profiling
+-		       || (fc.caller != NULL && &fc.caller->func->uf_profiling))
++		       || (fc.caller != NULL && fc.caller->func->uf_profiling))
+ 	{
+ 	    ++fp->uf_tm_count;
+ 	    profile_start(&call_start);
+@@ -21235,13 +21249,13 @@
+ 
+ #ifdef FEAT_PROFILE
+     if (do_profiling == PROF_YES && (fp->uf_profiling
+-		    || (fc.caller != NULL && &fc.caller->func->uf_profiling)))
++		    || (fc.caller != NULL && fc.caller->func->uf_profiling)))
+     {
+ 	profile_end(&call_start);
+ 	profile_sub_wait(&wait_start, &call_start);
+ 	profile_add(&fp->uf_tm_total, &call_start);
+ 	profile_self(&fp->uf_tm_self, &call_start, &fp->uf_tm_children);
+-	if (fc.caller != NULL && &fc.caller->func->uf_profiling)
++	if (fc.caller != NULL && fc.caller->func->uf_profiling)
+ 	{
+ 	    profile_add(&fc.caller->func->uf_tm_children, &call_start);
+ 	    profile_add(&fc.caller->func->uf_tml_children, &call_start);
+diff -Naur vim72-orig/src/ex_cmds.c vim72/src/ex_cmds.c
+--- vim72-orig/src/ex_cmds.c	2008-08-04 19:15:00.000000000 +0000
++++ vim72/src/ex_cmds.c	2008-09-25 18:13:19.000000000 +0000
+@@ -5059,6 +5059,7 @@
+ 
+ 	    if (did_sub)
+ 		++sub_nlines;
++	    vim_free(new_start);	/* for when substitute was cancelled */
+ 	    vim_free(sub_firstline);	/* free the copy of the original line */
+ 	    sub_firstline = NULL;
+ 	}
+diff -Naur vim72-orig/src/ex_cmds.h vim72/src/ex_cmds.h
+--- vim72-orig/src/ex_cmds.h	2008-06-21 18:47:57.000000000 +0000
++++ vim72/src/ex_cmds.h	2008-09-25 18:13:21.000000000 +0000
+@@ -635,6 +635,8 @@
+ 			RANGE|NOTADR|ZEROR|EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN),
+ EX(CMD_noremap,		"noremap",	ex_map,
+ 			BANG|EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN),
++EX(CMD_noautocmd,	"noautocmd",	ex_wrongmodifier,
++			NEEDARG|EXTRA|NOTRLCOM),
+ EX(CMD_nohlsearch,	"nohlsearch",	ex_nohlsearch,
+ 			TRLBAR|SBOXOK|CMDWIN),
+ EX(CMD_noreabbrev,	"noreabbrev",	ex_abbreviate,
+diff -Naur vim72-orig/src/ex_cmds2.c vim72/src/ex_cmds2.c
+--- vim72-orig/src/ex_cmds2.c	2008-07-13 16:18:22.000000000 +0000
++++ vim72/src/ex_cmds2.c	2008-09-25 18:12:57.000000000 +0000
+@@ -3145,8 +3145,8 @@
+ 	verbose_leave();
+     }
+ #ifdef STARTUPTIME
+-    vim_snprintf(IObuff, IOSIZE, "sourcing %s", fname);
+-    time_msg(IObuff, &tv_start);
++    vim_snprintf((char *)IObuff, IOSIZE, "sourcing %s", fname);
++    time_msg((char *)IObuff, &tv_start);
+     time_pop(&tv_rel);
+ #endif
+ 
+diff -Naur vim72-orig/src/ex_docmd.c vim72/src/ex_docmd.c
+--- vim72-orig/src/ex_docmd.c	2008-07-26 11:51:05.000000000 +0000
++++ vim72/src/ex_docmd.c	2008-09-25 18:13:31.000000000 +0000
+@@ -2978,6 +2978,7 @@
+     {"keepmarks", 3, FALSE},
+     {"leftabove", 5, FALSE},
+     {"lockmarks", 3, FALSE},
++    {"noautocmd", 3, FALSE},
+     {"rightbelow", 6, FALSE},
+     {"sandbox", 3, FALSE},
+     {"silent", 3, FALSE},
+@@ -9541,6 +9542,15 @@
+ #ifdef FEAT_AUTOCMD
+ 	case SPEC_AFILE:	/* file name for autocommand */
+ 		result = autocmd_fname;
++		if (result != NULL && !autocmd_fname_full)
++		{
++		    /* Still need to turn the fname into a full path.  It is
++		     * postponed to avoid a delay when <afile> is not used. */
++		    autocmd_fname_full = TRUE;
++		    result = FullName_save(autocmd_fname, FALSE);
++		    vim_free(autocmd_fname);
++		    autocmd_fname = result;
++		}
+ 		if (result == NULL)
+ 		{
+ 		    *errormsg = (char_u *)_("E495: no autocommand file name to substitute for \"<afile>\"");
+diff -Naur vim72-orig/src/ex_getln.c vim72/src/ex_getln.c
+--- vim72-orig/src/ex_getln.c	2008-08-08 09:31:33.000000000 +0000
++++ vim72/src/ex_getln.c	2008-09-25 18:13:05.000000000 +0000
+@@ -31,6 +31,8 @@
+     int		cmdattr;	/* attributes for prompt */
+     int		overstrike;	/* Typing mode on the command line.  Shared by
+ 				   getcmdline() and put_on_cmdline(). */
++    expand_T	*xpc;		/* struct being used for expansion, xp_pattern
++				   may point into cmdbuff */
+     int		xp_context;	/* type of expansion */
+ # ifdef FEAT_EVAL
+     char_u	*xp_arg;	/* user-defined expansion arg */
+@@ -38,7 +40,11 @@
+ # endif
+ };
+ 
+-static struct cmdline_info ccline;	/* current cmdline_info */
++/* The current cmdline_info.  It is initialized in getcmdline() and after that
++ * used by other functions.  When invoking getcmdline() recursively it needs
++ * to be saved with save_cmdline() and restored with restore_cmdline().
++ * TODO: make it local to getcmdline() and pass it around. */
++static struct cmdline_info ccline;
+ 
+ static int	cmd_showtail;		/* Only show path tail in lists ? */
+ 
+@@ -238,6 +244,7 @@
+     }
+ 
+     ExpandInit(&xpc);
++    ccline.xpc = &xpc;
+ 
+ #ifdef FEAT_RIGHTLEFT
+     if (curwin->w_p_rl && *curwin->w_p_rlc == 's'
+@@ -408,9 +415,10 @@
+ #endif
+ 
+ 	/*
+-	 * <S-Tab> works like CTRL-P (unless 'wc' is <S-Tab>).
++	 * When there are matching completions to select <S-Tab> works like
++	 * CTRL-P (unless 'wc' is <S-Tab>).
+ 	 */
+-	if (c != p_wc && c == K_S_TAB && xpc.xp_numfiles != -1)
++	if (c != p_wc && c == K_S_TAB && xpc.xp_numfiles > 0)
+ 	    c = Ctrl_P;
+ 
+ #ifdef FEAT_WILDMENU
+@@ -1513,6 +1521,7 @@
+ 		    int		old_firstc;
+ 
+ 		    vim_free(ccline.cmdbuff);
++		    xpc.xp_context = EXPAND_NOTHING;
+ 		    if (hiscnt == hislen)
+ 			p = lookfor;	/* back to the old one */
+ 		    else
+@@ -1839,6 +1848,7 @@
+ #endif
+ 
+     ExpandCleanup(&xpc);
++    ccline.xpc = NULL;
+ 
+ #ifdef FEAT_SEARCH_EXTRA
+     if (did_incsearch)
+@@ -2508,6 +2518,20 @@
+     }
+     mch_memmove(ccline.cmdbuff, p, (size_t)ccline.cmdlen + 1);
+     vim_free(p);
++
++    if (ccline.xpc != NULL
++	    && ccline.xpc->xp_pattern != NULL
++	    && ccline.xpc->xp_context != EXPAND_NOTHING
++	    && ccline.xpc->xp_context != EXPAND_UNSUCCESSFUL)
++    {
++	int i = ccline.xpc->xp_pattern - p;
++
++	/* If xp_pattern points inside the old cmdbuff it needs to be adjusted
++	 * to point into the newly allocated memory. */
++	if (i >= 0 && i <= ccline.cmdlen)
++	    ccline.xpc->xp_pattern = ccline.cmdbuff + i;
++    }
++
+     return OK;
+ }
+ 
+@@ -2875,6 +2899,7 @@
+     prev_ccline = ccline;
+     ccline.cmdbuff = NULL;
+     ccline.cmdprompt = NULL;
++    ccline.xpc = NULL;
+ }
+ 
+ /*
+@@ -3582,6 +3607,7 @@
+ ExpandInit(xp)
+     expand_T	*xp;
+ {
++    xp->xp_pattern = NULL;
+     xp->xp_backslash = XP_BS_NONE;
+ #ifndef BACKSLASH_IN_FILENAME
+     xp->xp_shell = FALSE;
+diff -Naur vim72-orig/src/fileio.c vim72/src/fileio.c
+--- vim72-orig/src/fileio.c	2008-08-06 11:01:03.000000000 +0000
++++ vim72/src/fileio.c	2008-09-25 18:13:31.000000000 +0000
+@@ -8523,6 +8523,7 @@
+     char_u	*save_sourcing_name;
+     linenr_T	save_sourcing_lnum;
+     char_u	*save_autocmd_fname;
++    int		save_autocmd_fname_full;
+     int		save_autocmd_bufnr;
+     char_u	*save_autocmd_match;
+     int		save_autocmd_busy;
+@@ -8601,6 +8602,7 @@
+      * Save the autocmd_* variables and info about the current buffer.
+      */
+     save_autocmd_fname = autocmd_fname;
++    save_autocmd_fname_full = autocmd_fname_full;
+     save_autocmd_bufnr = autocmd_bufnr;
+     save_autocmd_match = autocmd_match;
+     save_autocmd_busy = autocmd_busy;
+@@ -8618,14 +8620,15 @@
+ 	if (fname != NULL && *fname != NUL)
+ 	    autocmd_fname = fname;
+ 	else if (buf != NULL)
+-	    autocmd_fname = buf->b_fname;
++	    autocmd_fname = buf->b_ffname;
+ 	else
+ 	    autocmd_fname = NULL;
+     }
+     else
+ 	autocmd_fname = fname_io;
+     if (autocmd_fname != NULL)
+-	autocmd_fname = FullName_save(autocmd_fname, FALSE);
++	autocmd_fname = vim_strsave(autocmd_fname);
++    autocmd_fname_full = FALSE; /* call FullName_save() later */
+ 
+     /*
+      * Set the buffer number to be used for <abuf>.
+@@ -8810,6 +8813,7 @@
+     sourcing_lnum = save_sourcing_lnum;
+     vim_free(autocmd_fname);
+     autocmd_fname = save_autocmd_fname;
++    autocmd_fname_full = save_autocmd_fname_full;
+     autocmd_bufnr = save_autocmd_bufnr;
+     autocmd_match = save_autocmd_match;
+ #ifdef FEAT_EVAL
+@@ -8918,7 +8922,7 @@
+     {
+ 	apc->curpat = NULL;
+ 
+-	/* only use a pattern when it has not been removed, has commands and
++	/* Only use a pattern when it has not been removed, has commands and
+ 	 * the group matches. For buffer-local autocommands only check the
+ 	 * buffer number. */
+ 	if (ap->pat != NULL && ap->cmds != NULL
+diff -Naur vim72-orig/src/globals.h vim72/src/globals.h
+--- vim72-orig/src/globals.h	2008-07-26 11:53:29.000000000 +0000
++++ vim72/src/globals.h	2008-09-25 18:13:31.000000000 +0000
+@@ -1022,6 +1022,7 @@
+ #endif
+ #ifdef FEAT_AUTOCMD
+ EXTERN char_u	*autocmd_fname INIT(= NULL); /* fname for <afile> on cmdline */
++EXTERN int	autocmd_fname_full;	     /* autocmd_fname is full path */
+ EXTERN int	autocmd_bufnr INIT(= 0);     /* fnum for <abuf> on cmdline */
+ EXTERN char_u	*autocmd_match INIT(= NULL); /* name for <amatch> on cmdline */
+ EXTERN int	did_cursorhold INIT(= FALSE); /* set when CursorHold t'gerd */
+diff -Naur vim72-orig/src/if_cscope.c vim72/src/if_cscope.c
+--- vim72-orig/src/if_cscope.c	2008-06-24 16:32:34.000000000 +0000
++++ vim72/src/if_cscope.c	2008-09-25 18:11:56.000000000 +0000
+@@ -74,7 +74,7 @@
+     { "add",	cs_add,
+ 		N_("Add a new database"),     "add file|dir [pre-path] [flags]", 0 },
+     { "find",	cs_find,
+-		N_("Query for a pattern"),    FIND_USAGE, 1 },
++		N_("Query for a pattern"),    "find c|d|e|f|g|i|s|t name", 1 },
+     { "help",	cs_help,
+ 		N_("Show this message"),      "help", 0 },
+     { "kill",	cs_kill,
+@@ -1180,7 +1180,16 @@
+ 	(void)smsg((char_u *)_("%-5s: %-30s (Usage: %s)"),
+ 				      cmdp->name, _(cmdp->help), cmdp->usage);
+ 	if (strcmp(cmdp->name, "find") == 0)
+-	    MSG_PUTS(FIND_HELP);
++	    MSG_PUTS(_("\n"
++		       "       c: Find functions calling this function\n"
++		       "       d: Find functions called by this function\n"
++		       "       e: Find this egrep pattern\n"
++		       "       f: Find this file\n"
++		       "       g: Find this definition\n"
++		       "       i: Find files #including this file\n"
++		       "       s: Find this C symbol\n"
++		       "       t: Find assignments to\n"));
++
+ 	cmdp++;
+     }
+ 
+diff -Naur vim72-orig/src/if_cscope.h vim72/src/if_cscope.h
+--- vim72-orig/src/if_cscope.h	2007-09-02 14:51:08.000000000 +0000
++++ vim72/src/if_cscope.h	2008-09-25 18:11:56.000000000 +0000
+@@ -42,17 +42,6 @@
+  * f 7name	Find this file
+  * i 8name	Find files #including this file
+  */
+-#define	FIND_USAGE "find c|d|e|f|g|i|s|t name"
+-#define FIND_HELP "\n\
+-       c: Find functions calling this function\n\
+-       d: Find functions called by this function\n\
+-       e: Find this egrep pattern\n\
+-       f: Find this file\n\
+-       g: Find this definition\n\
+-       i: Find files #including this file\n\
+-       s: Find this C symbol\n\
+-       t: Find assignments to\n"
+-
+ 
+ typedef struct {
+     char *  name;
+diff -Naur vim72-orig/src/if_perl.xs vim72/src/if_perl.xs
+--- vim72-orig/src/if_perl.xs	2008-07-17 20:55:09.000000000 +0000
++++ vim72/src/if_perl.xs	2008-09-25 18:12:40.000000000 +0000
+@@ -136,6 +136,9 @@
+ #  define Perl_newXS_flags dll_Perl_newXS_flags
+ #endif
+ # define Perl_sv_free dll_Perl_sv_free
++# if (PERL_REVISION == 5) && (PERL_VERSION >= 10)
++#  define Perl_sv_free2 dll_Perl_sv_free2
++# endif
+ # define Perl_sv_isa dll_Perl_sv_isa
+ # define Perl_sv_magic dll_Perl_sv_magic
+ # define Perl_sv_setiv dll_Perl_sv_setiv
+@@ -268,6 +271,7 @@
+ static void (*boot_DynaLoader)_((pTHX_ CV*));
+ 
+ #if (PERL_REVISION == 5) && (PERL_VERSION >= 10)
++static void (*Perl_sv_free2)(pTHX_ SV*);
+ static void (*Perl_sys_init3)(int* argc, char*** argv, char*** env);
+ static void (*Perl_sys_term)(void);
+ static SV** (*Perl_ISv_ptr)(register PerlInterpreter*);
+@@ -367,6 +371,7 @@
+     {"Perl_TXpv_ptr", (PERL_PROC*)&Perl_TXpv_ptr},
+     {"Perl_Tna_ptr", (PERL_PROC*)&Perl_Tna_ptr},
+ #else
++    {"Perl_sv_free2", (PERL_PROC*)&Perl_sv_free2},
+     {"Perl_sys_init3", (PERL_PROC*)&Perl_sys_init3},
+     {"Perl_sys_term", (PERL_PROC*)&Perl_sys_term},
+     {"Perl_ISv_ptr", (PERL_PROC*)&Perl_ISv_ptr},
+diff -Naur vim72-orig/src/main.c vim72/src/main.c
+--- vim72-orig/src/main.c	2008-07-24 08:40:56.000000000 +0000
++++ vim72/src/main.c	2008-09-25 18:13:27.000000000 +0000
+@@ -1457,7 +1457,8 @@
+ 	++initstr;
+     }
+ 
+-    if (TOLOWER_ASC(initstr[0]) == 'g' || initstr[0] == 'k')
++    /* "gvim" starts the GUI.  Also accept "Gvim" for MS-Windows. */
++    if (TOLOWER_ASC(initstr[0]) == 'g')
+     {
+ 	main_start_gui();
+ #ifdef FEAT_GUI
+diff -Naur vim72-orig/src/mbyte.c vim72/src/mbyte.c
+--- vim72-orig/src/mbyte.c	2008-07-14 12:38:05.000000000 +0000
++++ vim72/src/mbyte.c	2008-09-25 18:12:51.000000000 +0000
+@@ -2540,7 +2540,6 @@
+     return (int)(p - q);
+ }
+ 
+-#if defined(FEAT_EVAL) || defined(PROTO)
+ /*
+  * Copy a character from "*fp" to "*tp" and advance the pointers.
+  */
+@@ -2555,7 +2554,6 @@
+     *tp += l;
+     *fp += l;
+ }
+-#endif
+ 
+ /*
+  * Return the offset from "p" to the first byte of a character.  When "p" is
+diff -Naur vim72-orig/src/menu.c vim72/src/menu.c
+--- vim72-orig/src/menu.c	2008-06-21 19:53:43.000000000 +0000
++++ vim72/src/menu.c	2008-09-25 18:11:56.000000000 +0000
+@@ -1120,6 +1120,7 @@
+ 	parent = menu;
+ 	menu = menu->children;
+     }
++    vim_free(path_name);
+ 
+     /* Now we have found the matching menu, and we list the mappings */
+ 						    /* Highlight title */
+diff -Naur vim72-orig/src/misc2.c vim72/src/misc2.c
+--- vim72-orig/src/misc2.c	2008-07-23 19:12:56.000000000 +0000
++++ vim72/src/misc2.c	2008-09-25 18:12:51.000000000 +0000
+@@ -1257,7 +1257,6 @@
+     return escaped_string;
+ }
+ 
+-#if !defined(BACKSLASH_IN_FILENAME) || defined(FEAT_EVAL) || defined(PROTO)
+ /*
+  * Return TRUE when 'shell' has "csh" in the tail.
+  */
+@@ -1266,9 +1265,7 @@
+ {
+     return (strstr((char *)gettail(p_sh), "csh") != NULL);
+ }
+-#endif
+ 
+-#if defined(FEAT_EVAL) || defined(PROTO)
+ /*
+  * Escape "string" for use as a shell argument with system().
+  * This uses single quotes, except when we know we need to use double qoutes
+@@ -1391,7 +1388,6 @@
+ 
+     return escaped_string;
+ }
+-#endif
+ 
+ /*
+  * Like vim_strsave(), but make all characters uppercase.
+diff -Naur vim72-orig/src/normal.c vim72/src/normal.c
+--- vim72-orig/src/normal.c	2008-07-31 20:03:08.000000000 +0000
++++ vim72/src/normal.c	2008-09-25 18:12:51.000000000 +0000
+@@ -5469,6 +5469,11 @@
+ 		STRCPY(buf, "he! ");
+ 	    else
+ 	    {
++		/* An external command will probably use an argument starting
++		 * with "-" as an option.  To avoid trouble we skip the "-". */
++		while (*ptr == '-')
++		    ++ptr;
++
+ 		/* When a count is given, turn it into a range.  Is this
+ 		 * really what we want? */
+ 		isman = (STRCMP(kp, "man") == 0);
+@@ -5511,37 +5516,57 @@
+     /*
+      * Now grab the chars in the identifier
+      */
+-    if (cmdchar == '*')
+-	aux_ptr = (char_u *)(p_magic ? "/.*~[^$\\" : "/^$\\");
+-    else if (cmdchar == '#')
+-	aux_ptr = (char_u *)(p_magic ? "/?.*~[^$\\" : "/?^$\\");
+-    else if (cmdchar == 'K' && !kp_help)
+-	aux_ptr = (char_u *)" \t\\\"|!";
+-    else
+-	/* Don't escape spaces and Tabs in a tag with a backslash */
+-	aux_ptr = (char_u *)"\\|\"";
+-
+-    p = buf + STRLEN(buf);
+-    while (n-- > 0)
+-    {
+-	/* put a backslash before \ and some others */
+-	if (vim_strchr(aux_ptr, *ptr) != NULL)
+-	    *p++ = '\\';
+-#ifdef FEAT_MBYTE
+-	/* When current byte is a part of multibyte character, copy all bytes
+-	 * of that character. */
+-	if (has_mbyte)
++    if (cmdchar == 'K' && !kp_help)
++    {
++	/* Escape the argument properly for a shell command */
++	p = vim_strsave_shellescape(ptr, TRUE);
++	if (p == NULL)
+ 	{
+-	    int i;
+-	    int len = (*mb_ptr2len)(ptr) - 1;
+-
+-	    for (i = 0; i < len && n >= 1; ++i, --n)
+-		*p++ = *ptr++;
++	    vim_free(buf);
++	    return;
+ 	}
++	buf = (char_u *)vim_realloc(buf, STRLEN(buf) + STRLEN(p) + 1);
++	if (buf == NULL)
++	{
++	    vim_free(buf);
++	    vim_free(p);
++	    return;
++	}
++	STRCAT(buf, p);
++	vim_free(p);
++    }
++    else
++    {
++	if (cmdchar == '*')
++	    aux_ptr = (char_u *)(p_magic ? "/.*~[^$\\" : "/^$\\");
++	else if (cmdchar == '#')
++	    aux_ptr = (char_u *)(p_magic ? "/?.*~[^$\\" : "/?^$\\");
++	else
++	    /* Don't escape spaces and Tabs in a tag with a backslash */
++	    aux_ptr = (char_u *)"\\|\"\n*?[";
++
++	p = buf + STRLEN(buf);
++	while (n-- > 0)
++	{
++	    /* put a backslash before \ and some others */
++	    if (vim_strchr(aux_ptr, *ptr) != NULL)
++		*p++ = '\\';
++#ifdef FEAT_MBYTE
++	    /* When current byte is a part of multibyte character, copy all
++	     * bytes of that character. */
++	    if (has_mbyte)
++	    {
++		int i;
++		int len = (*mb_ptr2len)(ptr) - 1;
++
++		for (i = 0; i < len && n >= 1; ++i, --n)
++		    *p++ = *ptr++;
++	    }
+ #endif
+-	*p++ = *ptr++;
++	    *p++ = *ptr++;
++	}
++	*p = NUL;
+     }
+-    *p = NUL;
+ 
+     /*
+      * Execute the command.
+diff -Naur vim72-orig/src/pty.c vim72/src/pty.c
+--- vim72-orig/src/pty.c	2008-06-21 18:52:58.000000000 +0000
++++ vim72/src/pty.c	2008-09-25 18:11:56.000000000 +0000
+@@ -270,9 +270,10 @@
+ }
+ #endif
+ 
+-#if defined(HAVE_SVR4_PTYS) && !defined(PTY_DONE) && !defined(hpux)
++#if defined(HAVE_SVR4_PTYS) && !defined(PTY_DONE) && !defined(hpux) && !defined(MACOS_X)
+ 
+-/* NOTE: Even though HPUX can have /dev/ptmx, the code below doesn't work! */
++/* NOTE: Even though HPUX can have /dev/ptmx, the code below doesn't work!
++ * Same for Mac OS X Leopard. */
+ #define PTY_DONE
+     int
+ OpenPTY(ttyn)
+diff -Naur vim72-orig/src/spell.c vim72/src/spell.c
+--- vim72-orig/src/spell.c	2008-07-12 19:20:55.000000000 +0000
++++ vim72/src/spell.c	2008-09-25 18:11:56.000000000 +0000
+@@ -77,7 +77,7 @@
+ 
+ /*
+  * Do the opposite: based on a maximum end score and a known sound score,
+- * compute the the maximum word score that can be used.
++ * compute the maximum word score that can be used.
+  */
+ #define MAXSCORE(word_score, sound_score) ((4 * word_score - sound_score) / 3)
+ 
+@@ -625,7 +625,7 @@
+ /* TRUE if a word appears in the list of banned words.  */
+ #define WAS_BANNED(su, word) (!HASHITEM_EMPTY(hash_find(&su->su_banned, word)))
+ 
+-/* Number of suggestions kept when cleaning up.  we need to keep more than
++/* Number of suggestions kept when cleaning up.  We need to keep more than
+  * what is displayed, because when rescore_suggestions() is called the score
+  * may change and wrong suggestions may be removed later. */
+ #define SUG_CLEAN_COUNT(su)    ((su)->su_maxcount < 130 ? 150 : (su)->su_maxcount + 20)
+@@ -5980,7 +5980,7 @@
+ 	else if (spin->si_newprefID == 0 || spin->si_newprefID == 127)
+ 	    MSG(_("Too many compound flags"));
+ 	else
+-	    MSG(_("Too many posponed prefixes and/or compound flags"));
++	    MSG(_("Too many postponed prefixes and/or compound flags"));
+     }
+ 
+     if (syllable != NULL)
+diff -Naur vim72-orig/src/testdir/Makefile vim72/src/testdir/Makefile
+--- vim72-orig/src/testdir/Makefile	2008-06-19 20:29:46.000000000 +0000
++++ vim72/src/testdir/Makefile	2008-09-25 18:13:03.000000000 +0000
+@@ -26,15 +26,17 @@
+ 
+ .SUFFIXES: .in .out
+ 
+-nongui:	nolog $(SCRIPTS)
+-	@echo
+-	@cat test.log
+-	@echo ALL DONE
++nongui:	nolog $(SCRIPTS) report
++
++gui:	nolog $(SCRIPTS) $(SCRIPTS_GUI) report
+ 
+-gui:	nolog $(SCRIPTS) $(SCRIPTS_GUI)
++report:
+ 	@echo
+-	@cat test.log
+-	@echo ALL DONE
++	@echo 'Test results:'
++	@/bin/sh -c "if test -f test.log; \
++		then cat test.log; echo TEST FAILURE; exit 1; \
++		else echo ALL DONE; \
++		fi"
+ 
+ $(SCRIPTS) $(SCRIPTS_GUI): $(VIMPROG)
+ 
+@@ -71,4 +73,4 @@
+ test60.out: test60.vim
+ 
+ nolog:
+-	-echo Test results: >test.log
++	-rm -f test.log
+diff -Naur vim72-orig/src/ui.c vim72/src/ui.c
+--- vim72-orig/src/ui.c	2008-07-14 18:14:56.000000000 +0000
++++ vim72/src/ui.c	2008-09-25 18:13:16.000000000 +0000
+@@ -2020,7 +2020,7 @@
+ 
+     if (value == NULL || *length == 0)
+     {
+-	clip_free_selection(cbd);	/* ???  [what's the query?] */
++	clip_free_selection(cbd);	/* nothing received, clear register */
+ 	*(int *)success = FALSE;
+ 	return;
+     }
+@@ -2076,7 +2076,7 @@
+ 	text_prop.value = (unsigned char *)value;
+ 	text_prop.encoding = *type;
+ 	text_prop.format = *format;
+-	text_prop.nitems = STRLEN(value);
++	text_prop.nitems = len;
+ 	status = XmbTextPropertyToTextList(X_DISPLAY, &text_prop,
+ 							 &text_list, &n_text);
+ 	if (status != Success || n_text < 1)
+@@ -2110,6 +2110,8 @@
+     int		i;
+     int		nbytes = 0;
+     char_u	*buffer;
++    time_t	start_time;
++    int		timed_out = FALSE;
+ 
+     for (i =
+ #ifdef FEAT_MBYTE
+@@ -2129,6 +2131,7 @@
+ 	    case 3:  type = text_atom;		break;
+ 	    default: type = XA_STRING;
+ 	}
++	success = MAYBE;
+ 	XtGetSelectionValue(myShell, cbd->sel_atom, type,
+ 	    clip_x11_request_selection_cb, (XtPointer)&success, CurrentTime);
+ 
+@@ -2141,27 +2144,48 @@
+ 	 * characters, then they will appear before the one that requested the
+ 	 * paste!  Don't worry, we will catch up with any other events later.
+ 	 */
+-	for (;;)
++	start_time = time(NULL);
++	while (success == MAYBE)
+ 	{
+-	    if (XCheckTypedEvent(dpy, SelectionNotify, &event))
+-		break;
+-	    if (XCheckTypedEvent(dpy, SelectionRequest, &event))
+-		/* We may get a SelectionRequest here and if we don't handle
+-		 * it we hang.  KDE klipper does this, for example. */
++	    if (XCheckTypedEvent(dpy, SelectionNotify, &event)
++		    || XCheckTypedEvent(dpy, SelectionRequest, &event)
++		    || XCheckTypedEvent(dpy, PropertyNotify, &event))
++	    {
++		/* This is where clip_x11_request_selection_cb() should be
++		 * called.  It may actually happen a bit later, so we loop
++		 * until "success" changes.
++		 * We may get a SelectionRequest here and if we don't handle
++		 * it we hang.  KDE klipper does this, for example.
++		 * We need to handle a PropertyNotify for large selections. */
+ 		XtDispatchEvent(&event);
++		continue;
++	    }
++
++	    /* Time out after 2 to 3 seconds to avoid that we hang when the
++	     * other process doesn't respond.  Note that the SelectionNotify
++	     * event may still come later when the selection owner comes back
++	     * to life and the text gets inserted unexpectedly.  Don't know
++	     * why that happens or how to avoid that :-(. */
++	    if (time(NULL) > start_time + 2)
++	    {
++		timed_out = TRUE;
++		break;
++	    }
+ 
+ 	    /* Do we need this?  Probably not. */
+ 	    XSync(dpy, False);
+ 
+-	    /* Bernhard Walle solved a slow paste response in an X terminal by
+-	     * adding: usleep(10000); here. */
++	    /* Wait for 1 msec to avoid that we eat up all CPU time. */
++	    ui_delay(1L, TRUE);
+ 	}
+ 
+-	/* this is where clip_x11_request_selection_cb() is actually called */
+-	XtDispatchEvent(&event);
+-
+-	if (success)
++	if (success == TRUE)
+ 	    return;
++
++	/* don't do a retry with another type after timing out, otherwise we
++	 * hang for 15 seconds. */
++	if (timed_out)
++	    break;
+     }
+ 
+     /* Final fallback position - use the X CUT_BUFFER0 store */
+diff -Naur vim72-orig/src/version.c vim72/src/version.c
+--- vim72-orig/src/version.c	2008-08-09 14:24:52.000000000 +0000
++++ vim72/src/version.c	2008-09-25 18:13:31.000000000 +0000
+@@ -677,6 +677,46 @@
+ static int included_patches[] =
+ {   /* Add new patch number below this line */
+ /**/
++    21,
++/**/
++    20,
++/**/
++    19,
++/**/
++    18,
++/**/
++    17,
++/**/
++    16,
++/**/
++    15,
++/**/
++    14,
++/**/
++    13,
++/**/
++    12,
++/**/
++    11,
++/**/
++    10,
++/**/
++    9,
++/**/
++    8,
++/**/
++    6,
++/**/
++    5,
++/**/
++    4,
++/**/
++    3,
++/**/
++    2,
++/**/
++    1,
++/**/
+     0
+ };
+ 
+@@ -786,7 +826,7 @@
+     MSG_PUTS(_("\nRISC OS version"));
+ #endif
+ #ifdef VMS
+-    MSG_PUTS("\nOpenVMS version");
++    MSG_PUTS(_("\nOpenVMS version"));
+ # ifdef HAVE_PATHDEF
+     if (*compiled_arch != NUL)
+     {




More information about the patches mailing list