diff options
Diffstat (limited to 'src/tag.c')
-rw-r--r-- | src/tag.c | 70 |
1 files changed, 30 insertions, 40 deletions
@@ -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; } } |