diff src/tag.c @ 179:7fd70926e2e1 v7.0055

updated for version 7.0055
author vimboss
date Fri, 04 Mar 2005 23:39:37 +0000
parents f529edb9bab3
children 041a413d626d
line wrap: on
line diff
--- a/src/tag.c
+++ b/src/tag.c
@@ -3536,3 +3536,128 @@ expand_tags(tagnames, pat, num_file, fil
     return ret;
 }
 #endif
+
+#if defined(FEAT_EVAL) || defined(PROTO)
+static int add_tag_field __ARGS((dict_T *dict, char *field_name, char_u *start, char_u *end));
+
+/*
+ * Add a tag field to the dictionary "dict"
+ */
+    static int
+add_tag_field(dict, field_name, start, end)
+    dict_T  *dict;
+    char    *field_name;
+    char_u  *start;
+    char_u  *end;
+{
+    char_u	buf[MAXPATHL];
+    int		len;
+
+    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);
+}
+
+/*
+ * Add the tags matching the specified pattern to the list "list"
+ * as a dictionary
+ */
+    int
+get_tags(list, pat)
+    list_T *list;
+    char_u *pat;
+{
+    int		num_matches, i, ret;
+    char_u	**matches, *p;
+    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);
+    if (ret == OK && num_matches > 0)
+    {
+	for (i = 0; i < num_matches; ++i)
+	{
+	    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
+		    || add_tag_field(dict, "cmd", tp.command,
+						       tp.command_end) == FAIL
+		    || add_tag_field(dict, "kind", tp.tagkind,
+						      tp.tagkind_end) == FAIL
+		    || 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;
+				   *p != NUL && *p != '\n' && *p != '\r'; ++p)
+		{
+		    if (p == tp.tagkind || (p + 5 == tp.tagkind
+					      && STRNCMP(p, "kind:", 5) == 0))
+			/* skip "kind:<kind>" and "<kind>" */
+			p = tp.tagkind_end - 1;
+		    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)
+		    {
+			char_u	*s, *n;
+
+			/* Field we recognize, add 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')
+			    ++p;
+			if (add_tag_field(dict,
+				    *n == 's' ? "struct"
+					       : *n == 'e' ? "enum" : "class",
+								s, p) == FAIL)
+			    ret = FAIL;
+			--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;
+		}
+	    }
+
+	    vim_free(matches[i]);
+	}
+	vim_free(matches);
+    }
+    return ret;
+}
+#endif