diff src/tag.c @ 10611:6bff81438f27 v8.0.0195

patch 8.0.0195: fail to jump to static tag in current file commit https://github.com/vim/vim/commit/a9d23c20879d0dcb289a4db54b3c7df060f87c3c Author: Bram Moolenaar <Bram@vim.org> Date: Mon Jan 16 20:53:34 2017 +0100 patch 8.0.0195: fail to jump to static tag in current file Problem: Jumping to a tag that is a static item in the current file fails. (Kazunobu Kuriyama) Solution: Make sure the first byte of the tag key is not NUL. (Suggested by James McCoy, closes #1387)
author Christian Brabandt <cb@256bit.org>
date Mon, 16 Jan 2017 21:00:04 +0100
parents 1b09db809d3f
children 5ca7e3ec1263
line wrap: on
line diff
--- a/src/tag.c
+++ b/src/tag.c
@@ -44,10 +44,6 @@ typedef struct tag_pointers
 #define MT_GL_CUR	1		/* global match in current file */
 #define MT_GL_OTH	2		/* global match in other file */
 #define MT_ST_OTH	3		/* static match in other file */
-#define MT_IC_ST_CUR	4		/* icase static match in current file */
-#define MT_IC_GL_CUR	5		/* icase global match in current file */
-#define MT_IC_GL_OTH	6		/* icase global match in other file */
-#define MT_IC_ST_OTH	7		/* icase static match in other file */
 #define MT_IC_OFF	4		/* add for icase match */
 #define MT_RE_OFF	8		/* add for regexp match */
 #define MT_MASK		7		/* mask for printing priority */
@@ -2317,7 +2313,7 @@ parse_line:
 			if (tagp.command + 2 < temp_end)
 			{
 			    len = (int)(temp_end - tagp.command - 2);
-			    mfp = (char_u *)alloc((int)sizeof(char_u) + len + 1);
+			    mfp = (char_u *)alloc(len + 2);
 			    if (mfp != NULL)
 				vim_strncpy(mfp, tagp.command + 2, len);
 			}
@@ -2351,6 +2347,7 @@ parse_line:
 		     * Emacs tag: <mtt><tag_fname><0x01><ebuf><0x01><lbuf><NUL>
 		     * other tag: <mtt><tag_fname><0x01><0x01><lbuf><NUL>
 		     * without Emacs tags: <mtt><tag_fname><0x01><lbuf><NUL>
+		     * Here <mtt> is the "mtt" value plus 1 to avoid NUL.
 		     */
 		    len = (int)tag_fname_len + (int)STRLEN(lbuf) + 3;
 #ifdef FEAT_EMACS_TAGS
@@ -2366,7 +2363,7 @@ parse_line:
 		    if (mfp != NULL)
 		    {
 			p = mfp;
-			p[0] = mtt;
+			p[0] = mtt + 1;
 			STRCPY(p + 1, tag_fname);
 #ifdef BACKSLASH_IN_FILENAME
 			/* Ignore differences in slashes, avoid adding
@@ -2548,10 +2545,16 @@ findtag_end:
 		    vim_free(mfp);
 		else
 		{
-		    /* now change the TAG_SEP back to NUL */
-		    for (p = mfp; *p != NUL; ++p)
-			if (*p == TAG_SEP)
-			    *p = NUL;
+		    if (!name_only)
+		    {
+			/* Change mtt back to zero-based. */
+			*mfp = *mfp - 1;
+
+			/* change the TAG_SEP back to NUL */
+			for (p = mfp + 1; *p != NUL; ++p)
+			    if (*p == TAG_SEP)
+				*p = NUL;
+		    }
 		    matches[match_count++] = (char_u *)mfp;
 		}
 		todo--;