summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2017-01-16 20:53:34 +0100
committerBram Moolenaar <Bram@vim.org>2017-01-16 20:53:34 +0100
commita9d23c20879d0dcb289a4db54b3c7df060f87c3c (patch)
tree789ed779f83e0fc11e8f3ab8fc1835b6dfda752a
parente32bbded641a5da0263ecf82f9ccc95a8e0a089e (diff)
patch 8.0.0195: fail to jump to static tag in current filev8.0.0195
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)
-rw-r--r--src/tag.c23
-rw-r--r--src/testdir/test_tagjump.vim18
-rw-r--r--src/version.c2
3 files changed, 33 insertions, 10 deletions
diff --git a/src/tag.c b/src/tag.c
index 94b5e2b68a..a80a362df3 100644
--- 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--;
diff --git a/src/testdir/test_tagjump.vim b/src/testdir/test_tagjump.vim
index 11ec144f63..221514db2c 100644
--- a/src/testdir/test_tagjump.vim
+++ b/src/testdir/test_tagjump.vim
@@ -23,6 +23,24 @@ func Test_cancel_ptjump()
quit
endfunc
+func Test_static_tagjump()
+ set tags=Xtags
+ call writefile(["!_TAG_FILE_ENCODING\tutf-8\t//",
+ \ "one\tXfile1\t/^one/;\"\tf\tfile:\tsignature:(void)",
+ \ "word\tXfile2\tcmd2"],
+ \ 'Xtags')
+ new Xfile1
+ call setline(1, ['empty', 'one()', 'empty'])
+ write
+ tag one
+ call assert_equal(2, line('.'))
+
+ set tags&
+ call delete('Xtags')
+ call delete('Xfile1')
+ bwipe!
+endfunc
+
" Tests for [ CTRL-I and CTRL-W CTRL-I commands
function Test_keyword_jump()
call writefile(["#include Xinclude", "",
diff --git a/src/version.c b/src/version.c
index cfb4e5969f..28c677696a 100644
--- a/src/version.c
+++ b/src/version.c
@@ -765,6 +765,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 195,
+/**/
194,
/**/
193,