[vim] - patchlevel 336

Karsten Hopp karsten at fedoraproject.org
Fri Dec 23 21:29:52 UTC 2011


commit 27b736dc86acd3cd4328aafd36691f990733f868
Author: Karsten Hopp <karsten at redhat.com>
Date:   Fri Dec 23 22:30:42 2011 +0100

    - patchlevel 336

 7.3.336 | 1100 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 1100 insertions(+), 0 deletions(-)
---
diff --git a/7.3.336 b/7.3.336
new file mode 100644
index 0000000..f1a92c6
--- /dev/null
+++ b/7.3.336
@@ -0,0 +1,1100 @@
+To: vim_dev at googlegroups.com
+Subject: Patch 7.3.336
+Fcc: outbox
+From: Bram Moolenaar <Bram at moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 7.3.336
+Problem:    When a tags file specifies an encoding different from 'enc' it
+	    may hang and using a pattern doesn't work.
+Solution:   Convert the whole line.  Continue reading the header after the
+	    SORT tag.  Add test83. (Yukihiro Nakadaira)
+Files:	    src/tag.c, src/testdir/Make_amiga.mak, src/testdir/Make_dos.mak,
+	    src/testdir/Make_ming.mak, src/testdir/Make_os2.mak,
+	    src/testdir/Make_vms.mms, src/testdir/Makefile,
+	    src/testdir/test83-tags2, src/testdir/test83-tags3,
+	    src/testdir/test83.in, src/testdir/test83.ok
+
+
+*** ../vim-7.3.335/src/tag.c	2011-04-11 21:35:03.000000000 +0200
+--- src/tag.c	2011-10-12 19:51:04.000000000 +0200
+***************
+*** 1277,1282 ****
+--- 1277,1283 ----
+  {
+      FILE       *fp;
+      char_u     *lbuf;			/* line buffer */
++     int		lbuf_size = LSIZE;	/* length of lbuf */
+      char_u     *tag_fname;		/* name of tag file */
+      tagname_T	tn;			/* info for get_tagfname() */
+      int		first_file;		/* trying first tag file */
+***************
+*** 1291,1296 ****
+--- 1292,1298 ----
+      char_u	*s;
+      int		i;
+  #ifdef FEAT_TAG_BINS
++     int		tag_file_sorted = NUL;	/* !_TAG_FILE_SORTED value */
+      struct tag_search_info	/* Binary search file offsets */
+      {
+  	off_t	low_offset;	/* offset for first char of first line that
+***************
+*** 1360,1372 ****
+      char_u	*saved_pat = NULL;		/* copy of pat[] */
+  #endif
+  
+-     /* Use two sets of variables for the pattern: "orgpat" holds the values
+-      * for the original pattern and "convpat" converted from 'encoding' to
+-      * encoding of the tags file.  "pats" point to either one of these. */
+-     pat_T	*pats;
+      pat_T	orgpat;			/* holds unconverted pattern info */
+  #ifdef FEAT_MBYTE
+-     pat_T	convpat;		/* holds converted pattern info */
+      vimconv_T	vimconv;
+  #endif
+  
+--- 1362,1369 ----
+***************
+*** 1390,1396 ****
+  
+      help_save = curbuf->b_help;
+      orgpat.pat = pat;
+-     pats = &orgpat;
+  #ifdef FEAT_MBYTE
+      vimconv.vc_type = CONV_NONE;
+  #endif
+--- 1387,1392 ----
+***************
+*** 1398,1404 ****
+  /*
+   * Allocate memory for the buffers that are used
+   */
+!     lbuf = alloc(LSIZE);
+      tag_fname = alloc(MAXPATHL + 1);
+  #ifdef FEAT_EMACS_TAGS
+      ebuf = alloc(LSIZE);
+--- 1394,1400 ----
+  /*
+   * Allocate memory for the buffers that are used
+   */
+!     lbuf = alloc(lbuf_size);
+      tag_fname = alloc(MAXPATHL + 1);
+  #ifdef FEAT_EMACS_TAGS
+      ebuf = alloc(LSIZE);
+***************
+*** 1424,1453 ****
+      if (help_only)				/* want tags from help file */
+  	curbuf->b_help = TRUE;			/* will be restored later */
+  
+!     pats->len = (int)STRLEN(pat);
+  #ifdef FEAT_MULTI_LANG
+      if (curbuf->b_help)
+      {
+  	/* When "@ab" is specified use only the "ab" language, otherwise
+  	 * search all languages. */
+! 	if (pats->len > 3 && pat[pats->len - 3] == '@'
+! 					  && ASCII_ISALPHA(pat[pats->len - 2])
+! 					 && ASCII_ISALPHA(pat[pats->len - 1]))
+  	{
+! 	    saved_pat = vim_strnsave(pat, pats->len - 3);
+  	    if (saved_pat != NULL)
+  	    {
+! 		help_lang_find = &pat[pats->len - 2];
+! 		pats->pat = saved_pat;
+! 		pats->len -= 3;
+  	    }
+  	}
+      }
+  #endif
+!     if (p_tl != 0 && pats->len > p_tl)		/* adjust for 'taglength' */
+! 	pats->len = p_tl;
+  
+!     prepare_pats(pats, has_re);
+  
+  #ifdef FEAT_TAG_BINS
+      /* This is only to avoid a compiler warning for using search_info
+--- 1420,1449 ----
+      if (help_only)				/* want tags from help file */
+  	curbuf->b_help = TRUE;			/* will be restored later */
+  
+!     orgpat.len = (int)STRLEN(pat);
+  #ifdef FEAT_MULTI_LANG
+      if (curbuf->b_help)
+      {
+  	/* When "@ab" is specified use only the "ab" language, otherwise
+  	 * search all languages. */
+! 	if (orgpat.len > 3 && pat[orgpat.len - 3] == '@'
+! 					  && ASCII_ISALPHA(pat[orgpat.len - 2])
+! 					 && ASCII_ISALPHA(pat[orgpat.len - 1]))
+  	{
+! 	    saved_pat = vim_strnsave(pat, orgpat.len - 3);
+  	    if (saved_pat != NULL)
+  	    {
+! 		help_lang_find = &pat[orgpat.len - 2];
+! 		orgpat.pat = saved_pat;
+! 		orgpat.len -= 3;
+  	    }
+  	}
+      }
+  #endif
+!     if (p_tl != 0 && orgpat.len > p_tl)		/* adjust for 'taglength' */
+! 	orgpat.len = p_tl;
+  
+!     prepare_pats(&orgpat, has_re);
+  
+  #ifdef FEAT_TAG_BINS
+      /* This is only to avoid a compiler warning for using search_info
+***************
+*** 1466,1478 ****
+       * Only ignore case when TAG_NOIC not used or 'ignorecase' set.
+       */
+  #ifdef FEAT_TAG_BINS
+!     pats->regmatch.rm_ic = ((p_ic || !noic)
+! 				&& (findall || pats->headlen == 0 || !p_tbs));
+      for (round = 1; round <= 2; ++round)
+      {
+!       linear = (pats->headlen == 0 || !p_tbs || round == 2);
+  #else
+!       pats->regmatch.rm_ic = (p_ic || !noic);
+  #endif
+  
+        /*
+--- 1462,1474 ----
+       * Only ignore case when TAG_NOIC not used or 'ignorecase' set.
+       */
+  #ifdef FEAT_TAG_BINS
+!     orgpat.regmatch.rm_ic = ((p_ic || !noic)
+! 				&& (findall || orgpat.headlen == 0 || !p_tbs));
+      for (round = 1; round <= 2; ++round)
+      {
+!       linear = (orgpat.headlen == 0 || !p_tbs || round == 2);
+  #else
+!       orgpat.regmatch.rm_ic = (p_ic || !noic);
+  #endif
+  
+        /*
+***************
+*** 1701,1706 ****
+--- 1697,1732 ----
+  	    }
+  line_read_in:
+  
++ #ifdef FEAT_MBYTE
++ 	    if (vimconv.vc_type != CONV_NONE)
++ 	    {
++ 		char_u	*conv_line;
++ 		int	len;
++ 
++ 		/* Convert every line.  Converting the pattern from 'enc' to
++ 		 * the tags file encoding doesn't work, because characters are
++ 		 * not recognized. */
++ 		conv_line = string_convert(&vimconv, lbuf, NULL);
++ 		if (conv_line != NULL)
++ 		{
++ 		    /* Copy or swap lbuf and conv_line. */
++ 		    len = (int)STRLEN(conv_line) + 1;
++ 		    if (len > lbuf_size)
++ 		    {
++ 			vim_free(lbuf);
++ 			lbuf = conv_line;
++ 			lbuf_size = len;
++ 		    }
++ 		    else
++ 		    {
++ 			STRCPY(lbuf, conv_line);
++ 			vim_free(conv_line);
++ 		    }
++ 		}
++ 	    }
++ #endif
++ 
++ 
+  #ifdef FEAT_EMACS_TAGS
+  	    /*
+  	     * Emacs tags line with CTRL-L: New file name on next line.
+***************
+*** 1770,1775 ****
+--- 1796,1828 ----
+  	     */
+  	    if (state == TS_START)
+  	    {
++ 		if (STRNCMP(lbuf, "!_TAG_", 6) <= 0)
++ 		{
++ 		    /*
++ 		     * Read header line.
++ 		     */
++ #ifdef FEAT_TAG_BINS
++ 		    if (STRNCMP(lbuf, "!_TAG_FILE_SORTED\t", 18) == 0)
++ 			tag_file_sorted = lbuf[18];
++ #endif
++ #ifdef FEAT_MBYTE
++ 		    if (STRNCMP(lbuf, "!_TAG_FILE_ENCODING\t", 20) == 0)
++ 		    {
++ 			/* Prepare to convert every line from the specified
++ 			 * encoding to 'encoding'. */
++ 			for (p = lbuf + 20; *p > ' ' && *p < 127; ++p)
++ 			    ;
++ 			*p = NUL;
++ 			convert_setup(&vimconv, lbuf + 20, p_enc);
++ 		    }
++ #endif
++ 
++ 		    /* Read the next line.  Unrecognized flags are ignored. */
++ 		    continue;
++ 		}
++ 
++ 		/* Headers ends. */
++ 
+  #ifdef FEAT_TAG_BINS
+  		/*
+  		 * When there is no tag head, or ignoring case, need to do a
+***************
+*** 1786,1809 ****
+  		if (linear)
+  # endif
+  		    state = TS_LINEAR;
+! 		else if (STRNCMP(lbuf, "!_TAG_", 6) > 0)
+  		    state = TS_BINARY;
+! 		else if (STRNCMP(lbuf, "!_TAG_FILE_SORTED\t", 18) == 0)
+! 		{
+! 		    /* Check sorted flag */
+! 		    if (lbuf[18] == '1')
+  			state = TS_BINARY;
+! 		    else if (lbuf[18] == '2')
+! 		    {
+! 			state = TS_BINARY;
+! 			sortic = TRUE;
+! 			pats->regmatch.rm_ic = (p_ic || !noic);
+! 		    }
+! 		    else
+! 			state = TS_LINEAR;
+  		}
+  
+! 		if (state == TS_BINARY && pats->regmatch.rm_ic && !sortic)
+  		{
+  		    /* binary search won't work for ignoring case, use linear
+  		     * search. */
+--- 1839,1858 ----
+  		if (linear)
+  # endif
+  		    state = TS_LINEAR;
+! 		else if (tag_file_sorted == NUL)
+  		    state = TS_BINARY;
+! 		else if (tag_file_sorted == '1')
+  			state = TS_BINARY;
+! 		else if (tag_file_sorted == '2')
+! 		{
+! 		    state = TS_BINARY;
+! 		    sortic = TRUE;
+! 		    orgpat.regmatch.rm_ic = (p_ic || !noic);
+  		}
++ 		else
++ 		    state = TS_LINEAR;
+  
+! 		if (state == TS_BINARY && orgpat.regmatch.rm_ic && !sortic)
+  		{
+  		    /* binary search won't work for ignoring case, use linear
+  		     * search. */
+***************
+*** 1843,1882 ****
+  #endif
+  	    }
+  
+- #ifdef FEAT_MBYTE
+- 	    if (lbuf[0] == '!' && pats == &orgpat
+- 			   && STRNCMP(lbuf, "!_TAG_FILE_ENCODING\t", 20) == 0)
+- 	    {
+- 		/* Convert the search pattern from 'encoding' to the
+- 		 * specified encoding. */
+- 		for (p = lbuf + 20; *p > ' ' && *p < 127; ++p)
+- 		    ;
+- 		*p = NUL;
+- 		convert_setup(&vimconv, p_enc, lbuf + 20);
+- 		if (vimconv.vc_type != CONV_NONE)
+- 		{
+- 		    convpat.pat = string_convert(&vimconv, pats->pat, NULL);
+- 		    if (convpat.pat != NULL)
+- 		    {
+- 			pats = &convpat;
+- 			pats->len = (int)STRLEN(pats->pat);
+- 			prepare_pats(pats, has_re);
+- 			pats->regmatch.rm_ic = orgpat.regmatch.rm_ic;
+- 		    }
+- 		}
+- 
+- 		/* Prepare for converting a match the other way around. */
+- 		convert_setup(&vimconv, lbuf + 20, p_enc);
+- 		continue;
+- 	    }
+- #endif
+- 
+  	    /*
+  	     * Figure out where the different strings are in this line.
+  	     * For "normal" tags: Do a quick check if the tag matches.
+  	     * This speeds up tag searching a lot!
+  	     */
+! 	    if (pats->headlen
+  #ifdef FEAT_EMACS_TAGS
+  			    && !is_etag
+  #endif
+--- 1892,1903 ----
+  #endif
+  	    }
+  
+  	    /*
+  	     * Figure out where the different strings are in this line.
+  	     * For "normal" tags: Do a quick check if the tag matches.
+  	     * This speeds up tag searching a lot!
+  	     */
+! 	    if (orgpat.headlen
+  #ifdef FEAT_EMACS_TAGS
+  			    && !is_etag
+  #endif
+***************
+*** 1933,1941 ****
+  		cmplen = (int)(tagp.tagname_end - tagp.tagname);
+  		if (p_tl != 0 && cmplen > p_tl)	    /* adjust for 'taglength' */
+  		    cmplen = p_tl;
+! 		if (has_re && pats->headlen < cmplen)
+! 		    cmplen = pats->headlen;
+! 		else if (state == TS_LINEAR && pats->headlen != cmplen)
+  		    continue;
+  
+  #ifdef FEAT_TAG_BINS
+--- 1954,1962 ----
+  		cmplen = (int)(tagp.tagname_end - tagp.tagname);
+  		if (p_tl != 0 && cmplen > p_tl)	    /* adjust for 'taglength' */
+  		    cmplen = p_tl;
+! 		if (has_re && orgpat.headlen < cmplen)
+! 		    cmplen = orgpat.headlen;
+! 		else if (state == TS_LINEAR && orgpat.headlen != cmplen)
+  		    continue;
+  
+  #ifdef FEAT_TAG_BINS
+***************
+*** 1954,1963 ****
+  		     * Compare the current tag with the searched tag.
+  		     */
+  		    if (sortic)
+! 			tagcmp = tag_strnicmp(tagp.tagname, pats->head,
+  							      (size_t)cmplen);
+  		    else
+! 			tagcmp = STRNCMP(tagp.tagname, pats->head, cmplen);
+  
+  		    /*
+  		     * A match with a shorter tag means to search forward.
+--- 1975,1984 ----
+  		     * Compare the current tag with the searched tag.
+  		     */
+  		    if (sortic)
+! 			tagcmp = tag_strnicmp(tagp.tagname, orgpat.head,
+  							      (size_t)cmplen);
+  		    else
+! 			tagcmp = STRNCMP(tagp.tagname, orgpat.head, cmplen);
+  
+  		    /*
+  		     * A match with a shorter tag means to search forward.
+***************
+*** 1965,1973 ****
+  		     */
+  		    if (tagcmp == 0)
+  		    {
+! 			if (cmplen < pats->headlen)
+  			    tagcmp = -1;
+! 			else if (cmplen > pats->headlen)
+  			    tagcmp = 1;
+  		    }
+  
+--- 1986,1994 ----
+  		     */
+  		    if (tagcmp == 0)
+  		    {
+! 			if (cmplen < orgpat.headlen)
+  			    tagcmp = -1;
+! 			else if (cmplen > orgpat.headlen)
+  			    tagcmp = 1;
+  		    }
+  
+***************
+*** 2011,2017 ****
+  		}
+  		else if (state == TS_SKIP_BACK)
+  		{
+! 		    if (MB_STRNICMP(tagp.tagname, pats->head, cmplen) != 0)
+  			state = TS_STEP_FORWARD;
+  		    else
+  			/* Have to skip back more.  Restore the curr_offset
+--- 2032,2038 ----
+  		}
+  		else if (state == TS_SKIP_BACK)
+  		{
+! 		    if (MB_STRNICMP(tagp.tagname, orgpat.head, cmplen) != 0)
+  			state = TS_STEP_FORWARD;
+  		    else
+  			/* Have to skip back more.  Restore the curr_offset
+***************
+*** 2021,2027 ****
+  		}
+  		else if (state == TS_STEP_FORWARD)
+  		{
+! 		    if (MB_STRNICMP(tagp.tagname, pats->head, cmplen) != 0)
+  		    {
+  			if ((off_t)ftell(fp) > search_info.match_offset)
+  			    break;	/* past last match */
+--- 2042,2048 ----
+  		}
+  		else if (state == TS_STEP_FORWARD)
+  		{
+! 		    if (MB_STRNICMP(tagp.tagname, orgpat.head, cmplen) != 0)
+  		    {
+  			if ((off_t)ftell(fp) > search_info.match_offset)
+  			    break;	/* past last match */
+***************
+*** 2032,2038 ****
+  		else
+  #endif
+  		    /* skip this match if it can't match */
+! 		    if (MB_STRNICMP(tagp.tagname, pats->head, cmplen) != 0)
+  		    continue;
+  
+  		/*
+--- 2053,2059 ----
+  		else
+  #endif
+  		    /* skip this match if it can't match */
+! 		    if (MB_STRNICMP(tagp.tagname, orgpat.head, cmplen) != 0)
+  		    continue;
+  
+  		/*
+***************
+*** 2083,2123 ****
+  	    if (p_tl != 0 && cmplen > p_tl)	    /* adjust for 'taglength' */
+  		cmplen = p_tl;
+  	    /* if tag length does not match, don't try comparing */
+! 	    if (pats->len != cmplen)
+  		match = FALSE;
+  	    else
+  	    {
+! 		if (pats->regmatch.rm_ic)
+  		{
+! 		    match = (MB_STRNICMP(tagp.tagname, pats->pat, cmplen) == 0);
+  		    if (match)
+! 			match_no_ic = (STRNCMP(tagp.tagname, pats->pat,
+  								cmplen) == 0);
+  		}
+  		else
+! 		    match = (STRNCMP(tagp.tagname, pats->pat, cmplen) == 0);
+  	    }
+  
+  	    /*
+  	     * Has a regexp: Also find tags matching regexp.
+  	     */
+  	    match_re = FALSE;
+! 	    if (!match && pats->regmatch.regprog != NULL)
+  	    {
+  		int	cc;
+  
+  		cc = *tagp.tagname_end;
+  		*tagp.tagname_end = NUL;
+! 		match = vim_regexec(&pats->regmatch, tagp.tagname, (colnr_T)0);
+  		if (match)
+  		{
+! 		    matchoff = (int)(pats->regmatch.startp[0] - tagp.tagname);
+! 		    if (pats->regmatch.rm_ic)
+  		    {
+! 			pats->regmatch.rm_ic = FALSE;
+! 			match_no_ic = vim_regexec(&pats->regmatch, tagp.tagname,
+  								  (colnr_T)0);
+! 			pats->regmatch.rm_ic = TRUE;
+  		    }
+  		}
+  		*tagp.tagname_end = cc;
+--- 2104,2144 ----
+  	    if (p_tl != 0 && cmplen > p_tl)	    /* adjust for 'taglength' */
+  		cmplen = p_tl;
+  	    /* if tag length does not match, don't try comparing */
+! 	    if (orgpat.len != cmplen)
+  		match = FALSE;
+  	    else
+  	    {
+! 		if (orgpat.regmatch.rm_ic)
+  		{
+! 		    match = (MB_STRNICMP(tagp.tagname, orgpat.pat, cmplen) == 0);
+  		    if (match)
+! 			match_no_ic = (STRNCMP(tagp.tagname, orgpat.pat,
+  								cmplen) == 0);
+  		}
+  		else
+! 		    match = (STRNCMP(tagp.tagname, orgpat.pat, cmplen) == 0);
+  	    }
+  
+  	    /*
+  	     * Has a regexp: Also find tags matching regexp.
+  	     */
+  	    match_re = FALSE;
+! 	    if (!match && orgpat.regmatch.regprog != NULL)
+  	    {
+  		int	cc;
+  
+  		cc = *tagp.tagname_end;
+  		*tagp.tagname_end = NUL;
+! 		match = vim_regexec(&orgpat.regmatch, tagp.tagname, (colnr_T)0);
+  		if (match)
+  		{
+! 		    matchoff = (int)(orgpat.regmatch.startp[0] - tagp.tagname);
+! 		    if (orgpat.regmatch.rm_ic)
+  		    {
+! 			orgpat.regmatch.rm_ic = FALSE;
+! 			match_no_ic = vim_regexec(&orgpat.regmatch, tagp.tagname,
+  								  (colnr_T)0);
+! 			orgpat.regmatch.rm_ic = TRUE;
+  		    }
+  		}
+  		*tagp.tagname_end = cc;
+***************
+*** 2174,2180 ****
+  			else
+  			    mtt = MT_GL_OTH;
+  		    }
+! 		    if (pats->regmatch.rm_ic && !match_no_ic)
+  			mtt += MT_IC_OFF;
+  		    if (match_re)
+  			mtt += MT_RE_OFF;
+--- 2195,2201 ----
+  			else
+  			    mtt = MT_GL_OTH;
+  		    }
+! 		    if (orgpat.regmatch.rm_ic && !match_no_ic)
+  			mtt += MT_IC_OFF;
+  		    if (match_re)
+  			mtt += MT_RE_OFF;
+***************
+*** 2187,2221 ****
+  		 */
+  		if (ga_grow(&ga_match[mtt], 1) == OK)
+  		{
+- #ifdef FEAT_MBYTE
+- 		    char_u	*conv_line = NULL;
+- 		    char_u	*lbuf_line = lbuf;
+- 
+- 		    if (vimconv.vc_type != CONV_NONE)
+- 		    {
+- 			/* Convert the tag line from the encoding of the tags
+- 			 * file to 'encoding'.  Then parse the line again. */
+- 			conv_line = string_convert(&vimconv, lbuf, NULL);
+- 			if (conv_line != NULL)
+- 			{
+- 			    if (parse_tag_line(conv_line,
+- #ifdef FEAT_EMACS_TAGS
+- 					is_etag,
+- #endif
+- 					&tagp) == OK)
+- 				lbuf_line = conv_line;
+- 			    else
+- 				/* doesn't work, go back to unconverted line. */
+- 				(void)parse_tag_line(lbuf,
+- #ifdef FEAT_EMACS_TAGS
+- 						     is_etag,
+- #endif
+- 						     &tagp);
+- 			}
+- 		    }
+- #else
+- # define lbuf_line lbuf
+- #endif
+  		    if (help_only)
+  		    {
+  #ifdef FEAT_MULTI_LANG
+--- 2208,2213 ----
+***************
+*** 2307,2313 ****
+  			 * without Emacs tags: <mtt><tag_fname><NUL><lbuf>
+  			 */
+  			len = (int)STRLEN(tag_fname)
+! 						 + (int)STRLEN(lbuf_line) + 3;
+  #ifdef FEAT_EMACS_TAGS
+  			if (is_etag)
+  			    len += (int)STRLEN(ebuf) + 1;
+--- 2299,2305 ----
+  			 * without Emacs tags: <mtt><tag_fname><NUL><lbuf>
+  			 */
+  			len = (int)STRLEN(tag_fname)
+! 						 + (int)STRLEN(lbuf) + 3;
+  #ifdef FEAT_EMACS_TAGS
+  			if (is_etag)
+  			    len += (int)STRLEN(ebuf) + 1;
+***************
+*** 2337,2343 ****
+  			    else
+  				*s++ = NUL;
+  #endif
+! 			    STRCPY(s, lbuf_line);
+  			}
+  		    }
+  
+--- 2329,2335 ----
+  			    else
+  				*s++ = NUL;
+  #endif
+! 			    STRCPY(s, lbuf);
+  			}
+  		    }
+  
+***************
+*** 2373,2382 ****
+  			else
+  			    vim_free(mfp);
+  		    }
+- #ifdef FEAT_MBYTE
+- 		    /* Note: this makes the values in "tagp" invalid! */
+- 		    vim_free(conv_line);
+- #endif
+  		}
+  		else    /* Out of memory! Just forget about the rest. */
+  		{
+--- 2365,2370 ----
+***************
+*** 2415,2433 ****
+  	}
+  #endif
+  #ifdef FEAT_MBYTE
+- 	if (pats == &convpat)
+- 	{
+- 	    /* Go back from converted pattern to original pattern. */
+- 	    vim_free(pats->pat);
+- 	    vim_free(pats->regmatch.regprog);
+- 	    orgpat.regmatch.rm_ic = pats->regmatch.rm_ic;
+- 	    pats = &orgpat;
+- 	}
+  	if (vimconv.vc_type != CONV_NONE)
+  	    convert_setup(&vimconv, NULL, NULL);
+  #endif
+  
+  #ifdef FEAT_TAG_BINS
+  	if (sort_error)
+  	{
+  	    EMSG2(_("E432: Tags file not sorted: %s"), tag_fname);
+--- 2403,2414 ----
+  	}
+  #endif
+  #ifdef FEAT_MBYTE
+  	if (vimconv.vc_type != CONV_NONE)
+  	    convert_setup(&vimconv, NULL, NULL);
+  #endif
+  
+  #ifdef FEAT_TAG_BINS
++ 	tag_file_sorted = NUL;
+  	if (sort_error)
+  	{
+  	    EMSG2(_("E432: Tags file not sorted: %s"), tag_fname);
+***************
+*** 2461,2473 ****
+  #ifdef FEAT_TAG_BINS
+        /* stop searching when already did a linear search, or when TAG_NOIC
+         * used, and 'ignorecase' not set or already did case-ignore search */
+!       if (stop_searching || linear || (!p_ic && noic) || pats->regmatch.rm_ic)
+  	  break;
+  # ifdef FEAT_CSCOPE
+        if (use_cscope)
+  	  break;
+  # endif
+!       pats->regmatch.rm_ic = TRUE;	/* try another time while ignoring case */
+      }
+  #endif
+  
+--- 2442,2454 ----
+  #ifdef FEAT_TAG_BINS
+        /* stop searching when already did a linear search, or when TAG_NOIC
+         * used, and 'ignorecase' not set or already did case-ignore search */
+!       if (stop_searching || linear || (!p_ic && noic) || orgpat.regmatch.rm_ic)
+  	  break;
+  # ifdef FEAT_CSCOPE
+        if (use_cscope)
+  	  break;
+  # endif
+!       orgpat.regmatch.rm_ic = TRUE;	/* try another time while ignoring case */
+      }
+  #endif
+  
+***************
+*** 2480,2486 ****
+  
+  findtag_end:
+      vim_free(lbuf);
+!     vim_free(pats->regmatch.regprog);
+      vim_free(tag_fname);
+  #ifdef FEAT_EMACS_TAGS
+      vim_free(ebuf);
+--- 2461,2467 ----
+  
+  findtag_end:
+      vim_free(lbuf);
+!     vim_free(orgpat.regmatch.regprog);
+      vim_free(tag_fname);
+  #ifdef FEAT_EMACS_TAGS
+      vim_free(ebuf);
+*** ../vim-7.3.335/src/testdir/Make_amiga.mak	2011-07-15 21:16:54.000000000 +0200
+--- src/testdir/Make_amiga.mak	2011-10-12 19:21:00.000000000 +0200
+***************
+*** 29,35 ****
+  		test66.out test67.out test68.out test69.out test70.out \
+  		test71.out test72.out test73.out test74.out test75.out \
+  		test76.out test77.out test78.out test79.out test80.out \
+! 		test81.out test82.out
+  
+  .SUFFIXES: .in .out
+  
+--- 29,35 ----
+  		test66.out test67.out test68.out test69.out test70.out \
+  		test71.out test72.out test73.out test74.out test75.out \
+  		test76.out test77.out test78.out test79.out test80.out \
+! 		test81.out test82.out test83.out
+  
+  .SUFFIXES: .in .out
+  
+***************
+*** 131,133 ****
+--- 131,134 ----
+  test80.out: test80.in
+  test81.out: test81.in
+  test82.out: test82.in
++ test83.out: test83.in
+*** ../vim-7.3.335/src/testdir/Make_dos.mak	2011-07-15 21:16:54.000000000 +0200
+--- src/testdir/Make_dos.mak	2011-10-12 17:39:03.000000000 +0200
+***************
+*** 29,35 ****
+  		test42.out test52.out test65.out test66.out test67.out \
+  		test68.out test69.out test71.out test72.out test73.out \
+  		test74.out test75.out test76.out test77.out test78.out \
+! 		test79.out test80.out test81.out test82.out
+  
+  SCRIPTS32 =	test50.out test70.out
+  
+--- 29,35 ----
+  		test42.out test52.out test65.out test66.out test67.out \
+  		test68.out test69.out test71.out test72.out test73.out \
+  		test74.out test75.out test76.out test77.out test78.out \
+! 		test79.out test80.out test81.out test82.out test83.out
+  
+  SCRIPTS32 =	test50.out test70.out
+  
+*** ../vim-7.3.335/src/testdir/Make_ming.mak	2011-07-15 21:16:54.000000000 +0200
+--- src/testdir/Make_ming.mak	2011-10-12 17:39:03.000000000 +0200
+***************
+*** 49,55 ****
+  		test42.out test52.out test65.out test66.out test67.out \
+  		test68.out test69.out test71.out test72.out test73.out \
+  		test74.out test75.out test76.out test77.out test78.out \
+! 		test79.out test80.out test81.out test82.out
+  
+  SCRIPTS32 =	test50.out test70.out
+  
+--- 49,55 ----
+  		test42.out test52.out test65.out test66.out test67.out \
+  		test68.out test69.out test71.out test72.out test73.out \
+  		test74.out test75.out test76.out test77.out test78.out \
+! 		test79.out test80.out test81.out test82.out test83.out
+  
+  SCRIPTS32 =	test50.out test70.out
+  
+*** ../vim-7.3.335/src/testdir/Make_os2.mak	2011-07-15 21:16:54.000000000 +0200
+--- src/testdir/Make_os2.mak	2011-10-12 17:39:03.000000000 +0200
+***************
+*** 29,35 ****
+  		test66.out test67.out test68.out test69.out test70.out \
+  		test71.out test72.out test73.out test74.out test75.out \
+  		test76.out test77.out test78.out test79.out test80.out \
+! 		test81.out test82.out
+  
+  .SUFFIXES: .in .out
+  
+--- 29,35 ----
+  		test66.out test67.out test68.out test69.out test70.out \
+  		test71.out test72.out test73.out test74.out test75.out \
+  		test76.out test77.out test78.out test79.out test80.out \
+! 		test81.out test82.out test83.out
+  
+  .SUFFIXES: .in .out
+  
+*** ../vim-7.3.335/src/testdir/Make_vms.mms	2011-07-15 21:16:54.000000000 +0200
+--- src/testdir/Make_vms.mms	2011-10-12 17:39:03.000000000 +0200
+***************
+*** 76,82 ****
+  	 test66.out test67.out test68.out test69.out \
+  	 test71.out test72.out test74.out test75.out test76.out \
+  	 test77.out test78.out test79.out test80.out test81.out \
+! 	 test82.out
+  
+  # Known problems:
+  # Test 30: a problem around mac format - unknown reason
+--- 76,82 ----
+  	 test66.out test67.out test68.out test69.out \
+  	 test71.out test72.out test74.out test75.out test76.out \
+  	 test77.out test78.out test79.out test80.out test81.out \
+! 	 test82.out test83.out
+  
+  # Known problems:
+  # Test 30: a problem around mac format - unknown reason
+*** ../vim-7.3.335/src/testdir/Makefile	2011-07-15 21:16:54.000000000 +0200
+--- src/testdir/Makefile	2011-10-12 17:39:03.000000000 +0200
+***************
+*** 26,32 ****
+  		test64.out test65.out test66.out test67.out test68.out \
+  		test69.out test70.out test71.out test72.out test73.out \
+  		test74.out test75.out test76.out test77.out test78.out \
+! 		test79.out test80.out test81.out test82.out
+  
+  SCRIPTS_GUI = test16.out
+  
+--- 26,32 ----
+  		test64.out test65.out test66.out test67.out test68.out \
+  		test69.out test70.out test71.out test72.out test73.out \
+  		test74.out test75.out test76.out test77.out test78.out \
+! 		test79.out test80.out test81.out test82.out test83.out
+  
+  SCRIPTS_GUI = test16.out
+  
+***************
+*** 72,78 ****
+  		  fi \
+  		else echo $* NO OUTPUT >>test.log; \
+  		fi"
+! 	-rm -rf X* test.ok viminfo
+  
+  test49.out: test49.vim
+  
+--- 72,78 ----
+  		  fi \
+  		else echo $* NO OUTPUT >>test.log; \
+  		fi"
+! #	-rm -rf X* test.ok viminfo
+  
+  test49.out: test49.vim
+  
+*** ../vim-7.3.335/src/testdir/test83-tags2	2011-10-12 19:49:38.000000000 +0200
+--- src/testdir/test83-tags2	2011-10-12 19:34:15.000000000 +0200
+***************
+*** 0 ****
+--- 1,2 ----
++ !_TAG_FILE_ENCODING	cp932	//
++ ‚`‚a‚b	Xtags2.txt	/‚`‚a‚b
+*** ../vim-7.3.335/src/testdir/test83-tags3	2011-10-12 19:49:38.000000000 +0200
+--- src/testdir/test83-tags3	2011-10-12 19:35:42.000000000 +0200
+***************
+*** 0 ****
+--- 1,102 ----
++ !_TAG_FILE_SORTED	1	//
++ !_TAG_FILE_ENCODING	cp932	//
++ abc1	Xtags3.txt	/‚`‚a‚b
++ abc2	Xtags3.txt	/‚`‚a‚b
++ abc3	Xtags3.txt	/‚`‚a‚b
++ abc4	Xtags3.txt	/‚`‚a‚b
++ abc5	Xtags3.txt	/‚`‚a‚b
++ abc6	Xtags3.txt	/‚`‚a‚b
++ abc7	Xtags3.txt	/‚`‚a‚b
++ abc8	Xtags3.txt	/‚`‚a‚b
++ abc9	Xtags3.txt	/‚`‚a‚b
++ abc10	Xtags3.txt	/‚`‚a‚b
++ abc11	Xtags3.txt	/‚`‚a‚b
++ abc12	Xtags3.txt	/‚`‚a‚b
++ abc13	Xtags3.txt	/‚`‚a‚b
++ abc14	Xtags3.txt	/‚`‚a‚b
++ abc15	Xtags3.txt	/‚`‚a‚b
++ abc16	Xtags3.txt	/‚`‚a‚b
++ abc17	Xtags3.txt	/‚`‚a‚b
++ abc18	Xtags3.txt	/‚`‚a‚b
++ abc19	Xtags3.txt	/‚`‚a‚b
++ abc20	Xtags3.txt	/‚`‚a‚b
++ abc21	Xtags3.txt	/‚`‚a‚b
++ abc22	Xtags3.txt	/‚`‚a‚b
++ abc23	Xtags3.txt	/‚`‚a‚b
++ abc24	Xtags3.txt	/‚`‚a‚b
++ abc25	Xtags3.txt	/‚`‚a‚b
++ abc26	Xtags3.txt	/‚`‚a‚b
++ abc27	Xtags3.txt	/‚`‚a‚b
++ abc28	Xtags3.txt	/‚`‚a‚b
++ abc29	Xtags3.txt	/‚`‚a‚b
++ abc30	Xtags3.txt	/‚`‚a‚b
++ abc31	Xtags3.txt	/‚`‚a‚b
++ abc32	Xtags3.txt	/‚`‚a‚b
++ abc33	Xtags3.txt	/‚`‚a‚b
++ abc34	Xtags3.txt	/‚`‚a‚b
++ abc35	Xtags3.txt	/‚`‚a‚b
++ abc36	Xtags3.txt	/‚`‚a‚b
++ abc37	Xtags3.txt	/‚`‚a‚b
++ abc38	Xtags3.txt	/‚`‚a‚b
++ abc39	Xtags3.txt	/‚`‚a‚b
++ abc40	Xtags3.txt	/‚`‚a‚b
++ abc41	Xtags3.txt	/‚`‚a‚b
++ abc42	Xtags3.txt	/‚`‚a‚b
++ abc43	Xtags3.txt	/‚`‚a‚b
++ abc44	Xtags3.txt	/‚`‚a‚b
++ abc45	Xtags3.txt	/‚`‚a‚b
++ abc46	Xtags3.txt	/‚`‚a‚b
++ abc47	Xtags3.txt	/‚`‚a‚b
++ abc48	Xtags3.txt	/‚`‚a‚b
++ abc49	Xtags3.txt	/‚`‚a‚b
++ abc50	Xtags3.txt	/‚`‚a‚b
++ abc51	Xtags3.txt	/‚`‚a‚b
++ abc52	Xtags3.txt	/‚`‚a‚b
++ abc53	Xtags3.txt	/‚`‚a‚b
++ abc54	Xtags3.txt	/‚`‚a‚b
++ abc55	Xtags3.txt	/‚`‚a‚b
++ abc56	Xtags3.txt	/‚`‚a‚b
++ abc57	Xtags3.txt	/‚`‚a‚b
++ abc58	Xtags3.txt	/‚`‚a‚b
++ abc59	Xtags3.txt	/‚`‚a‚b
++ abc60	Xtags3.txt	/‚`‚a‚b
++ abc61	Xtags3.txt	/‚`‚a‚b
++ abc62	Xtags3.txt	/‚`‚a‚b
++ abc63	Xtags3.txt	/‚`‚a‚b
++ abc64	Xtags3.txt	/‚`‚a‚b
++ abc65	Xtags3.txt	/‚`‚a‚b
++ abc66	Xtags3.txt	/‚`‚a‚b
++ abc67	Xtags3.txt	/‚`‚a‚b
++ abc68	Xtags3.txt	/‚`‚a‚b
++ abc69	Xtags3.txt	/‚`‚a‚b
++ abc70	Xtags3.txt	/‚`‚a‚b
++ abc71	Xtags3.txt	/‚`‚a‚b
++ abc72	Xtags3.txt	/‚`‚a‚b
++ abc73	Xtags3.txt	/‚`‚a‚b
++ abc74	Xtags3.txt	/‚`‚a‚b
++ abc75	Xtags3.txt	/‚`‚a‚b
++ abc76	Xtags3.txt	/‚`‚a‚b
++ abc77	Xtags3.txt	/‚`‚a‚b
++ abc78	Xtags3.txt	/‚`‚a‚b
++ abc79	Xtags3.txt	/‚`‚a‚b
++ abc80	Xtags3.txt	/‚`‚a‚b
++ abc81	Xtags3.txt	/‚`‚a‚b
++ abc82	Xtags3.txt	/‚`‚a‚b
++ abc83	Xtags3.txt	/‚`‚a‚b
++ abc84	Xtags3.txt	/‚`‚a‚b
++ abc85	Xtags3.txt	/‚`‚a‚b
++ abc86	Xtags3.txt	/‚`‚a‚b
++ abc87	Xtags3.txt	/‚`‚a‚b
++ abc88	Xtags3.txt	/‚`‚a‚b
++ abc89	Xtags3.txt	/‚`‚a‚b
++ abc90	Xtags3.txt	/‚`‚a‚b
++ abc91	Xtags3.txt	/‚`‚a‚b
++ abc92	Xtags3.txt	/‚`‚a‚b
++ abc93	Xtags3.txt	/‚`‚a‚b
++ abc94	Xtags3.txt	/‚`‚a‚b
++ abc95	Xtags3.txt	/‚`‚a‚b
++ abc96	Xtags3.txt	/‚`‚a‚b
++ abc97	Xtags3.txt	/‚`‚a‚b
++ abc98	Xtags3.txt	/‚`‚a‚b
++ abc99	Xtags3.txt	/‚`‚a‚b
++ abc100	Xtags3.txt	/‚`‚a‚b
+*** ../vim-7.3.335/src/testdir/test83.in	2011-10-12 19:49:38.000000000 +0200
+--- src/testdir/test83.in	2011-10-12 19:40:47.000000000 +0200
+***************
+*** 0 ****
+--- 1,76 ----
++ Tests for tag search with !_TAG_FILE_ENCODING.
++ 
++ STARTTEST
++ :so mbyte.vim
++ :if !has('iconv')
++ : e! test.ok
++ : w! test.out
++ : qa!
++ :endif
++ :set enc=utf8
++ 
++ :/^text for tags1$/,/^text for tags1$/+1w! Xtags1.txt
++ :/^text for tags2$/,/^text for tags2$/+1w! Xtags2.txt
++ :/^text for tags3$/,/^text for tags3$/+1w! Xtags3.txt
++ :/^tags1$/+1,/^tags1-end$/-1w! Xtags1
++ 
++ ggdG
++ 
++ :call setline('.', 'Results of test83')
++ 
++ :" case1:
++ :new
++ :set tags=Xtags1
++ :let v:errmsg = ''
++ :tag abcdefghijklmnopqrs
++ :if v:errmsg =~ 'E426:' || getline('.') != 'abcdefghijklmnopqrs'
++ : close
++ : put ='case1: failed'
++ :else
++ : close
++ : put ='case1: ok'
++ :endif
++ 
++ :" case2:
++ :new
++ :set tags=test83-tags2
++ :let v:errmsg = ''
++ :tag /.BC
++ :if v:errmsg =~ 'E426:' || getline('.') != 'ABC'
++ : close
++ : put ='case2: failed'
++ :else
++ : close
++ : put ='case2: ok'
++ :endif
++ 
++ :" case3:
++ :new
++ :set tags=test83-tags3
++ :let v:errmsg = ''
++ :tag abc50
++ :if v:errmsg =~ 'E426:' || getline('.') != 'ABC'
++ : close
++ : put ='case3: failed'
++ :else
++ : close
++ : put ='case3: ok'
++ :endif
++ :close
++ 
++ :wq! test.out
++ ENDTEST
++ 
++ text for tags1
++ abcdefghijklmnopqrs
++ 
++ text for tags2
++ ABC
++ 
++ text for tags3
++ ABC
++ 
++ tags1
++ !_TAG_FILE_ENCODING	utf-8	//
++ abcdefghijklmnopqrs	Xtags1.txt	/abcdefghijklmnopqrs
++ tags1-end
+*** ../vim-7.3.335/src/testdir/test83.ok	2011-10-12 19:49:38.000000000 +0200
+--- src/testdir/test83.ok	2011-10-12 17:39:03.000000000 +0200
+***************
+*** 0 ****
+--- 1,4 ----
++ Results of test83
++ case1: ok
++ case2: ok
++ case3: ok
+*** ../vim-7.3.335/src/version.c	2011-10-12 16:57:07.000000000 +0200
+--- src/version.c	2011-10-12 19:45:46.000000000 +0200
+***************
+*** 711,712 ****
+--- 711,714 ----
+  {   /* Add new patch number below this line */
++ /**/
++     336,
+  /**/
+
+
+-- 
+hundred-and-one symptoms of being an internet addict:
+62. If your doorbell rings, you think that new mail has arrived.  And then
+    you're disappointed that it's only someone at the door.
+
+ /// Bram Moolenaar -- Bram at Moolenaar.net -- http://www.Moolenaar.net   \\\
+///        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\  an exciting new programming language -- http://www.Zimbu.org        ///
+ \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///


More information about the scm-commits mailing list