summaryrefslogtreecommitdiffstats
path: root/src/tag.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/tag.c')
-rw-r--r--src/tag.c70
1 files changed, 30 insertions, 40 deletions
diff --git a/src/tag.c b/src/tag.c
index e2c5238b3f..0822875967 100644
--- a/src/tag.c
+++ b/src/tag.c
@@ -3551,12 +3551,15 @@ add_tag_field(dict, field_name, start, end)
char_u *end;
{
char_u buf[MAXPATHL];
- int len;
+ int len = 0;
- len = end - start;
- if (len > sizeof(buf) - 1)
- len = sizeof(buf) - 1;
- STRNCPY(buf, start, len);
+ if (start != NULL)
+ {
+ len = end - start;
+ if (len > sizeof(buf) - 1)
+ len = sizeof(buf) - 1;
+ STRNCPY(buf, start, len);
+ }
buf[len] = NUL;
return dict_add_nr_str(dict, field_name, 0L, buf);
}
@@ -3575,8 +3578,6 @@ get_tags(list, pat)
dict_T *dict;
tagptrs_T tp;
long is_static;
- char_u buf[200];
- char_u *bp;
ret = find_tags(pat, &num_matches, &matches,
TAG_REGEXP | TAG_NOIC, (int)MAXCOL, NULL);
@@ -3584,14 +3585,18 @@ get_tags(list, pat)
{
for (i = 0; i < num_matches; ++i)
{
+ parse_match(matches[i], &tp);
+ is_static = test_for_static(&tp);
+
+ /* Skip pseudo-tag lines. */
+ if (STRNCMP(tp.tagname, "!_TAG_", 6) == 0)
+ continue;
+
if ((dict = dict_alloc()) == NULL)
ret = FAIL;
if (list_append_dict(list, dict) == FAIL)
ret = FAIL;
- parse_match(matches[i], &tp);
- is_static = test_for_static(&tp);
-
if (add_tag_field(dict, "name", tp.tagname, tp.tagname_end) == FAIL
|| add_tag_field(dict, "filename", tp.fname,
tp.fname_end) == FAIL
@@ -3602,8 +3607,6 @@ get_tags(list, pat)
|| dict_add_nr_str(dict, "static", is_static, NULL) == FAIL)
ret = FAIL;
- bp = buf;
-
if (tp.command_end != NULL)
{
for (p = tp.command_end + 3;
@@ -3616,41 +3619,28 @@ get_tags(list, pat)
else if (STRNCMP(p, "file:", 5) == 0)
/* skip "file:" (static tag) */
p += 4;
- else if (STRNCMP(p, "struct:", 7) == 0
- || STRNCMP(p, "enum:", 5) == 0
- || STRNCMP(p, "class:", 6) == 0)
+ else if (!vim_iswhite(*p))
{
char_u *s, *n;
+ int len;
- /* Field we recognize, add as a dict entry. */
+ /* Add extra field as a dict entry. */
n = p;
- if (*n == 's')
- p += 7;
- else if (*n == 'e')
- p += 5;
- else
- p += 6;
- s = p;
- while (*p != NUL && *p != '\n' && *p != '\r')
+ while (*p != NUL && *p > ' ' && *p < 127 && *p != ':')
++p;
- if (add_tag_field(dict,
- *n == 's' ? "struct"
- : *n == 'e' ? "enum" : "class",
- s, p) == FAIL)
- ret = FAIL;
+ len = p - n;
+ if (*p == ':' && len > 0)
+ {
+ s = ++p;
+ while (*p != NUL && *p > ' ' && *p < 127)
+ ++p;
+ n[len] = NUL;
+ if (add_tag_field(dict, (char *)n, s, p) == FAIL)
+ ret = FAIL;
+ n[len] = ':';
+ }
--p;
}
- else if ((bp - buf) < sizeof(buf) - 1
- && (bp > buf || !vim_iswhite(*p)))
- /* Field not recognized, add to "extra" dict entry. */
- *bp++ = *p;
- }
-
- if (bp > buf)
- {
- *bp = NUL;
- if (dict_add_nr_str(dict, "extra", 0L, buf) == FAIL)
- ret = FAIL;
}
}