To: vim_dev@googlegroups.com Subject: Patch 9.0.1221 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 9.0.1221 Problem: Code is indented more than necessary. Solution: Use an early return where it makes sense. (Yegappan Lakshmanan, closes #11833) Files: src/popupmenu.c, src/popupwin.c, src/profiler.c, src/quickfix.c, src/regexp.c, src/regexp_bt.c, src/regexp_nfa.c, src/register.c *** ../vim-9.0.1220/src/popupmenu.c 2022-08-26 16:58:46.139489368 +0100 --- src/popupmenu.c 2023-01-18 18:14:09.152963086 +0000 *************** *** 1367,1379 **** void ui_remove_balloon(void) { ! if (balloon_array != NULL) ! { ! pum_undisplay(); ! while (balloon_arraysize > 0) ! vim_free(balloon_array[--balloon_arraysize].pum_text); ! VIM_CLEAR(balloon_array); ! } } /* --- 1367,1379 ---- void ui_remove_balloon(void) { ! if (balloon_array == NULL) ! return; ! ! pum_undisplay(); ! while (balloon_arraysize > 0) ! vim_free(balloon_array[--balloon_arraysize].pum_text); ! VIM_CLEAR(balloon_array); } /* *************** *** 1410,1428 **** else balloon_arraysize = split_message(mesg, &balloon_array); ! if (balloon_arraysize > 0) ! { ! pum_array = balloon_array; ! pum_size = balloon_arraysize; ! pum_compute_size(); ! pum_scrollbar = 0; ! pum_height = balloon_arraysize; ! ! pum_position_at_mouse(BALLOON_MIN_WIDTH); ! pum_selected = -1; ! pum_first = 0; ! pum_redraw(); ! } } /* --- 1410,1428 ---- else balloon_arraysize = split_message(mesg, &balloon_array); ! if (balloon_arraysize <= 0) ! return; ! ! pum_array = balloon_array; ! pum_size = balloon_arraysize; ! pum_compute_size(); ! pum_scrollbar = 0; ! pum_height = balloon_arraysize; ! ! pum_position_at_mouse(BALLOON_MIN_WIDTH); ! pum_selected = -1; ! pum_first = 0; ! pum_redraw(); } /* *** ../vim-9.0.1220/src/popupwin.c 2022-12-02 15:58:34.606705475 +0000 --- src/popupwin.c 2023-01-18 18:14:09.152963086 +0000 *************** *** 98,128 **** dictitem_T *di; di = dict_find(dict, (char_u *)name, -1); ! if (di != NULL) { ! if (di->di_tv.v_type != VAR_LIST) ! emsg(_(e_list_required)); ! else ! { ! list_T *list = di->di_tv.vval.v_list; ! listitem_T *li; ! int i; ! int nr; ! for (i = 0; i < 4; ++i) ! array[i] = 1; ! if (list != NULL) ! { ! CHECK_LIST_MATERIALIZE(list); ! for (i = 0, li = list->lv_first; i < 4 && i < list->lv_len; ! ++i, li = li->li_next) ! { ! nr = (int)tv_get_number(&li->li_tv); ! if (nr >= 0) ! array[i] = nr > max_val ? max_val : nr; ! } ! } ! } } } --- 98,129 ---- dictitem_T *di; di = dict_find(dict, (char_u *)name, -1); ! if (di == NULL) ! return; ! ! if (di->di_tv.v_type != VAR_LIST) { ! emsg(_(e_list_required)); ! return; ! } ! list_T *list = di->di_tv.vval.v_list; ! listitem_T *li; ! int i; ! int nr; ! ! for (i = 0; i < 4; ++i) ! array[i] = 1; ! if (list == NULL) ! return; ! ! CHECK_LIST_MATERIALIZE(list); ! for (i = 0, li = list->lv_first; i < 4 && i < list->lv_len; ! ++i, li = li->li_next) ! { ! nr = (int)tv_get_number(&li->li_tv); ! if (nr >= 0) ! array[i] = nr > max_val ? max_val : nr; } } *************** *** 147,157 **** char_u *ptr; int len = find_ident_under_cursor(&ptr, flags | FIND_NOERROR); ! if (len > 0) ! { ! wp->w_popup_mincol = (int)(ptr - ml_get_curline()); ! wp->w_popup_maxcol = wp->w_popup_mincol + len - 1; ! } } /* --- 148,158 ---- char_u *ptr; int len = find_ident_under_cursor(&ptr, flags | FIND_NOERROR); ! if (len <= 0) ! return; ! ! wp->w_popup_mincol = (int)(ptr - ml_get_curline()); ! wp->w_popup_maxcol = wp->w_popup_mincol + len - 1; } /* *************** *** 169,191 **** update_popup_uses_mouse_move(void) { popup_uses_mouse_move = FALSE; ! if (popup_visible) ! { ! win_T *wp; ! FOR_ALL_POPUPWINS(wp) ! if (wp->w_popup_mouse_row != 0) ! { ! popup_uses_mouse_move = TRUE; ! return; ! } ! FOR_ALL_POPUPWINS_IN_TAB(curtab, wp) ! if (wp->w_popup_mouse_row != 0) ! { ! popup_uses_mouse_move = TRUE; ! return; ! } ! } } /* --- 170,192 ---- update_popup_uses_mouse_move(void) { popup_uses_mouse_move = FALSE; ! if (!popup_visible) ! return; ! win_T *wp; ! ! FOR_ALL_POPUPWINS(wp) ! if (wp->w_popup_mouse_row != 0) ! { ! popup_uses_mouse_move = TRUE; ! return; ! } ! FOR_ALL_POPUPWINS_IN_TAB(curtab, wp) ! if (wp->w_popup_mouse_row != 0) ! { ! popup_uses_mouse_move = TRUE; ! return; ! } } /* *************** *** 201,219 **** colnr_T mcol; if (find_word_under_cursor(mouse_row, mouse_col, TRUE, flags, ! &textwp, &pos.lnum, &text, NULL, &col) == OK) ! { ! // convert text column to mouse column ! pos.col = col; ! pos.coladd = 0; ! getvcol(textwp, &pos, &mcol, NULL, NULL); ! wp->w_popup_mouse_mincol = mcol; ! ! pos.col = col + (colnr_T)STRLEN(text) - 1; ! getvcol(textwp, &pos, NULL, NULL, &mcol); ! wp->w_popup_mouse_maxcol = mcol; ! vim_free(text); ! } } /* --- 202,220 ---- colnr_T mcol; if (find_word_under_cursor(mouse_row, mouse_col, TRUE, flags, ! &textwp, &pos.lnum, &text, NULL, &col) != OK) ! return; ! ! // convert text column to mouse column ! pos.col = col; ! pos.coladd = 0; ! getvcol(textwp, &pos, &mcol, NULL, NULL); ! wp->w_popup_mouse_mincol = mcol; ! ! pos.col = col + (colnr_T)STRLEN(text) - 1; ! getvcol(textwp, &pos, NULL, NULL, &mcol); ! wp->w_popup_mouse_maxcol = mcol; ! vim_free(text); } /* *************** *** 390,429 **** void popup_handle_scrollbar_click(win_T *wp, int row, int col) { ! if (popup_is_in_scrollbar(wp, row, col)) { ! int height = popup_height(wp); ! int new_topline = wp->w_topline; ! if (row >= height / 2) { ! // Click in lower half, scroll down. ! if (wp->w_topline < wp->w_buffer->b_ml.ml_line_count) ! ++new_topline; } ! else if (wp->w_topline > 1) ! // click on upper half, scroll up. ! --new_topline; ! if (new_topline != wp->w_topline) { ! set_topline(wp, new_topline); ! if (wp == curwin) ! { ! if (wp->w_cursor.lnum < wp->w_topline) ! { ! wp->w_cursor.lnum = wp->w_topline; ! check_cursor(); ! } ! else if (wp->w_cursor.lnum >= wp->w_botline) ! { ! wp->w_cursor.lnum = wp->w_botline - 1; ! check_cursor(); ! } ! } ! popup_set_firstline(wp); ! redraw_win_later(wp, UPD_NOT_VALID); } } } #if defined(FEAT_TIMERS) --- 391,431 ---- void popup_handle_scrollbar_click(win_T *wp, int row, int col) { ! if (!popup_is_in_scrollbar(wp, row, col)) ! return; ! ! int height = popup_height(wp); ! int new_topline = wp->w_topline; ! ! if (row >= height / 2) { ! // Click in lower half, scroll down. ! if (wp->w_topline < wp->w_buffer->b_ml.ml_line_count) ! ++new_topline; ! } ! else if (wp->w_topline > 1) ! // click on upper half, scroll up. ! --new_topline; ! ! if (new_topline == wp->w_topline) ! return; ! set_topline(wp, new_topline); ! if (wp == curwin) ! { ! if (wp->w_cursor.lnum < wp->w_topline) { ! wp->w_cursor.lnum = wp->w_topline; ! check_cursor(); } ! else if (wp->w_cursor.lnum >= wp->w_botline) { ! wp->w_cursor.lnum = wp->w_botline - 1; ! check_cursor(); } } + popup_set_firstline(wp); + redraw_win_later(wp, UPD_NOT_VALID); } #if defined(FEAT_TIMERS) *************** *** 441,458 **** vim_snprintf((char *)cbbuf, sizeof(cbbuf), close ? "(_) => popup_close(%d)" : "(_) => popup_hide(%d)", wp->w_id); ! if (get_lambda_tv_and_compile(&ptr, &tv, FALSE, &EVALARG_EVALUATE) == OK) { ! wp->w_popup_timer = create_timer(time, 0); ! callback_T cb = get_callback(&tv); ! if (cb.cb_name != NULL && !cb.cb_free_name) ! { ! cb.cb_name = vim_strsave(cb.cb_name); ! cb.cb_free_name = TRUE; ! } ! wp->w_popup_timer->tr_callback = cb; ! clear_tv(&tv); } } #endif --- 443,460 ---- vim_snprintf((char *)cbbuf, sizeof(cbbuf), close ? "(_) => popup_close(%d)" : "(_) => popup_hide(%d)", wp->w_id); ! if (get_lambda_tv_and_compile(&ptr, &tv, FALSE, &EVALARG_EVALUATE) != OK) ! return; ! ! wp->w_popup_timer = create_timer(time, 0); ! callback_T cb = get_callback(&tv); ! if (cb.cb_name != NULL && !cb.cb_free_name) { ! cb.cb_name = vim_strsave(cb.cb_name); ! cb.cb_free_name = TRUE; } + wp->w_popup_timer->tr_callback = cb; + clear_tv(&tv); } #endif *************** *** 619,634 **** char_u *str; di = dict_find(dict, (char_u *)name, -1); ! if (di != NULL) { ! if (di->di_tv.v_type != VAR_STRING) ! semsg(_(e_invalid_value_for_argument_str), name); ! else ! { ! str = tv_get_string(&di->di_tv); ! if (*str != NUL) ! *pval = vim_strsave(str); ! } } } --- 621,636 ---- char_u *str; di = dict_find(dict, (char_u *)name, -1); ! if (di == NULL) ! return; ! ! if (di->di_tv.v_type != VAR_STRING) ! semsg(_(e_invalid_value_for_argument_str), name); ! else { ! str = tv_get_string(&di->di_tv); ! if (*str != NUL) ! *pval = vim_strsave(str); } } *************** *** 990,1007 **** } di = dict_find(dict, (char_u *)"callback", -1); ! if (di != NULL) ! { ! callback_T callback = get_callback(&di->di_tv); ! if (callback.cb_name != NULL) ! { ! free_callback(&wp->w_close_cb); ! set_callback(&wp->w_close_cb, &callback); ! if (callback.cb_free_name) ! vim_free(callback.cb_name); ! } ! } } /* --- 992,1008 ---- } di = dict_find(dict, (char_u *)"callback", -1); ! if (di == NULL) ! return; ! callback_T callback = get_callback(&di->di_tv); ! if (callback.cb_name == NULL) ! return; ! ! free_callback(&wp->w_close_cb); ! set_callback(&wp->w_close_cb, &callback); ! if (callback.cb_free_name) ! vim_free(callback.cb_name); } /* *************** *** 2715,2727 **** if (error_if_term_popup_window()) return; #endif ! if ((wp->w_popup_flags & POPF_HIDDEN) == 0) ! { ! wp->w_popup_flags |= POPF_HIDDEN; ! // Do not decrement b_nwindows, we still reference the buffer. ! redraw_all_later(UPD_NOT_VALID); ! popup_mask_refresh = TRUE; ! } } /* --- 2716,2728 ---- if (error_if_term_popup_window()) return; #endif ! if ((wp->w_popup_flags & POPF_HIDDEN) != 0) ! return; ! ! wp->w_popup_flags |= POPF_HIDDEN; ! // Do not decrement b_nwindows, we still reference the buffer. ! redraw_all_later(UPD_NOT_VALID); ! popup_mask_refresh = TRUE; } /* *************** *** 2738,2759 **** id = (int)tv_get_number(argvars); wp = find_popup_win(id); ! if (wp != NULL) ! { ! popup_hide(wp); ! wp->w_popup_flags |= POPF_HIDDEN_FORCE; ! } } void popup_show(win_T *wp) { ! if ((wp->w_popup_flags & POPF_HIDDEN) != 0) ! { ! wp->w_popup_flags &= ~POPF_HIDDEN; ! redraw_all_later(UPD_NOT_VALID); ! popup_mask_refresh = TRUE; ! } } /* --- 2739,2760 ---- id = (int)tv_get_number(argvars); wp = find_popup_win(id); ! if (wp == NULL) ! return; ! ! popup_hide(wp); ! wp->w_popup_flags |= POPF_HIDDEN_FORCE; } void popup_show(win_T *wp) { ! if ((wp->w_popup_flags & POPF_HIDDEN) == 0) ! return; ! ! wp->w_popup_flags &= ~POPF_HIDDEN; ! redraw_all_later(UPD_NOT_VALID); ! popup_mask_refresh = TRUE; } /* *************** *** 2770,2784 **** id = (int)tv_get_number(argvars); wp = find_popup_win(id); ! if (wp != NULL) ! { ! wp->w_popup_flags &= ~POPF_HIDDEN_FORCE; ! popup_show(wp); #ifdef FEAT_QUICKFIX ! if (wp->w_popup_flags & POPF_INFO) ! pum_position_info_popup(wp); #endif - } } /* --- 2771,2785 ---- id = (int)tv_get_number(argvars); wp = find_popup_win(id); ! if (wp == NULL) ! return; ! ! wp->w_popup_flags &= ~POPF_HIDDEN_FORCE; ! popup_show(wp); #ifdef FEAT_QUICKFIX ! if (wp->w_popup_flags & POPF_INFO) ! pum_position_info_popup(wp); #endif } /* *************** *** 2797,2811 **** id = (int)tv_get_number(&argvars[0]); wp = find_popup_win(id); ! if (wp != NULL) ! { ! if (check_for_string_or_list_arg(argvars, 1) != FAIL) ! { ! popup_set_buffer_text(wp->w_buffer, argvars[1]); ! redraw_win_later(wp, UPD_NOT_VALID); ! popup_adjust_position(wp); ! } ! } } static void --- 2798,2812 ---- id = (int)tv_get_number(&argvars[0]); wp = find_popup_win(id); ! if (wp == NULL) ! return; ! ! if (check_for_string_or_list_arg(argvars, 1) == FAIL) ! return; ! ! popup_set_buffer_text(wp->w_buffer, argvars[1]); ! redraw_win_later(wp, UPD_NOT_VALID); ! popup_adjust_position(wp); } static void *************** *** 3011,3052 **** int top_extra; int left_extra; ! if (rettv_dict_alloc(rettv) == OK) ! { ! if (in_vim9script() && check_for_number_arg(argvars, 0) == FAIL) ! return; ! id = (int)tv_get_number(argvars); ! wp = find_popup_win(id); ! if (wp == NULL) ! return; // invalid {id} ! top_extra = popup_top_extra(wp); ! left_extra = wp->w_popup_border[3] + wp->w_popup_padding[3]; ! ! // we know how much space we need, avoid resizing halfway ! dict = rettv->vval.v_dict; ! hash_lock_size(&dict->dv_hashtab, 11); ! ! dict_add_number(dict, "line", wp->w_winrow + 1); ! dict_add_number(dict, "col", wp->w_wincol + 1); ! dict_add_number(dict, "width", wp->w_width + left_extra ! + wp->w_popup_border[1] + wp->w_popup_padding[1]); ! dict_add_number(dict, "height", wp->w_height + top_extra ! + wp->w_popup_border[2] + wp->w_popup_padding[2]); ! ! dict_add_number(dict, "core_line", wp->w_winrow + 1 + top_extra); ! dict_add_number(dict, "core_col", wp->w_wincol + 1 + left_extra); ! dict_add_number(dict, "core_width", wp->w_width); ! dict_add_number(dict, "core_height", wp->w_height); ! ! dict_add_number(dict, "scrollbar", wp->w_has_scrollbar); ! dict_add_number(dict, "firstline", wp->w_topline); ! dict_add_number(dict, "lastline", wp->w_botline - 1); ! dict_add_number(dict, "visible", ! win_valid(wp) && (wp->w_popup_flags & POPF_HIDDEN) == 0); ! hash_unlock(&dict->dv_hashtab); ! } } /* --- 3012,3053 ---- int top_extra; int left_extra; ! if (rettv_dict_alloc(rettv) == FAIL) ! return; ! if (in_vim9script() && check_for_number_arg(argvars, 0) == FAIL) ! return; ! id = (int)tv_get_number(argvars); ! wp = find_popup_win(id); ! if (wp == NULL) ! return; // invalid {id} ! top_extra = popup_top_extra(wp); ! left_extra = wp->w_popup_border[3] + wp->w_popup_padding[3]; ! ! // we know how much space we need, avoid resizing halfway ! dict = rettv->vval.v_dict; ! hash_lock_size(&dict->dv_hashtab, 11); ! ! dict_add_number(dict, "line", wp->w_winrow + 1); ! dict_add_number(dict, "col", wp->w_wincol + 1); ! dict_add_number(dict, "width", wp->w_width + left_extra ! + wp->w_popup_border[1] + wp->w_popup_padding[1]); ! dict_add_number(dict, "height", wp->w_height + top_extra ! + wp->w_popup_border[2] + wp->w_popup_padding[2]); ! ! dict_add_number(dict, "core_line", wp->w_winrow + 1 + top_extra); ! dict_add_number(dict, "core_col", wp->w_wincol + 1 + left_extra); ! dict_add_number(dict, "core_width", wp->w_width); ! dict_add_number(dict, "core_height", wp->w_height); ! ! dict_add_number(dict, "scrollbar", wp->w_has_scrollbar); ! dict_add_number(dict, "firstline", wp->w_topline); ! dict_add_number(dict, "lastline", wp->w_botline - 1); ! dict_add_number(dict, "visible", ! win_valid(wp) && (wp->w_popup_flags & POPF_HIDDEN) == 0); ! ! hash_unlock(&dict->dv_hashtab); } /* *************** *** 3102,3114 **** return; list = list_alloc(); ! if (list != NULL) ! { ! dict_add_list(dict, name, list); ! if (array[0] != 1 || array[1] != 1 || array[2] != 1 || array[3] != 1) ! for (i = 0; i < 4; ++i) ! list_append_number(list, array[i]); ! } } /* --- 3103,3115 ---- return; list = list_alloc(); ! if (list == NULL) ! return; ! ! dict_add_list(dict, name, list); ! if (array[0] != 1 || array[1] != 1 || array[2] != 1 || array[3] != 1) ! for (i = 0; i < 4; ++i) ! list_append_number(list, array[i]); } /* *************** *** 3127,3138 **** return; list = list_alloc(); ! if (list != NULL) ! { ! dict_add_list(dict, "borderhighlight", list); ! for (i = 0; i < 4; ++i) ! list_append_string(list, wp->w_border_highlight[i], -1); ! } } /* --- 3128,3139 ---- return; list = list_alloc(); ! if (list == NULL) ! return; ! ! dict_add_list(dict, "borderhighlight", list); ! for (i = 0; i < 4; ++i) ! list_append_string(list, wp->w_border_highlight[i], -1); } /* *************** *** 3153,3166 **** return; list = list_alloc(); ! if (list != NULL) { ! dict_add_list(dict, "borderchars", list); ! for (i = 0; i < 8; ++i) ! { ! len = mb_char2bytes(wp->w_border_char[i], buf); ! list_append_string(list, buf, len); ! } } } --- 3154,3167 ---- return; list = list_alloc(); ! if (list == NULL) ! return; ! ! dict_add_list(dict, "borderchars", list); ! for (i = 0; i < 8; ++i) { ! len = mb_char2bytes(wp->w_border_char[i], buf); ! list_append_string(list, buf, len); } } *************** *** 3181,3193 **** list_append_number(list, wp->w_popup_maxcol); } list = list_alloc(); ! if (list != NULL) ! { ! dict_add_list(dict, "mousemoved", list); ! list_append_number(list, wp->w_popup_mouse_row); ! list_append_number(list, wp->w_popup_mouse_mincol); ! list_append_number(list, wp->w_popup_mouse_maxcol); ! } } /* --- 3182,3194 ---- list_append_number(list, wp->w_popup_maxcol); } list = list_alloc(); ! if (list == NULL) ! return; ! ! dict_add_list(dict, "mousemoved", list); ! list_append_number(list, wp->w_popup_mouse_row); ! list_append_number(list, wp->w_popup_mouse_mincol); ! list_append_number(list, wp->w_popup_mouse_maxcol); } /* *************** *** 3202,3305 **** tabpage_T *tp; int i; ! if (rettv_dict_alloc(rettv) == OK) ! { ! if (in_vim9script() && check_for_number_arg(argvars, 0) == FAIL) ! return; ! id = (int)tv_get_number(argvars); ! wp = find_popup_win(id); ! if (wp == NULL) ! return; ! dict = rettv->vval.v_dict; ! dict_add_number(dict, "line", wp->w_wantline); ! dict_add_number(dict, "col", wp->w_wantcol); ! dict_add_number(dict, "minwidth", wp->w_minwidth); ! dict_add_number(dict, "minheight", wp->w_minheight); ! dict_add_number(dict, "maxheight", wp->w_maxheight); ! dict_add_number(dict, "maxwidth", wp->w_maxwidth); ! dict_add_number(dict, "firstline", wp->w_firstline); ! dict_add_number(dict, "scrollbar", wp->w_want_scrollbar); ! dict_add_number(dict, "zindex", wp->w_zindex); ! dict_add_number(dict, "fixed", wp->w_popup_fixed); ! if (wp->w_popup_prop_type && win_valid_any_tab(wp->w_popup_prop_win)) ! { ! proptype_T *pt = text_prop_type_by_id( ! wp->w_popup_prop_win->w_buffer, ! wp->w_popup_prop_type); ! ! if (pt != NULL) ! dict_add_string(dict, "textprop", pt->pt_name); ! dict_add_number(dict, "textpropwin", wp->w_popup_prop_win->w_id); ! dict_add_number(dict, "textpropid", wp->w_popup_prop_id); ! } ! dict_add_string(dict, "title", wp->w_popup_title); ! dict_add_number(dict, "wrap", wp->w_p_wrap); ! dict_add_number(dict, "drag", (wp->w_popup_flags & POPF_DRAG) != 0); ! dict_add_number(dict, "dragall", ! (wp->w_popup_flags & POPF_DRAGALL) != 0); ! dict_add_number(dict, "mapping", ! (wp->w_popup_flags & POPF_MAPPING) != 0); ! dict_add_number(dict, "resize", (wp->w_popup_flags & POPF_RESIZE) != 0); ! dict_add_number(dict, "posinvert", ! (wp->w_popup_flags & POPF_POSINVERT) != 0); ! dict_add_number(dict, "cursorline", ! (wp->w_popup_flags & POPF_CURSORLINE) != 0); ! dict_add_string(dict, "highlight", wp->w_p_wcr); ! if (wp->w_scrollbar_highlight != NULL) ! dict_add_string(dict, "scrollbarhighlight", ! wp->w_scrollbar_highlight); ! if (wp->w_thumb_highlight != NULL) ! dict_add_string(dict, "thumbhighlight", wp->w_thumb_highlight); ! ! // find the tabpage that holds this popup ! i = 1; ! FOR_ALL_TABPAGES(tp) ! { ! win_T *twp; ! FOR_ALL_POPUPWINS_IN_TAB(tp, twp) ! if (twp->w_id == id) ! break; ! if (twp != NULL) ! break; ! ++i; ! } ! if (tp == NULL) ! i = -1; // must be global ! else if (tp == curtab) ! i = 0; ! dict_add_number(dict, "tabpage", i); ! ! get_padding_border(dict, wp->w_popup_padding, "padding"); ! get_padding_border(dict, wp->w_popup_border, "border"); ! get_borderhighlight(dict, wp); ! get_borderchars(dict, wp); ! get_moved_list(dict, wp); ! ! if (wp->w_filter_cb.cb_name != NULL) ! dict_add_callback(dict, "filter", &wp->w_filter_cb); ! if (wp->w_close_cb.cb_name != NULL) ! dict_add_callback(dict, "callback", &wp->w_close_cb); ! for (i = 0; i < (int)ARRAY_LENGTH(poppos_entries); ++i) ! if (wp->w_popup_pos == poppos_entries[i].pp_val) ! { ! dict_add_string(dict, "pos", ! (char_u *)poppos_entries[i].pp_name); break; ! } ! dict_add_string(dict, "close", (char_u *)( ! wp->w_popup_close == POPCLOSE_BUTTON ? "button" ! : wp->w_popup_close == POPCLOSE_CLICK ? "click" : "none")); # if defined(FEAT_TIMERS) ! dict_add_number(dict, "time", wp->w_popup_timer != NULL ! ? (long)wp->w_popup_timer->tr_interval : 0L); # endif - } } # if defined(FEAT_TERMINAL) || defined(PROTO) --- 3203,3306 ---- tabpage_T *tp; int i; ! if (rettv_dict_alloc(rettv) == FAIL) ! return; ! if (in_vim9script() && check_for_number_arg(argvars, 0) == FAIL) ! return; ! id = (int)tv_get_number(argvars); ! wp = find_popup_win(id); ! if (wp == NULL) ! return; ! dict = rettv->vval.v_dict; ! dict_add_number(dict, "line", wp->w_wantline); ! dict_add_number(dict, "col", wp->w_wantcol); ! dict_add_number(dict, "minwidth", wp->w_minwidth); ! dict_add_number(dict, "minheight", wp->w_minheight); ! dict_add_number(dict, "maxheight", wp->w_maxheight); ! dict_add_number(dict, "maxwidth", wp->w_maxwidth); ! dict_add_number(dict, "firstline", wp->w_firstline); ! dict_add_number(dict, "scrollbar", wp->w_want_scrollbar); ! dict_add_number(dict, "zindex", wp->w_zindex); ! dict_add_number(dict, "fixed", wp->w_popup_fixed); ! if (wp->w_popup_prop_type && win_valid_any_tab(wp->w_popup_prop_win)) ! { ! proptype_T *pt = text_prop_type_by_id( ! wp->w_popup_prop_win->w_buffer, ! wp->w_popup_prop_type); ! ! if (pt != NULL) ! dict_add_string(dict, "textprop", pt->pt_name); ! dict_add_number(dict, "textpropwin", wp->w_popup_prop_win->w_id); ! dict_add_number(dict, "textpropid", wp->w_popup_prop_id); ! } ! dict_add_string(dict, "title", wp->w_popup_title); ! dict_add_number(dict, "wrap", wp->w_p_wrap); ! dict_add_number(dict, "drag", (wp->w_popup_flags & POPF_DRAG) != 0); ! dict_add_number(dict, "dragall", ! (wp->w_popup_flags & POPF_DRAGALL) != 0); ! dict_add_number(dict, "mapping", ! (wp->w_popup_flags & POPF_MAPPING) != 0); ! dict_add_number(dict, "resize", (wp->w_popup_flags & POPF_RESIZE) != 0); ! dict_add_number(dict, "posinvert", ! (wp->w_popup_flags & POPF_POSINVERT) != 0); ! dict_add_number(dict, "cursorline", ! (wp->w_popup_flags & POPF_CURSORLINE) != 0); ! dict_add_string(dict, "highlight", wp->w_p_wcr); ! if (wp->w_scrollbar_highlight != NULL) ! dict_add_string(dict, "scrollbarhighlight", ! wp->w_scrollbar_highlight); ! if (wp->w_thumb_highlight != NULL) ! dict_add_string(dict, "thumbhighlight", wp->w_thumb_highlight); ! // find the tabpage that holds this popup ! i = 1; ! FOR_ALL_TABPAGES(tp) ! { ! win_T *twp; ! ! FOR_ALL_POPUPWINS_IN_TAB(tp, twp) ! if (twp->w_id == id) break; ! if (twp != NULL) ! break; ! ++i; ! } ! if (tp == NULL) ! i = -1; // must be global ! else if (tp == curtab) ! i = 0; ! dict_add_number(dict, "tabpage", i); ! ! get_padding_border(dict, wp->w_popup_padding, "padding"); ! get_padding_border(dict, wp->w_popup_border, "border"); ! get_borderhighlight(dict, wp); ! get_borderchars(dict, wp); ! get_moved_list(dict, wp); ! ! if (wp->w_filter_cb.cb_name != NULL) ! dict_add_callback(dict, "filter", &wp->w_filter_cb); ! if (wp->w_close_cb.cb_name != NULL) ! dict_add_callback(dict, "callback", &wp->w_close_cb); ! ! for (i = 0; i < (int)ARRAY_LENGTH(poppos_entries); ++i) ! if (wp->w_popup_pos == poppos_entries[i].pp_val) ! { ! dict_add_string(dict, "pos", ! (char_u *)poppos_entries[i].pp_name); ! break; ! } ! dict_add_string(dict, "close", (char_u *)( ! wp->w_popup_close == POPCLOSE_BUTTON ? "button" ! : wp->w_popup_close == POPCLOSE_CLICK ? "click" : "none")); # if defined(FEAT_TIMERS) ! dict_add_number(dict, "time", wp->w_popup_timer != NULL ! ? (long)wp->w_popup_timer->tr_interval : 0L); # endif } # if defined(FEAT_TERMINAL) || defined(PROTO) *************** *** 3640,3688 **** static void update_popup_transparent(win_T *wp, int val) { ! if (wp->w_popup_mask != NULL) { ! int width = popup_width(wp); ! int height = popup_height(wp); ! listitem_T *lio, *li; ! int cols, cole; ! int lines, linee; ! int col, line; ! ! FOR_ALL_LIST_ITEMS(wp->w_popup_mask, lio) ! { ! li = lio->li_tv.vval.v_list->lv_first; ! cols = tv_get_number(&li->li_tv); ! if (cols < 0) ! cols = width + cols + 1; ! li = li->li_next; ! cole = tv_get_number(&li->li_tv); ! if (cole < 0) ! cole = width + cole + 1; ! li = li->li_next; ! lines = tv_get_number(&li->li_tv); ! if (lines < 0) ! lines = height + lines + 1; ! li = li->li_next; ! linee = tv_get_number(&li->li_tv); ! if (linee < 0) ! linee = height + linee + 1; ! ! --cols; ! cols -= wp->w_popup_leftoff; ! if (cols < 0) ! cols = 0; ! cole -= wp->w_popup_leftoff; ! --lines; ! if (lines < 0) ! lines = 0; ! for (line = lines; line < linee ! && line + wp->w_winrow < screen_Rows; ++line) ! for (col = cols; col < cole ! && col + wp->w_wincol < screen_Columns; ++col) ! popup_transparent[(line + wp->w_winrow) * screen_Columns ! + col + wp->w_wincol] = val; ! } } } --- 3641,3689 ---- static void update_popup_transparent(win_T *wp, int val) { ! if (wp->w_popup_mask == NULL) ! return; ! ! int width = popup_width(wp); ! int height = popup_height(wp); ! listitem_T *lio, *li; ! int cols, cole; ! int lines, linee; ! int col, line; ! ! FOR_ALL_LIST_ITEMS(wp->w_popup_mask, lio) { ! li = lio->li_tv.vval.v_list->lv_first; ! cols = tv_get_number(&li->li_tv); ! if (cols < 0) ! cols = width + cols + 1; ! li = li->li_next; ! cole = tv_get_number(&li->li_tv); ! if (cole < 0) ! cole = width + cole + 1; ! li = li->li_next; ! lines = tv_get_number(&li->li_tv); ! if (lines < 0) ! lines = height + lines + 1; ! li = li->li_next; ! linee = tv_get_number(&li->li_tv); ! if (linee < 0) ! linee = height + linee + 1; ! ! --cols; ! cols -= wp->w_popup_leftoff; ! if (cols < 0) ! cols = 0; ! cole -= wp->w_popup_leftoff; ! --lines; ! if (lines < 0) ! lines = 0; ! for (line = lines; line < linee ! && line + wp->w_winrow < screen_Rows; ++line) ! for (col = cols; col < cole ! && col + wp->w_wincol < screen_Columns; ++col) ! popup_transparent[(line + wp->w_winrow) * screen_Columns ! + col + wp->w_wincol] = val; } } *************** *** 4508,4540 **** win_T * popup_get_message_win(void) { ! if (message_win == NULL) ! { ! int i; ! message_win = popup_create(NULL, NULL, TYPE_MESSAGE_WIN); ! if (message_win == NULL) ! return NULL; ! // use the full screen width ! message_win->w_width = Columns; ! // position at bottom of screen ! message_win->w_popup_pos = POPPOS_BOTTOM; ! message_win->w_wantcol = 1; ! message_win->w_minwidth = 9999; ! message_win->w_firstline = -1; ! // no padding, border at the top ! for (i = 0; i < 4; ++i) ! message_win->w_popup_padding[i] = 0; ! for (i = 1; i < 4; ++i) ! message_win->w_popup_border[i] = 0; ! if (message_win->w_popup_timer != NULL) ! message_win->w_popup_timer->tr_keep = TRUE; ! } return message_win; } --- 4509,4541 ---- win_T * popup_get_message_win(void) { ! if (message_win != NULL) ! return message_win; ! int i; ! message_win = popup_create(NULL, NULL, TYPE_MESSAGE_WIN); ! if (message_win == NULL) ! return NULL; ! // use the full screen width ! message_win->w_width = Columns; ! // position at bottom of screen ! message_win->w_popup_pos = POPPOS_BOTTOM; ! message_win->w_wantcol = 1; ! message_win->w_minwidth = 9999; ! message_win->w_firstline = -1; ! // no padding, border at the top ! for (i = 0; i < 4; ++i) ! message_win->w_popup_padding[i] = 0; ! for (i = 1; i < 4; ++i) ! message_win->w_popup_border[i] = 0; ! ! if (message_win->w_popup_timer != NULL) ! message_win->w_popup_timer->tr_keep = TRUE; return message_win; } *************** *** 4545,4560 **** void popup_show_message_win(void) { ! if (message_win != NULL) { ! if ((message_win->w_popup_flags & POPF_HIDDEN) != 0) ! { ! // the highlight may have changed. ! popup_update_color(message_win, TYPE_MESSAGE_WIN); ! popup_show(message_win); ! } ! start_message_win_timer = TRUE; } } static void --- 4546,4561 ---- void popup_show_message_win(void) { ! if (message_win == NULL) ! return; ! ! if ((message_win->w_popup_flags & POPF_HIDDEN) != 0) { ! // the highlight may have changed. ! popup_update_color(message_win, TYPE_MESSAGE_WIN); ! popup_show(message_win); } + start_message_win_timer = TRUE; } static void *************** *** 4664,4685 **** void popup_set_title(win_T *wp) { ! if (wp->w_buffer->b_fname != NULL) ! { ! char_u dirname[MAXPATHL]; ! size_t len; ! mch_dirname(dirname, MAXPATHL); ! shorten_buf_fname(wp->w_buffer, dirname, FALSE); ! vim_free(wp->w_popup_title); ! len = STRLEN(wp->w_buffer->b_fname) + 3; ! wp->w_popup_title = alloc((int)len); ! if (wp->w_popup_title != NULL) ! vim_snprintf((char *)wp->w_popup_title, len, " %s ", ! wp->w_buffer->b_fname); ! redraw_win_later(wp, UPD_VALID); ! } } # if defined(FEAT_QUICKFIX) || defined(PROTO) --- 4665,4686 ---- void popup_set_title(win_T *wp) { ! if (wp->w_buffer->b_fname == NULL) ! return; ! char_u dirname[MAXPATHL]; ! size_t len; ! mch_dirname(dirname, MAXPATHL); ! shorten_buf_fname(wp->w_buffer, dirname, FALSE); ! ! vim_free(wp->w_popup_title); ! len = STRLEN(wp->w_buffer->b_fname) + 3; ! wp->w_popup_title = alloc((int)len); ! if (wp->w_popup_title != NULL) ! vim_snprintf((char *)wp->w_popup_title, len, " %s ", ! wp->w_buffer->b_fname); ! redraw_win_later(wp, UPD_VALID); } # if defined(FEAT_QUICKFIX) || defined(PROTO) *** ../vim-9.0.1220/src/profiler.c 2022-09-17 21:07:52.099993159 +0100 --- src/profiler.c 2023-01-18 18:14:09.152963086 +0000 *************** *** 910,925 **** { scriptitem_T *si; ! if (SCRIPT_ID_VALID(current_sctx.sc_sid)) { ! si = SCRIPT_ITEM(current_sctx.sc_sid); ! if (si->sn_prof_on && --si->sn_pr_nest == 0) ! { ! profile_end(&si->sn_pr_child); ! profile_sub_wait(tm, &si->sn_pr_child); // don't count wait time ! profile_add(&si->sn_pr_children, &si->sn_pr_child); ! profile_add(&si->sn_prl_children, &si->sn_pr_child); ! } } } --- 910,925 ---- { scriptitem_T *si; ! if (!SCRIPT_ID_VALID(current_sctx.sc_sid)) ! return; ! ! si = SCRIPT_ITEM(current_sctx.sc_sid); ! if (si->sn_prof_on && --si->sn_pr_nest == 0) { ! profile_end(&si->sn_pr_child); ! profile_sub_wait(tm, &si->sn_pr_child); // don't count wait time ! profile_add(&si->sn_pr_children, &si->sn_pr_child); ! profile_add(&si->sn_prl_children, &si->sn_pr_child); } } *************** *** 1009,1025 **** { FILE *fd; ! if (profile_fname != NULL) { ! fd = mch_fopen((char *)profile_fname, "w"); ! if (fd == NULL) ! semsg(_(e_cant_open_file_str), profile_fname); ! else ! { ! script_dump_profile(fd); ! func_dump_profile(fd); ! fclose(fd); ! } } } --- 1009,1025 ---- { FILE *fd; ! if (profile_fname == NULL) ! return; ! ! fd = mch_fopen((char *)profile_fname, "w"); ! if (fd == NULL) ! semsg(_(e_cant_open_file_str), profile_fname); ! else { ! script_dump_profile(fd); ! func_dump_profile(fd); ! fclose(fd); } } *** ../vim-9.0.1220/src/quickfix.c 2022-12-02 15:58:34.610705474 +0000 --- src/quickfix.c 2023-01-18 18:14:09.152963086 +0000 *************** *** 1898,1911 **** { VIM_CLEAR(qfl->qf_title); ! if (title != NULL) ! { ! char_u *p = alloc_id(STRLEN(title) + 2, aid_qf_title); ! qfl->qf_title = p; ! if (p != NULL) ! STRCPY(p, title); ! } } /* --- 1898,1911 ---- { VIM_CLEAR(qfl->qf_title); ! if (title == NULL) ! return; ! char_u *p = alloc_id(STRLEN(title) + 2, aid_qf_title); ! ! qfl->qf_title = p; ! if (p != NULL) ! STRCPY(p, title); } /* *************** *** 1976,1987 **** qf_delq_T *q; q = ALLOC_ONE(qf_delq_T); ! if (q != NULL) ! { ! q->qi = qi; ! q->next = qf_delq_head; ! qf_delq_head = q; ! } } /* --- 1976,1987 ---- qf_delq_T *q; q = ALLOC_ONE(qf_delq_T); ! if (q == NULL) ! return; ! ! q->qi = qi; ! q->next = qf_delq_head; ! qf_delq_head = q; } /* *************** *** 2002,2017 **** { buf_T *qfbuf; ! if (qi->qf_bufnr != INVALID_QFBUFNR) { ! qfbuf = buflist_findnr(qi->qf_bufnr); ! if (qfbuf != NULL && qfbuf->b_nwindows == 0) ! { ! // If the quickfix buffer is not loaded in any window, then ! // wipe the buffer. ! close_buffer(NULL, qfbuf, DOBUF_WIPE, FALSE, FALSE); ! qi->qf_bufnr = INVALID_QFBUFNR; ! } } } --- 2002,2017 ---- { buf_T *qfbuf; ! if (qi->qf_bufnr == INVALID_QFBUFNR) ! return; ! ! qfbuf = buflist_findnr(qi->qf_bufnr); ! if (qfbuf != NULL && qfbuf->b_nwindows == 0) { ! // If the quickfix buffer is not loaded in any window, then ! // wipe the buffer. ! close_buffer(NULL, qfbuf, DOBUF_WIPE, FALSE, FALSE); ! qi->qf_bufnr = INVALID_QFBUFNR; } } *************** *** 2231,2242 **** qf_info_T *qi; qi = ALLOC_CLEAR_ONE_ID(qf_info_T, aid_qf_qfinfo); ! if (qi != NULL) ! { ! qi->qf_refcount++; ! qi->qfl_type = qfltype; ! qi->qf_bufnr = INVALID_QFBUFNR; ! } return qi; } --- 2231,2242 ---- qf_info_T *qi; qi = ALLOC_CLEAR_ONE_ID(qf_info_T, aid_qf_qfinfo); ! if (qi == NULL) ! return NULL; ! ! qi->qf_refcount++; ! qi->qfl_type = qfltype; ! qi->qf_bufnr = INVALID_QFBUFNR; return qi; } *************** *** 4573,4636 **** // Check if a buffer for the quickfix list exists. Update it. buf = qf_find_buf(qi); ! if (buf != NULL) ! { ! linenr_T old_line_count = buf->b_ml.ml_line_count; ! int qf_winid = 0; ! if (IS_LL_STACK(qi)) { ! if (curwin->w_llist == qi) ! win = curwin; ! else ! { ! // Find the file window (non-quickfix) with this location list ! win = qf_find_win_with_loclist(qi); ! if (win == NULL) ! // File window is not found. Find the location list window. ! win = qf_find_win(qi); ! if (win == NULL) ! return; ! } ! qf_winid = win->w_id; } ! // autocommands may cause trouble ! incr_quickfix_busy(); ! int do_fill = TRUE; ! if (old_last == NULL) ! { ! // set curwin/curbuf to buf and save a few things ! aucmd_prepbuf(&aco, buf); ! if (curbuf != buf) ! do_fill = FALSE; // failed to find a window for "buf" ! } ! if (do_fill) ! { ! qf_update_win_titlevar(qi); ! qf_fill_buffer(qf_get_curlist(qi), buf, old_last, qf_winid); ! ++CHANGEDTICK(buf); ! if (old_last == NULL) ! { ! (void)qf_win_pos_update(qi, 0); ! // restore curwin/curbuf and a few other things ! aucmd_restbuf(&aco); ! } } ! // Only redraw when added lines are visible. This avoids flickering ! // when the added lines are not visible. ! if ((win = qf_find_win(qi)) != NULL && old_line_count < win->w_botline) ! redraw_buf_later(buf, UPD_NOT_VALID); ! // always called after incr_quickfix_busy() ! decr_quickfix_busy(); ! } } /* --- 4573,4636 ---- // Check if a buffer for the quickfix list exists. Update it. buf = qf_find_buf(qi); ! if (buf == NULL) ! return; ! linenr_T old_line_count = buf->b_ml.ml_line_count; ! int qf_winid = 0; ! ! if (IS_LL_STACK(qi)) ! { ! if (curwin->w_llist == qi) ! win = curwin; ! else { ! // Find the file window (non-quickfix) with this location list ! win = qf_find_win_with_loclist(qi); ! if (win == NULL) ! // File window is not found. Find the location list window. ! win = qf_find_win(qi); ! if (win == NULL) ! return; } + qf_winid = win->w_id; + } ! // autocommands may cause trouble ! incr_quickfix_busy(); ! int do_fill = TRUE; ! if (old_last == NULL) ! { ! // set curwin/curbuf to buf and save a few things ! aucmd_prepbuf(&aco, buf); ! if (curbuf != buf) ! do_fill = FALSE; // failed to find a window for "buf" ! } ! if (do_fill) ! { ! qf_update_win_titlevar(qi); ! qf_fill_buffer(qf_get_curlist(qi), buf, old_last, qf_winid); ! ++CHANGEDTICK(buf); ! if (old_last == NULL) ! { ! (void)qf_win_pos_update(qi, 0); ! // restore curwin/curbuf and a few other things ! aucmd_restbuf(&aco); } + } ! // Only redraw when added lines are visible. This avoids flickering ! // when the added lines are not visible. ! if ((win = qf_find_win(qi)) != NULL && old_line_count < win->w_botline) ! redraw_buf_later(buf, UPD_NOT_VALID); ! // always called after incr_quickfix_busy() ! decr_quickfix_busy(); } /* *************** *** 4924,4937 **** { int curlist; ! if (qf_get_curlist(qi)->qf_id != save_qfid) ! { ! curlist = qf_id2nr(qi, save_qfid); ! if (curlist < 0) ! // list is not present ! return FAIL; ! qi->qf_curlist = curlist; ! } return OK; } --- 4924,4937 ---- { int curlist; ! if (qf_get_curlist(qi)->qf_id == save_qfid) ! return OK; ! ! curlist = qf_id2nr(qi, save_qfid); ! if (curlist < 0) ! // list is not present ! return FAIL; ! qi->qf_curlist = curlist; return OK; } *************** *** 6544,6565 **** { char_u *dirname_now = alloc(MAXPATHL); ! if (NULL != dirname_now) { ! mch_dirname(dirname_now, MAXPATHL); ! if (STRCMP(dirname_start, dirname_now) != 0) ! { ! // If the directory has changed, change it back by building up an ! // appropriate ex command and executing it. ! exarg_T ea; ! CLEAR_FIELD(ea); ! ea.arg = dirname_start; ! ea.cmdidx = (curwin->w_localdir == NULL) ? CMD_cd : CMD_lcd; ! ex_cd(&ea); ! } ! vim_free(dirname_now); } } /* --- 6544,6565 ---- { char_u *dirname_now = alloc(MAXPATHL); ! if (dirname_now == NULL) ! return; ! ! mch_dirname(dirname_now, MAXPATHL); ! if (STRCMP(dirname_start, dirname_now) != 0) { ! // If the directory has changed, change it back by building up an ! // appropriate ex command and executing it. ! exarg_T ea; ! CLEAR_FIELD(ea); ! ea.arg = dirname_start; ! ea.cmdidx = (curwin->w_localdir == NULL) ? CMD_cd : CMD_lcd; ! ex_cd(&ea); } + vim_free(dirname_now); } /* *************** *** 6723,6735 **** static void unload_dummy_buffer(buf_T *buf, char_u *dirname_start) { ! if (curbuf != buf) // safety check ! { ! close_buffer(NULL, buf, DOBUF_UNLOAD, FALSE, TRUE); ! // When autocommands/'autochdir' option changed directory: go back. ! restore_start_dir(dirname_start); ! } } #if defined(FEAT_EVAL) || defined(PROTO) --- 6723,6735 ---- static void unload_dummy_buffer(buf_T *buf, char_u *dirname_start) { ! if (curbuf == buf) // safety check ! return; ! close_buffer(NULL, buf, DOBUF_UNLOAD, FALSE, TRUE); ! ! // When autocommands/'autochdir' option changed directory: go back. ! restore_start_dir(dirname_start); } #if defined(FEAT_EVAL) || defined(PROTO) *************** *** 6862,6897 **** list_T *l; // Only a List value is supported ! if (di->di_tv.v_type == VAR_LIST && di->di_tv.vval.v_list != NULL) ! { ! // If errorformat is supplied then use it, otherwise use the 'efm' ! // option setting ! if ((efm_di = dict_find(what, (char_u *)"efm", -1)) != NULL) ! { ! if (efm_di->di_tv.v_type != VAR_STRING || ! efm_di->di_tv.vval.v_string == NULL) ! return FAIL; ! errorformat = efm_di->di_tv.vval.v_string; ! } ! l = list_alloc(); ! if (l == NULL) return FAIL; ! qi = qf_alloc_stack(QFLT_INTERNAL); ! if (qi != NULL) { ! if (qf_init_ext(qi, 0, NULL, NULL, &di->di_tv, errorformat, ! TRUE, (linenr_T)0, (linenr_T)0, NULL, NULL) > 0) ! { ! (void)get_errorlist(qi, NULL, 0, 0, l); ! qf_free(&qi->qf_lists[0]); ! } ! free(qi); } ! dict_add_list(retdict, "items", l); ! status = OK; } return status; } --- 6862,6897 ---- list_T *l; // Only a List value is supported ! if (di->di_tv.v_type != VAR_LIST || di->di_tv.vval.v_list == NULL) ! return FAIL; ! // If errorformat is supplied then use it, otherwise use the 'efm' ! // option setting ! if ((efm_di = dict_find(what, (char_u *)"efm", -1)) != NULL) ! { ! if (efm_di->di_tv.v_type != VAR_STRING || ! efm_di->di_tv.vval.v_string == NULL) return FAIL; + errorformat = efm_di->di_tv.vval.v_string; + } ! l = list_alloc(); ! if (l == NULL) ! return FAIL; ! ! qi = qf_alloc_stack(QFLT_INTERNAL); ! if (qi != NULL) ! { ! if (qf_init_ext(qi, 0, NULL, NULL, &di->di_tv, errorformat, ! TRUE, (linenr_T)0, (linenr_T)0, NULL, NULL) > 0) { ! (void)get_errorlist(qi, NULL, 0, 0, l); ! qf_free(&qi->qf_lists[0]); } ! free(qi); } + dict_add_list(retdict, "items", l); + status = OK; return status; } *************** *** 7632,7643 **** free_callback(&qfl->qf_qftf_cb); cb = get_callback(&di->di_tv); ! if (cb.cb_name != NULL && *cb.cb_name != NUL) ! { ! set_callback(&qfl->qf_qftf_cb, &cb); ! if (cb.cb_free_name) ! vim_free(cb.cb_name); ! } return OK; } --- 7632,7643 ---- free_callback(&qfl->qf_qftf_cb); cb = get_callback(&di->di_tv); ! if (cb.cb_name == NULL || *cb.cb_name == NUL) ! return OK; ! ! set_callback(&qfl->qf_qftf_cb, &cb); ! if (cb.cb_free_name) ! vim_free(cb.cb_name); return OK; } *************** *** 8126,8136 **** // Evaluate the expression. When the result is a string or a list we can // use it to fill the errorlist. tv = eval_expr(eap->arg, eap); ! if (tv != NULL) ! { ! (void)cexpr_core(eap, tv); ! free_tv(tv); ! } } #endif --- 8126,8136 ---- // Evaluate the expression. When the result is a string or a list we can // use it to fill the errorlist. tv = eval_expr(eap->arg, eap); ! if (tv == NULL) ! return; ! ! (void)cexpr_core(eap, tv); ! free_tv(tv); } #endif *** ../vim-9.0.1220/src/regexp.c 2022-11-26 11:47:07.175323334 +0000 --- src/regexp.c 2023-01-18 18:14:09.152963086 +0000 *************** *** 710,719 **** { static int after_slash = FALSE; ! if (curchr == -1) { - switch (curchr = regparse[0]) - { case '.': case '[': case '~': --- 710,720 ---- { static int after_slash = FALSE; ! if (curchr != -1) ! return curchr; ! ! switch (curchr = regparse[0]) { case '.': case '[': case '~': *************** *** 743,749 **** case ';': // future ext. case '`': // future ext. case '/': // Can't be used in / command ! // magic only after "\v" if (reg_magic == MAGIC_ALL) curchr = Magic(curchr); break; --- 744,750 ---- case ';': // future ext. case '`': // future ext. case '/': // Can't be used in / command ! // magic only after "\v" if (reg_magic == MAGIC_ALL) curchr = Magic(curchr); break; *************** *** 788,795 **** // ignore \c \C \m \M \v \V and \Z after '$' while (p[0] == '\\' && (p[1] == 'c' || p[1] == 'C' ! || p[1] == 'm' || p[1] == 'M' ! || p[1] == 'v' || p[1] == 'V' || p[1] == 'Z')) { if (p[1] == 'v') is_magic_all = TRUE; --- 789,796 ---- // ignore \c \C \m \M \v \V and \Z after '$' while (p[0] == '\\' && (p[1] == 'c' || p[1] == 'C' ! || p[1] == 'm' || p[1] == 'M' ! || p[1] == 'v' || p[1] == 'V' || p[1] == 'Z')) { if (p[1] == 'v') is_magic_all = TRUE; *************** *** 802,808 **** && (p[1] == '|' || p[1] == '&' || p[1] == ')' || p[1] == 'n')) || (is_magic_all ! && (p[0] == '|' || p[0] == '&' || p[0] == ')')) || reg_magic == MAGIC_ALL) curchr = Magic('$'); } --- 803,809 ---- && (p[1] == '|' || p[1] == '&' || p[1] == ')' || p[1] == 'n')) || (is_magic_all ! && (p[0] == '|' || p[0] == '&' || p[0] == ')')) || reg_magic == MAGIC_ALL) curchr = Magic('$'); } *************** *** 858,864 **** default: if (has_mbyte) curchr = (*mb_ptr2char)(regparse); - } } return curchr; --- 859,864 ---- *************** *** 1384,1425 **** static void cleanup_subexpr(void) { ! if (rex.need_clear_subexpr) { ! if (REG_MULTI) ! { ! // Use 0xff to set lnum to -1 ! vim_memset(rex.reg_startpos, 0xff, sizeof(lpos_T) * NSUBEXP); ! vim_memset(rex.reg_endpos, 0xff, sizeof(lpos_T) * NSUBEXP); ! } ! else ! { ! vim_memset(rex.reg_startp, 0, sizeof(char_u *) * NSUBEXP); ! vim_memset(rex.reg_endp, 0, sizeof(char_u *) * NSUBEXP); ! } ! rex.need_clear_subexpr = FALSE; } } #ifdef FEAT_SYN_HL static void cleanup_zsubexpr(void) { ! if (rex.need_clear_zsubexpr) { ! if (REG_MULTI) ! { ! // Use 0xff to set lnum to -1 ! vim_memset(reg_startzpos, 0xff, sizeof(lpos_T) * NSUBEXP); ! vim_memset(reg_endzpos, 0xff, sizeof(lpos_T) * NSUBEXP); ! } ! else ! { ! vim_memset(reg_startzp, 0, sizeof(char_u *) * NSUBEXP); ! vim_memset(reg_endzp, 0, sizeof(char_u *) * NSUBEXP); ! } ! rex.need_clear_zsubexpr = FALSE; } } #endif --- 1384,1425 ---- static void cleanup_subexpr(void) { ! if (!rex.need_clear_subexpr) ! return; ! ! if (REG_MULTI) { ! // Use 0xff to set lnum to -1 ! vim_memset(rex.reg_startpos, 0xff, sizeof(lpos_T) * NSUBEXP); ! vim_memset(rex.reg_endpos, 0xff, sizeof(lpos_T) * NSUBEXP); } + else + { + vim_memset(rex.reg_startp, 0, sizeof(char_u *) * NSUBEXP); + vim_memset(rex.reg_endp, 0, sizeof(char_u *) * NSUBEXP); + } + rex.need_clear_subexpr = FALSE; } #ifdef FEAT_SYN_HL static void cleanup_zsubexpr(void) { ! if (!rex.need_clear_zsubexpr) ! return; ! ! if (REG_MULTI) { ! // Use 0xff to set lnum to -1 ! vim_memset(reg_startzpos, 0xff, sizeof(lpos_T) * NSUBEXP); ! vim_memset(reg_endzpos, 0xff, sizeof(lpos_T) * NSUBEXP); ! } ! else ! { ! vim_memset(reg_startzp, 0, sizeof(char_u *) * NSUBEXP); ! vim_memset(reg_endzp, 0, sizeof(char_u *) * NSUBEXP); } + rex.need_clear_zsubexpr = FALSE; } #endif *** ../vim-9.0.1220/src/regexp_bt.c 2022-11-30 18:11:52.690904297 +0000 --- src/regexp_bt.c 2023-01-18 18:14:09.156963088 +0000 *************** *** 3187,3206 **** // When "rex.need_clear_subexpr" is set we don't need to save the values, // only remember that this flag needs to be set again when restoring. bp->save_need_clear_subexpr = rex.need_clear_subexpr; ! if (!rex.need_clear_subexpr) { ! for (i = 0; i < NSUBEXP; ++i) { ! if (REG_MULTI) ! { ! bp->save_start[i].se_u.pos = rex.reg_startpos[i]; ! bp->save_end[i].se_u.pos = rex.reg_endpos[i]; ! } ! else ! { ! bp->save_start[i].se_u.ptr = rex.reg_startp[i]; ! bp->save_end[i].se_u.ptr = rex.reg_endp[i]; ! } } } } --- 3187,3206 ---- // When "rex.need_clear_subexpr" is set we don't need to save the values, // only remember that this flag needs to be set again when restoring. bp->save_need_clear_subexpr = rex.need_clear_subexpr; ! if (rex.need_clear_subexpr) ! return; ! ! for (i = 0; i < NSUBEXP; ++i) { ! if (REG_MULTI) ! { ! bp->save_start[i].se_u.pos = rex.reg_startpos[i]; ! bp->save_end[i].se_u.pos = rex.reg_endpos[i]; ! } ! else { ! bp->save_start[i].se_u.ptr = rex.reg_startp[i]; ! bp->save_end[i].se_u.ptr = rex.reg_endp[i]; } } } *************** *** 3215,3234 **** // Only need to restore saved values when they are not to be cleared. rex.need_clear_subexpr = bp->save_need_clear_subexpr; ! if (!rex.need_clear_subexpr) { ! for (i = 0; i < NSUBEXP; ++i) { ! if (REG_MULTI) ! { ! rex.reg_startpos[i] = bp->save_start[i].se_u.pos; ! rex.reg_endpos[i] = bp->save_end[i].se_u.pos; ! } ! else ! { ! rex.reg_startp[i] = bp->save_start[i].se_u.ptr; ! rex.reg_endp[i] = bp->save_end[i].se_u.ptr; ! } } } } --- 3215,3234 ---- // Only need to restore saved values when they are not to be cleared. rex.need_clear_subexpr = bp->save_need_clear_subexpr; ! if (rex.need_clear_subexpr) ! return; ! ! for (i = 0; i < NSUBEXP; ++i) { ! if (REG_MULTI) ! { ! rex.reg_startpos[i] = bp->save_start[i].se_u.pos; ! rex.reg_endpos[i] = bp->save_end[i].se_u.pos; ! } ! else { ! rex.reg_startp[i] = bp->save_start[i].se_u.ptr; ! rex.reg_endp[i] = bp->save_end[i].se_u.ptr; } } } *** ../vim-9.0.1220/src/regexp_nfa.c 2022-12-11 14:18:25.954350156 +0000 --- src/regexp_nfa.c 2023-01-18 18:14:09.156963088 +0000 *************** *** 487,506 **** return NULL; ret = alloc(len); ! if (ret != NULL) { ! p = start->out->out; // skip first char, it goes into regstart ! s = ret; ! while (p->c > 0) ! { ! if (has_mbyte) ! s += (*mb_char2bytes)(p->c, s); ! else ! *s++ = p->c; ! p = p->out; ! } ! *s = NUL; } return ret; } --- 487,506 ---- return NULL; ret = alloc(len); ! if (ret == NULL) ! return NULL; ! ! p = start->out->out; // skip first char, it goes into regstart ! s = ret; ! while (p->c > 0) { ! if (has_mbyte) ! s += (*mb_char2bytes)(p->c, s); ! else ! *s++ = p->c; ! p = p->out; } + *s = NUL; return ret; } *************** *** 2782,2806 **** FILE *f; f = fopen(NFA_REGEXP_DUMP_LOG, "a"); ! if (f != NULL) { ! fprintf(f, "\n-------------------------\n"); ! if (retval == FAIL) ! fprintf(f, ">>> NFA engine failed... \n"); ! else if (retval == OK) ! fprintf(f, ">>> NFA engine succeeded !\n"); ! fprintf(f, "Regexp: \"%s\"\nPostfix notation (char): \"", expr); ! for (p = post_start; *p && p < post_ptr; p++) ! { ! nfa_set_code(*p); ! fprintf(f, "%s, ", code); ! } ! fprintf(f, "\"\nPostfix notation (int): "); ! for (p = post_start; *p && p < post_ptr; p++) ! fprintf(f, "%d ", *p); ! fprintf(f, "\n\n"); ! fclose(f); } } /* --- 2782,2806 ---- FILE *f; f = fopen(NFA_REGEXP_DUMP_LOG, "a"); ! if (f == NULL) ! return; ! ! fprintf(f, "\n-------------------------\n"); ! if (retval == FAIL) ! fprintf(f, ">>> NFA engine failed... \n"); ! else if (retval == OK) ! fprintf(f, ">>> NFA engine succeeded !\n"); ! fprintf(f, "Regexp: \"%s\"\nPostfix notation (char): \"", expr); ! for (p = post_start; *p && p < post_ptr; p++) { ! nfa_set_code(*p); ! fprintf(f, "%s, ", code); } + fprintf(f, "\"\nPostfix notation (int): "); + for (p = post_start; *p && p < post_ptr; p++) + fprintf(f, "%d ", *p); + fprintf(f, "\n\n"); + fclose(f); } /* *************** *** 2883,2902 **** { FILE *debugf = fopen(NFA_REGEXP_DUMP_LOG, "a"); ! if (debugf != NULL) ! { ! nfa_print_state(debugf, prog->start); ! if (prog->reganch) ! fprintf(debugf, "reganch: %d\n", prog->reganch); ! if (prog->regstart != NUL) ! fprintf(debugf, "regstart: %c (decimal: %d)\n", ! prog->regstart, prog->regstart); ! if (prog->match_text != NULL) ! fprintf(debugf, "match_text: \"%s\"\n", prog->match_text); ! fclose(debugf); ! } } #endif // ENABLE_LOG #endif // DEBUG --- 2883,2902 ---- { FILE *debugf = fopen(NFA_REGEXP_DUMP_LOG, "a"); ! if (debugf == NULL) ! return; ! nfa_print_state(debugf, prog->start); ! if (prog->reganch) ! fprintf(debugf, "reganch: %d\n", prog->reganch); ! if (prog->regstart != NUL) ! fprintf(debugf, "regstart: %c (decimal: %d)\n", ! prog->regstart, prog->regstart); ! if (prog->match_text != NULL) ! fprintf(debugf, "match_text: \"%s\"\n", prog->match_text); ! ! fclose(debugf); } #endif // ENABLE_LOG #endif // DEBUG *************** *** 4096,4116 **** copy_sub(regsub_T *to, regsub_T *from) { to->in_use = from->in_use; ! if (from->in_use > 0) { ! // Copy the match start and end positions. ! if (REG_MULTI) ! { ! mch_memmove(&to->list.multi[0], ! &from->list.multi[0], ! sizeof(struct multipos) * from->in_use); ! to->orig_start_col = from->orig_start_col; ! } ! else ! mch_memmove(&to->list.line[0], ! &from->list.line[0], ! sizeof(struct linepos) * from->in_use); } } /* --- 4096,4116 ---- copy_sub(regsub_T *to, regsub_T *from) { to->in_use = from->in_use; ! if (from->in_use <= 0) ! return; ! ! // Copy the match start and end positions. ! if (REG_MULTI) { ! mch_memmove(&to->list.multi[0], ! &from->list.multi[0], ! sizeof(struct multipos) * from->in_use); ! to->orig_start_col = from->orig_start_col; } + else + mch_memmove(&to->list.line[0], + &from->list.line[0], + sizeof(struct linepos) * from->in_use); } /* *************** *** 4121,4138 **** { if (to->in_use < from->in_use) to->in_use = from->in_use; ! if (from->in_use > 1) ! { ! // Copy the match start and end positions. ! if (REG_MULTI) ! mch_memmove(&to->list.multi[1], ! &from->list.multi[1], ! sizeof(struct multipos) * (from->in_use - 1)); ! else ! mch_memmove(&to->list.line[1], ! &from->list.line[1], ! sizeof(struct linepos) * (from->in_use - 1)); ! } } /* --- 4121,4138 ---- { if (to->in_use < from->in_use) to->in_use = from->in_use; ! if (from->in_use <= 1) ! return; ! ! // Copy the match start and end positions. ! if (REG_MULTI) ! mch_memmove(&to->list.multi[1], ! &from->list.multi[1], ! sizeof(struct multipos) * (from->in_use - 1)); ! else ! mch_memmove(&to->list.line[1], ! &from->list.line[1], ! sizeof(struct linepos) * (from->in_use - 1)); } /* *************** *** 4141,4162 **** static void copy_ze_off(regsub_T *to, regsub_T *from) { ! if (rex.nfa_has_zend) { ! if (REG_MULTI) { ! if (from->list.multi[0].end_lnum >= 0) ! { ! to->list.multi[0].end_lnum = from->list.multi[0].end_lnum; ! to->list.multi[0].end_col = from->list.multi[0].end_col; ! } ! } ! else ! { ! if (from->list.line[0].end != NULL) ! to->list.line[0].end = from->list.line[0].end; } } } /* --- 4141,4162 ---- static void copy_ze_off(regsub_T *to, regsub_T *from) { ! if (!rex.nfa_has_zend) ! return; ! ! if (REG_MULTI) { ! if (from->list.multi[0].end_lnum >= 0) { ! to->list.multi[0].end_lnum = from->list.multi[0].end_lnum; ! to->list.multi[0].end_col = from->list.multi[0].end_col; } } + else + { + if (from->list.line[0].end != NULL) + to->list.line[0].end = from->list.line[0].end; + } } /* *************** *** 7568,7579 **** static void nfa_regfree(regprog_T *prog) { ! if (prog != NULL) ! { ! vim_free(((nfa_regprog_T *)prog)->match_text); ! vim_free(((nfa_regprog_T *)prog)->pattern); ! vim_free(prog); ! } } /* --- 7568,7579 ---- static void nfa_regfree(regprog_T *prog) { ! if (prog == NULL) ! return; ! ! vim_free(((nfa_regprog_T *)prog)->match_text); ! vim_free(((nfa_regprog_T *)prog)->pattern); ! vim_free(prog); } /* *** ../vim-9.0.1220/src/register.c 2023-01-17 19:48:02.759310921 +0000 --- src/register.c 2023-01-18 18:14:09.156963088 +0000 *************** *** 294,318 **** get_yank_register(name, 0); reg = ALLOC_ONE(yankreg_T); ! if (reg != NULL) { ! *reg = *y_current; ! if (copy) { ! // If we run out of memory some or all of the lines are empty. ! if (reg->y_size == 0) ! reg->y_array = NULL; ! else ! reg->y_array = ALLOC_MULT(char_u *, reg->y_size); ! if (reg->y_array != NULL) ! { ! for (i = 0; i < reg->y_size; ++i) ! reg->y_array[i] = vim_strsave(y_current->y_array[i]); ! } } - else - y_current->y_array = NULL; } return (void *)reg; } --- 294,318 ---- get_yank_register(name, 0); reg = ALLOC_ONE(yankreg_T); ! if (reg == NULL) ! return (void *)NULL; ! ! *reg = *y_current; ! if (copy) { ! // If we run out of memory some or all of the lines are empty. ! if (reg->y_size == 0) ! reg->y_array = NULL; ! else ! reg->y_array = ALLOC_MULT(char_u *, reg->y_size); ! if (reg->y_array != NULL) { ! for (i = 0; i < reg->y_size; ++i) ! reg->y_array[i] = vim_strsave(y_current->y_array[i]); } } + else + y_current->y_array = NULL; return (void *)reg; } *************** *** 716,737 **** { char_u buf[3]; ! if (restart_edit != NUL) { ! if (restart_edit == 'V') ! { ! buf[0] = 'g'; ! buf[1] = 'R'; ! buf[2] = NUL; ! } ! else ! { ! buf[0] = restart_edit == 'I' ? 'i' : restart_edit; ! buf[1] = NUL; ! } ! if (ins_typebuf(buf, REMAP_NONE, 0, TRUE, silent) == OK) ! restart_edit = NUL; } } /* --- 716,737 ---- { char_u buf[3]; ! if (restart_edit == NUL) ! return; ! ! if (restart_edit == 'V') { ! buf[0] = 'g'; ! buf[1] = 'R'; ! buf[2] = NUL; ! } ! else ! { ! buf[0] = restart_edit == 'I' ? 'i' : restart_edit; ! buf[1] = NUL; } + if (ins_typebuf(buf, REMAP_NONE, 0, TRUE, silent) == OK) + restart_edit = NUL; } /* *************** *** 1097,1110 **** static void free_yank(long n) { ! if (y_current->y_array != NULL) ! { ! long i; ! for (i = n; --i >= 0; ) ! vim_free(y_current->y_array[i]); ! VIM_CLEAR(y_current->y_array); ! } } void --- 1097,1110 ---- static void free_yank(long n) { ! if (y_current->y_array == NULL) ! return; ! long i; ! ! for (i = n; --i >= 0; ) ! vim_free(y_current->y_array[i]); ! VIM_CLEAR(y_current->y_array); } void *************** *** 2695,2717 **** } retval = alloc(len + 1); // Copy the lines of the yank register into the string. ! if (retval != NULL) { ! len = 0; ! for (i = 0; i < y_current->y_size; ++i) ! { ! STRCPY(retval + len, y_current->y_array[i]); ! len += (long)STRLEN(retval + len); ! // Insert a NL between lines and after the last line if y_type is ! // MLINE. ! if (y_current->y_type == MLINE || i < y_current->y_size - 1) ! retval[len++] = '\n'; ! } ! retval[len] = NUL; } return retval; } --- 2695,2716 ---- } retval = alloc(len + 1); + if (retval == NULL) + return NULL; // Copy the lines of the yank register into the string. ! len = 0; ! for (i = 0; i < y_current->y_size; ++i) { ! STRCPY(retval + len, y_current->y_array[i]); ! len += (long)STRLEN(retval + len); ! // Insert a NL between lines and after the last line if y_type is ! // MLINE. ! if (y_current->y_type == MLINE || i < y_current->y_size - 1) ! retval[len++] = '\n'; } + retval[len] = NUL; return retval; } *** ../vim-9.0.1220/src/version.c 2023-01-18 17:20:20.863136716 +0000 --- src/version.c 2023-01-18 18:15:07.984986670 +0000 *************** *** 697,698 **** --- 697,700 ---- { /* Add new patch number below this line */ + /**/ + 1221, /**/ -- In many of the more relaxed civilizations on the Outer Eastern Rim of the Galaxy, "The Hitchhiker's Guide to the Galaxy" has already supplanted the great "Encyclopedia Galactica" as the standard repository of all knowledge and wisdom, for though it has many omissions and contains much that is apocryphal, or at least wildly inaccurate, it scores over the older, more pedestrian work in two important respects. First, it is slightly cheaper; and second, it has the words "DON'T PANIC" inscribed in large friendly letters on its cover. -- Douglas Adams, "The Hitchhiker's Guide to the Galaxy" /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ /// \\\ \\\ sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ /// \\\ help me help AIDS victims -- http://ICCF-Holland.org ///