diff options
author | Bram Moolenaar <Bram@vim.org> | 2010-06-12 20:12:02 +0200 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2010-06-12 20:12:02 +0200 |
commit | 9ea339d58ce32534b8661626a31aaa014abef0a6 (patch) | |
tree | 482a58440db42a17ca5c9d2ecb07ba54b2233d69 | |
parent | f949563afa7af5d6a7aa75b26fc8347b51eb6a49 (diff) | |
download | vim-git-9ea339d58ce32534b8661626a31aaa014abef0a6.tar.gz |
updated for version 7.2.443v7.2.443
Problem: Using taglist() on a tag file with duplicate fields generates an
internal error. (Peter Odding)
Solution: Check for duplicate field names.
-rw-r--r-- | src/eval.c | 3 | ||||
-rw-r--r-- | src/proto/eval.pro | 1 | ||||
-rw-r--r-- | src/tag.c | 14 | ||||
-rw-r--r-- | src/version.c | 2 |
4 files changed, 17 insertions, 3 deletions
diff --git a/src/eval.c b/src/eval.c index 1114c95f7..32e3d2038 100644 --- a/src/eval.c +++ b/src/eval.c @@ -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)); @@ -7012,7 +7011,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; diff --git a/src/proto/eval.pro b/src/proto/eval.pro index e817769ed..6d11d970d 100644 --- a/src/proto/eval.pro +++ b/src/proto/eval.pro @@ -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)); @@ -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) diff --git a/src/version.c b/src/version.c index 856230a5d..89adc48c5 100644 --- a/src/version.c +++ b/src/version.c @@ -682,6 +682,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 443, +/**/ 442, /**/ 441, |