]> granicus.if.org Git - vim/commitdiff
updated for version 7.2.443
authorBram Moolenaar <Bram@vim.org>
Sat, 12 Jun 2010 18:12:02 +0000 (20:12 +0200)
committerBram Moolenaar <Bram@vim.org>
Sat, 12 Jun 2010 18:12:02 +0000 (20:12 +0200)
Problem:    Using taglist() on a tag file with duplicate fields generates an
            internal error. (Peter Odding)
Solution:   Check for duplicate field names.

src/eval.c
src/proto/eval.pro
src/tag.c

index 2e5b8766c62dc160900cf6e94fe316c8dec34a0d..10732ccade6effef9b3e5cc5e3d8e39170fa9fdc 100644 (file)
@@ -451,7 +451,6 @@ static dictitem_T *dictitem_copy __ARGS((dictitem_T *org));
 static void dictitem_remove __ARGS((dict_T *dict, dictitem_T *item));
 static dict_T *dict_copy __ARGS((dict_T *orig, int deep, int copyID));
 static long dict_len __ARGS((dict_T *d));
-static dictitem_T *dict_find __ARGS((dict_T *d, char_u *key, int len));
 static char_u *dict2string __ARGS((typval_T *tv, int copyID));
 static int get_dict_tv __ARGS((char_u **arg, typval_T *rettv, int evaluate));
 static char_u *echo_string __ARGS((typval_T *tv, char_u **tofree, char_u *numbuf, int copyID));
@@ -7043,7 +7042,7 @@ dict_len(d)
  * If "len" is negative use strlen(key).
  * Returns NULL when not found.
  */
-    static dictitem_T *
+    dictitem_T *
 dict_find(d, key, len)
     dict_T     *d;
     char_u     *key;
index e817769ede67b2ec530c334b8fd49113926b39b0..6d11d970d7a88ec30cb08a0595e5094c977c4497 100644 (file)
@@ -56,6 +56,7 @@ dictitem_T *dictitem_alloc __ARGS((char_u *key));
 void dictitem_free __ARGS((dictitem_T *item));
 int dict_add __ARGS((dict_T *d, dictitem_T *item));
 int dict_add_nr_str __ARGS((dict_T *d, char *key, long nr, char_u *str));
+dictitem_T *dict_find __ARGS((dict_T *d, char_u *key, int len));
 char_u *get_dict_string __ARGS((dict_T *d, char_u *key, int save));
 long get_dict_number __ARGS((dict_T *d, char_u *key));
 char_u *get_function_name __ARGS((expand_T *xp, int idx));
index ba36de735c5bb0899fdf2f7e8461401ead69d4af..db00c2e1f60b87ae9041ef0e1a97c9e3832566e5 100644 (file)
--- a/src/tag.c
+++ b/src/tag.c
@@ -3771,7 +3771,8 @@ expand_tags(tagnames, pat, num_file, file)
 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"
+ * Add a tag field to the dictionary "dict".
+ * Return OK or FAIL.
  */
     static int
 add_tag_field(dict, field_name, start, end)
@@ -3783,6 +3784,17 @@ add_tag_field(dict, field_name, start, end)
     char_u     buf[MAXPATHL];
     int                len = 0;
 
+    /* check that the field name doesn't exist yet */
+    if (dict_find(dict, (char_u *)field_name, -1) != NULL)
+    {
+       if (p_verbose > 0)
+       {
+           verbose_enter();
+           smsg((char_u *)_("Duplicate field name: %s"), field_name);
+           verbose_leave();
+       }
+       return FAIL;
+    }
     if (start != NULL)
     {
        if (end == NULL)