# HG changeset patch # User Bram Moolenaar # Date 1649082604 -7200 # Node ID 62cc3b60493bfc98c8e3b6e870936d4d5a29517f # Parent 7bc5b23adf8f2441e1616a95139f0865b68b1e28 patch 8.2.4683: verbose check with dict_find() to see if a key is present Commit: https://github.com/vim/vim/commit/4829c1c9e9095a3303caec9af7d02f6547f6df0e Author: Yegappan Lakshmanan Date: Mon Apr 4 15:16:54 2022 +0100 patch 8.2.4683: verbose check with dict_find() to see if a key is present Problem: Verbose check with dict_find() to see if a key is present. Solution: Add dict_has_key(). (Yegappan Lakshmanan, closes https://github.com/vim/vim/issues/10074) diff --git a/src/channel.c b/src/channel.c --- a/src/channel.c +++ b/src/channel.c @@ -4460,8 +4460,7 @@ ch_expr_common(typval_T *argvars, typval } if (argvars[2].v_type == VAR_DICT) - if (dict_find(argvars[2].vval.v_dict, (char_u *)"callback", -1) - != NULL) + if (dict_has_key(argvars[2].vval.v_dict, "callback")) callback_present = TRUE; if (eval || callback_present) @@ -4482,7 +4481,7 @@ ch_expr_common(typval_T *argvars, typval if (di != NULL) id = di->di_tv.vval.v_number; } - if (dict_find(d, (char_u *)"jsonrpc", -1) == NULL) + if (!dict_has_key(d, "jsonrpc")) dict_add_string(d, "jsonrpc", (char_u *)"2.0"); text = json_encode_lsp_msg(&argvars[1]); } diff --git a/src/dict.c b/src/dict.c --- a/src/dict.c +++ b/src/dict.c @@ -649,6 +649,15 @@ dict_find(dict_T *d, char_u *key, int le } /* + * Returns TRUE if "key" is present in Dictionary "d". + */ + int +dict_has_key(dict_T *d, char *key) +{ + return dict_find(d, (char_u *)key, -1) != NULL; +} + +/* * Get a typval_T item from a dictionary and copy it into "rettv". * Returns FAIL if the entry doesn't exist or out of memory. */ @@ -1582,8 +1591,8 @@ f_has_key(typval_T *argvars, typval_T *r if (argvars[0].vval.v_dict == NULL) return; - rettv->vval.v_number = dict_find(argvars[0].vval.v_dict, - tv_get_string(&argvars[1]), -1) != NULL; + rettv->vval.v_number = dict_has_key(argvars[0].vval.v_dict, + (char *)tv_get_string(&argvars[1])); } #endif // defined(FEAT_EVAL) diff --git a/src/evalwindow.c b/src/evalwindow.c --- a/src/evalwindow.c +++ b/src/evalwindow.c @@ -1220,27 +1220,27 @@ f_winrestview(typval_T *argvars, typval_ emsg(_(e_invalid_argument)); else { - if (dict_find(dict, (char_u *)"lnum", -1) != NULL) + if (dict_has_key(dict, "lnum")) curwin->w_cursor.lnum = (linenr_T)dict_get_number(dict, (char_u *)"lnum"); - if (dict_find(dict, (char_u *)"col", -1) != NULL) + if (dict_has_key(dict, "col")) curwin->w_cursor.col = (colnr_T)dict_get_number(dict, (char_u *)"col"); - if (dict_find(dict, (char_u *)"coladd", -1) != NULL) + if (dict_has_key(dict, "coladd")) curwin->w_cursor.coladd = (colnr_T)dict_get_number(dict, (char_u *)"coladd"); - if (dict_find(dict, (char_u *)"curswant", -1) != NULL) + if (dict_has_key(dict, "curswant")) { curwin->w_curswant = (colnr_T)dict_get_number(dict, (char_u *)"curswant"); curwin->w_set_curswant = FALSE; } - if (dict_find(dict, (char_u *)"topline", -1) != NULL) + if (dict_has_key(dict, "topline")) set_topline(curwin, (linenr_T)dict_get_number(dict, (char_u *)"topline")); #ifdef FEAT_DIFF - if (dict_find(dict, (char_u *)"topfill", -1) != NULL) + if (dict_has_key(dict, "topfill")) curwin->w_topfill = (int)dict_get_number(dict, (char_u *)"topfill"); #endif - if (dict_find(dict, (char_u *)"leftcol", -1) != NULL) + if (dict_has_key(dict, "leftcol")) curwin->w_leftcol = (colnr_T)dict_get_number(dict, (char_u *)"leftcol"); - if (dict_find(dict, (char_u *)"skipcol", -1) != NULL) + if (dict_has_key(dict, "skipcol")) curwin->w_skipcol = (colnr_T)dict_get_number(dict, (char_u *)"skipcol"); check_cursor(); diff --git a/src/filepath.c b/src/filepath.c --- a/src/filepath.c +++ b/src/filepath.c @@ -1605,7 +1605,7 @@ readdirex_dict_arg(typval_T *tv, int *cm return FAIL; } - if (dict_find(tv->vval.v_dict, (char_u *)"sort", -1) != NULL) + if (dict_has_key(tv->vval.v_dict, "sort")) compare = dict_get_string(tv->vval.v_dict, (char_u *)"sort", FALSE); else { diff --git a/src/highlight.c b/src/highlight.c --- a/src/highlight.c +++ b/src/highlight.c @@ -718,7 +718,7 @@ highlight_reset_all(void) # ifdef FEAT_BEVAL_TIP gui_init_tooltip_font(); # endif -# if defined(FEAT_MENU) && (defined(FEAT_GUI_ATHENA) || defined(FEAT_GUI_MOTIF)) +# if defined(FEAT_MENU) && defined(FEAT_GUI_MOTIF) gui_init_menu_font(); # endif } @@ -2134,7 +2134,7 @@ hl_do_font( || do_menu # endif # ifdef FEAT_BEVAL_TIP - // In Athena & Motif, the Tooltip highlight group is always a fontset + // In Motif, the Tooltip highlight group is always a fontset || do_tooltip # endif ) @@ -2156,7 +2156,7 @@ hl_do_font( // fontset. Same for the Menu group. if (do_normal) gui_init_font(arg, TRUE); -# if (defined(FEAT_GUI_MOTIF) || defined(FEAT_GUI_ATHENA)) && defined(FEAT_MENU) +# if defined(FEAT_GUI_MOTIF) && defined(FEAT_MENU) if (do_menu) { # ifdef FONTSET_ALWAYS @@ -2170,7 +2170,7 @@ hl_do_font( # ifdef FEAT_BEVAL_GUI if (do_tooltip) { - // The Athena widget set cannot currently handle switching between + // The Athena widget set could not handle switching between // displaying a single font and a fontset. // If the XtNinternational resource is set to True at widget // creation, then a fontset is always used, otherwise an @@ -2194,7 +2194,7 @@ hl_do_font( if (do_normal) gui_init_font(arg, FALSE); #ifndef FONTSET_ALWAYS -# if (defined(FEAT_GUI_MOTIF) || defined(FEAT_GUI_ATHENA)) && defined(FEAT_MENU) +# if defined(FEAT_GUI_MOTIF) && defined(FEAT_MENU) if (do_menu) { gui.menu_font = HL_TABLE()[idx].sg_font; @@ -4411,7 +4411,7 @@ hlg_add_or_update(dict_T *dict) if (dict_get_bool(dict, (char_u *)"default", VVAL_FALSE) == VVAL_TRUE) dodefault = TRUE; - if (dict_find(dict, (char_u *)"cleared", -1) != NULL) + if (dict_has_key(dict, "cleared")) { varnumber_T cleared; @@ -4425,7 +4425,7 @@ hlg_add_or_update(dict_T *dict) } } - if (dict_find(dict, (char_u *)"linksto", -1) != NULL) + if (dict_has_key(dict, "linksto")) { char_u *linksto; diff --git a/src/json.c b/src/json.c --- a/src/json.c +++ b/src/json.c @@ -1027,8 +1027,8 @@ item_end: case JSON_OBJECT: if (cur_item != NULL - && dict_find(top_item->jd_tv.vval.v_dict, - top_item->jd_key, -1) != NULL) + && dict_has_key(top_item->jd_tv.vval.v_dict, + (char *)top_item->jd_key)) { semsg(_(e_duplicate_key_in_json_str), top_item->jd_key); clear_tv(cur_item); diff --git a/src/match.c b/src/match.c --- a/src/match.c +++ b/src/match.c @@ -938,7 +938,7 @@ matchadd_dict_arg(typval_T *tv, char_u * return FAIL; } - if (dict_find(tv->vval.v_dict, (char_u *)"conceal", -1) != NULL) + if (dict_has_key(tv->vval.v_dict, "conceal")) *conceal_char = dict_get_string(tv->vval.v_dict, (char_u *)"conceal", FALSE); @@ -1088,11 +1088,11 @@ f_setmatches(typval_T *argvars UNUSED, t emsg(_(e_invalid_argument)); return; } - if (!(dict_find(d, (char_u *)"group", -1) != NULL - && (dict_find(d, (char_u *)"pattern", -1) != NULL - || dict_find(d, (char_u *)"pos1", -1) != NULL) - && dict_find(d, (char_u *)"priority", -1) != NULL - && dict_find(d, (char_u *)"id", -1) != NULL)) + if (!(dict_has_key(d, "group") + && (dict_has_key(d, "pattern") + || dict_has_key(d, "pos1")) + && dict_has_key(d, "priority") + && dict_has_key(d, "id"))) { emsg(_(e_invalid_argument)); return; @@ -1113,7 +1113,7 @@ f_setmatches(typval_T *argvars UNUSED, t char_u *conceal; d = li->li_tv.vval.v_dict; - if (dict_find(d, (char_u *)"pattern", -1) == NULL) + if (!dict_has_key(d, "pattern")) { if (s == NULL) { @@ -1142,7 +1142,7 @@ f_setmatches(typval_T *argvars UNUSED, t group = dict_get_string(d, (char_u *)"group", TRUE); priority = (int)dict_get_number(d, (char_u *)"priority"); id = (int)dict_get_number(d, (char_u *)"id"); - conceal = dict_find(d, (char_u *)"conceal", -1) != NULL + conceal = dict_has_key(d, "conceal") ? dict_get_string(d, (char_u *)"conceal", TRUE) : NULL; if (i == 0) diff --git a/src/popupwin.c b/src/popupwin.c --- a/src/popupwin.c +++ b/src/popupwin.c @@ -1957,7 +1957,7 @@ popup_create(typval_T *argvars, typval_T if (d != NULL) { - if (dict_find(d, (char_u *)"tabpage", -1) != NULL) + if (dict_has_key(d, "tabpage")) tabnr = (int)dict_get_number(d, (char_u *)"tabpage"); else if (type == TYPE_NOTIFICATION) tabnr = -1; // notifications are global by default diff --git a/src/proto/dict.pro b/src/proto/dict.pro --- a/src/proto/dict.pro +++ b/src/proto/dict.pro @@ -27,6 +27,7 @@ char_u *dict_iterate_next(dict_iterator_ int dict_add_dict(dict_T *d, char *key, dict_T *dict); long dict_len(dict_T *d); dictitem_T *dict_find(dict_T *d, char_u *key, int len); +int dict_has_key(dict_T *d, char *key); int dict_get_tv(dict_T *d, char_u *key, typval_T *rettv); char_u *dict_get_string(dict_T *d, char_u *key, int save); varnumber_T dict_get_number(dict_T *d, char_u *key); diff --git a/src/quickfix.c b/src/quickfix.c --- a/src/quickfix.c +++ b/src/quickfix.c @@ -6859,7 +6859,7 @@ qf_getprop_keys2flags(dict_T *what, int { int flags = QF_GETLIST_NONE; - if (dict_find(what, (char_u *)"all", -1) != NULL) + if (dict_has_key(what, "all")) { flags |= QF_GETLIST_ALL; if (!loclist) @@ -6867,40 +6867,40 @@ qf_getprop_keys2flags(dict_T *what, int flags &= ~ QF_GETLIST_FILEWINID; } - if (dict_find(what, (char_u *)"title", -1) != NULL) + if (dict_has_key(what, "title")) flags |= QF_GETLIST_TITLE; - if (dict_find(what, (char_u *)"nr", -1) != NULL) + if (dict_has_key(what, "nr")) flags |= QF_GETLIST_NR; - if (dict_find(what, (char_u *)"winid", -1) != NULL) + if (dict_has_key(what, "winid")) flags |= QF_GETLIST_WINID; - if (dict_find(what, (char_u *)"context", -1) != NULL) + if (dict_has_key(what, "context")) flags |= QF_GETLIST_CONTEXT; - if (dict_find(what, (char_u *)"id", -1) != NULL) + if (dict_has_key(what, "id")) flags |= QF_GETLIST_ID; - if (dict_find(what, (char_u *)"items", -1) != NULL) + if (dict_has_key(what, "items")) flags |= QF_GETLIST_ITEMS; - if (dict_find(what, (char_u *)"idx", -1) != NULL) + if (dict_has_key(what, "idx")) flags |= QF_GETLIST_IDX; - if (dict_find(what, (char_u *)"size", -1) != NULL) + if (dict_has_key(what, "size")) flags |= QF_GETLIST_SIZE; - if (dict_find(what, (char_u *)"changedtick", -1) != NULL) + if (dict_has_key(what, "changedtick")) flags |= QF_GETLIST_TICK; - if (loclist && dict_find(what, (char_u *)"filewinid", -1) != NULL) + if (loclist && dict_has_key(what, "filewinid")) flags |= QF_GETLIST_FILEWINID; - if (dict_find(what, (char_u *)"qfbufnr", -1) != NULL) + if (dict_has_key(what, "qfbufnr")) flags |= QF_GETLIST_QFBUFNR; - if (dict_find(what, (char_u *)"quickfixtextfunc", -1) != NULL) + if (dict_has_key(what, "quickfixtextfunc")) flags |= QF_GETLIST_QFTF; return flags; @@ -7241,7 +7241,7 @@ qf_add_entry_from_dict( } // If the 'valid' field is present it overrules the detected value. - if ((dict_find(d, (char_u *)"valid", -1)) != NULL) + if (dict_has_key(d, "valid")) valid = (int)dict_get_bool(d, (char_u *)"valid", FALSE); status = qf_add_entry(qfl, diff --git a/src/search.c b/src/search.c --- a/src/search.c +++ b/src/search.c @@ -4878,7 +4878,7 @@ do_fuzzymatch(typval_T *argvars, typval_ return; } } - if (dict_find(d, (char_u *)"matchseq", -1) != NULL) + if (dict_has_key(d, "matchseq")) matchseq = TRUE; } diff --git a/src/sign.c b/src/sign.c --- a/src/sign.c +++ b/src/sign.c @@ -2786,7 +2786,7 @@ sign_unplace_from_dict(typval_T *group_t if (buf == NULL) goto cleanup; } - if (dict_find(dict, (char_u *)"id", -1) != NULL) + if (dict_has_key(dict, "id")) { sign_id = dict_get_number(dict, (char_u *)"id"); if (sign_id <= 0) diff --git a/src/tag.c b/src/tag.c --- a/src/tag.c +++ b/src/tag.c @@ -4313,7 +4313,7 @@ add_tag_field( int retval; // check that the field name doesn't exist yet - if (dict_find(dict, (char_u *)field_name, -1) != NULL) + if (dict_has_key(dict, field_name)) { if (p_verbose > 0) { diff --git a/src/terminal.c b/src/terminal.c --- a/src/terminal.c +++ b/src/terminal.c @@ -4311,13 +4311,13 @@ handle_drop_command(listitem_T *item) if (p != NULL) get_bad_opt(p, &ea); - if (dict_find(dict, (char_u *)"bin", -1) != NULL) + if (dict_has_key(dict, "bin")) ea.force_bin = FORCE_BIN; - if (dict_find(dict, (char_u *)"binary", -1) != NULL) + if (dict_has_key(dict, "binary")) ea.force_bin = FORCE_BIN; - if (dict_find(dict, (char_u *)"nobin", -1) != NULL) + if (dict_has_key(dict, "nobin")) ea.force_bin = FORCE_NOBIN; - if (dict_find(dict, (char_u *)"nobinary", -1) != NULL) + if (dict_has_key(dict, "nobinary")) ea.force_bin = FORCE_NOBIN; } diff --git a/src/testing.c b/src/testing.c --- a/src/testing.c +++ b/src/testing.c @@ -1285,10 +1285,10 @@ test_gui_drop_files(dict_T *args UNUSED) list_T *l; listitem_T *li; - if (dict_find(args, (char_u *)"files", -1) == NULL - || dict_find(args, (char_u *)"row", -1) == NULL - || dict_find(args, (char_u *)"col", -1) == NULL - || dict_find(args, (char_u *)"modifiers", -1) == NULL) + if (!dict_has_key(args, "files") + || !dict_has_key(args, "row") + || !dict_has_key(args, "col") + || !dict_has_key(args, "modifiers")) return FALSE; (void)dict_get_tv(args, (char_u *)"files", &t); @@ -1341,10 +1341,10 @@ test_gui_find_repl(dict_T *args) int forward; int retval; - if (dict_find(args, (char_u *)"find_text", -1) == NULL - || dict_find(args, (char_u *)"repl_text", -1) == NULL - || dict_find(args, (char_u *)"flags", -1) == NULL - || dict_find(args, (char_u *)"forward", -1) == NULL) + if (!dict_has_key(args, "find_text") + || !dict_has_key(args, "repl_text") + || !dict_has_key(args, "flags") + || !dict_has_key(args, "forward")) return FALSE; find_text = dict_get_string(args, (char_u *)"find_text", TRUE); @@ -1370,16 +1370,16 @@ test_gui_mouse_event(dict_T *args) int_u mods; int move; - if (dict_find(args, (char_u *)"row", -1) == NULL - || dict_find(args, (char_u *)"col", -1) == NULL) + if (!dict_has_key(args, "row") + || !dict_has_key(args, "col")) return FALSE; // Note: "move" is optional, requires fewer arguments move = (int)dict_get_bool(args, (char_u *)"move", FALSE); - if (!move && (dict_find(args, (char_u *)"button", -1) == NULL - || dict_find(args, (char_u *)"multiclick", -1) == NULL - || dict_find(args, (char_u *)"modifiers", -1) == NULL)) + if (!move && (!dict_has_key(args, "button") + || !dict_has_key(args, "multiclick") + || !dict_has_key(args, "modifiers"))) return FALSE; row = (int)dict_get_number(args, (char_u *)"row"); @@ -1408,9 +1408,9 @@ test_gui_scrollbar(dict_T *args) int dragging; scrollbar_T *sb = NULL; - if (dict_find(args, (char_u *)"which", -1) == NULL - || dict_find(args, (char_u *)"value", -1) == NULL - || dict_find(args, (char_u *)"dragging", -1) == NULL) + if (!dict_has_key(args, "which") + || !dict_has_key(args, "value") + || !dict_has_key(args, "dragging")) return FALSE; which = dict_get_string(args, (char_u *)"which", FALSE); @@ -1443,7 +1443,7 @@ test_gui_tabline_event(dict_T *args UNUS # ifdef FEAT_GUI_TABLINE int tabnr; - if (dict_find(args, (char_u *)"tabnr", -1) == NULL) + if (!dict_has_key(args, "tabnr")) return FALSE; tabnr = (int)dict_get_number(args, (char_u *)"tabnr"); @@ -1461,8 +1461,8 @@ test_gui_tabmenu_event(dict_T *args UNUS int tabnr; int item; - if (dict_find(args, (char_u *)"tabnr", -1) == NULL - || dict_find(args, (char_u *)"item", -1) == NULL) + if (!dict_has_key(args, "tabnr") + || !dict_has_key(args, "item")) return FALSE; tabnr = (int)dict_get_number(args, (char_u *)"tabnr"); diff --git a/src/textprop.c b/src/textprop.c --- a/src/textprop.c +++ b/src/textprop.c @@ -331,14 +331,14 @@ f_prop_add_list(typval_T *argvars, typva } dict = argvars[0].vval.v_dict; - if (dict == NULL || dict_find(dict, (char_u *)"type", -1) == NULL) + if (dict == NULL || !dict_has_key(dict, "type")) { emsg(_(e_missing_property_type_name)); return; } type_name = dict_get_string(dict, (char_u *)"type", FALSE); - if (dict_find(dict, (char_u *)"id", -1) != NULL) + if (dict_has_key(dict, "id")) id = dict_get_number(dict, (char_u *)"id"); if (get_bufnr_from_arg(&argvars[0], &buf) == FAIL) @@ -391,14 +391,14 @@ prop_add_common( buf_T *buf = default_buf; int id = 0; - if (dict == NULL || dict_find(dict, (char_u *)"type", -1) == NULL) + if (dict == NULL || !dict_has_key(dict, "type")) { emsg(_(e_missing_property_type_name)); return; } type_name = dict_get_string(dict, (char_u *)"type", FALSE); - if (dict_find(dict, (char_u *)"end_lnum", -1) != NULL) + if (dict_has_key(dict, "end_lnum")) { end_lnum = dict_get_number(dict, (char_u *)"end_lnum"); if (end_lnum < start_lnum) @@ -410,7 +410,7 @@ prop_add_common( else end_lnum = start_lnum; - if (dict_find(dict, (char_u *)"length", -1) != NULL) + if (dict_has_key(dict, "length")) { long length = dict_get_number(dict, (char_u *)"length"); @@ -421,7 +421,7 @@ prop_add_common( } end_col = start_col + length; } - else if (dict_find(dict, (char_u *)"end_col", -1) != NULL) + else if (dict_has_key(dict, "end_col")) { end_col = dict_get_number(dict, (char_u *)"end_col"); if (end_col <= 0) @@ -435,7 +435,7 @@ prop_add_common( else end_col = 1; - if (dict_find(dict, (char_u *)"id", -1) != NULL) + if (dict_has_key(dict, "id")) id = dict_get_number(dict, (char_u *)"id"); if (dict_arg != NULL && get_bufnr_from_arg(dict_arg, &buf) == FAIL) @@ -777,12 +777,12 @@ f_prop_find(typval_T *argvars, typval_T skipstart = dict_get_bool(dict, (char_u *)"skipstart", 0); - if (dict_find(dict, (char_u *)"id", -1) != NULL) + if (dict_has_key(dict, "id")) { id = dict_get_number(dict, (char_u *)"id"); id_found = TRUE; } - if (dict_find(dict, (char_u *)"type", -1)) + if (dict_has_key(dict, "type")) { char_u *name = dict_get_string(dict, (char_u *)"type", FALSE); proptype_T *type = lookup_prop_type(name, buf); @@ -1202,9 +1202,9 @@ f_prop_remove(typval_T *argvars, typval_ do_all = dict_get_bool(dict, (char_u *)"all", FALSE); - if (dict_find(dict, (char_u *)"id", -1) != NULL) + if (dict_has_key(dict, "id")) id = dict_get_number(dict, (char_u *)"id"); - if (dict_find(dict, (char_u *)"type", -1)) + if (dict_has_key(dict, "type")) { char_u *name = dict_get_string(dict, (char_u *)"type", FALSE); proptype_T *type = lookup_prop_type(name, buf); diff --git a/src/time.c b/src/time.c --- a/src/time.c +++ b/src/time.c @@ -848,7 +848,7 @@ f_timer_start(typval_T *argvars, typval_ semsg(_(e_invalid_argument_str), tv_get_string(&argvars[2])); return; } - if (dict_find(dict, (char_u *)"repeat", -1) != NULL) + if (dict_has_key(dict, "repeat")) repeat = dict_get_number(dict, (char_u *)"repeat"); } diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -751,6 +751,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 4683, +/**/ 4682, /**/ 4681,