To: vim_dev@googlegroups.com Subject: Patch 9.0.0601 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 9.0.0601 Problem: Too much indent. Solution: Return out early from a funtion. (Yegappan Lakshmanan, close #11238) Files: src/beval.c, src/blob.c *** ../vim-9.0.0600/src/beval.c 2022-07-25 18:13:33.046580756 +0100 --- src/beval.c 2022-09-27 11:40:09.701171458 +0100 *************** *** 39,132 **** *textp = NULL; wp = mouse_find_win(&row, &col, FAIL_POPUP); ! if (wp != NULL && row >= 0 && row < wp->w_height && col < wp->w_width) { ! // Found a window and the cursor is in the text. Now find the line ! // number. ! if (!mouse_comp_pos(wp, &row, &col, &lnum, NULL)) { ! // Not past end of the file. ! lbuf = ml_get_buf(wp->w_buffer, lnum, FALSE); ! if (col <= win_linetabsize(wp, lnum, lbuf, (colnr_T)MAXCOL)) { ! // Not past end of line. ! if (getword) ! { ! // For Netbeans we get the relevant part of the line ! // instead of the whole line. ! int len; ! pos_T *spos = NULL, *epos = NULL; ! ! if (VIsual_active) ! { ! if (LT_POS(VIsual, curwin->w_cursor)) ! { ! spos = &VIsual; ! epos = &curwin->w_cursor; ! } ! else ! { ! spos = &curwin->w_cursor; ! epos = &VIsual; ! } ! } ! ! col = vcol2col(wp, lnum, col); ! scol = col; ! ! if (VIsual_active ! && wp->w_buffer == curwin->w_buffer ! && (lnum == spos->lnum ! ? col >= (int)spos->col ! : lnum > spos->lnum) ! && (lnum == epos->lnum ! ? col <= (int)epos->col ! : lnum < epos->lnum)) ! { ! // Visual mode and pointing to the line with the ! // Visual selection: return selected text, with a ! // maximum of one line. ! if (spos->lnum != epos->lnum || spos->col == epos->col) ! return FAIL; ! ! lbuf = ml_get_buf(curwin->w_buffer, VIsual.lnum, FALSE); ! len = epos->col - spos->col; ! if (*p_sel != 'e') ! len += mb_ptr2len(lbuf + epos->col); ! lbuf = vim_strnsave(lbuf + spos->col, len); ! lnum = spos->lnum; ! col = spos->col; ! scol = col; ! } ! else ! { ! // Find the word under the cursor. ! ++emsg_off; ! len = find_ident_at_pos(wp, lnum, (colnr_T)col, ! &lbuf, &scol, flags); ! --emsg_off; ! if (len == 0) ! return FAIL; ! lbuf = vim_strnsave(lbuf, len); ! } ! } ! else ! scol = col; ! ! if (winp != NULL) ! *winp = wp; ! if (lnump != NULL) ! *lnump = lnum; ! *textp = lbuf; ! if (colp != NULL) ! *colp = col; ! if (startcolp != NULL) ! *startcolp = scol; ! return OK; } } } ! return FAIL; } #endif --- 39,132 ---- *textp = NULL; wp = mouse_find_win(&row, &col, FAIL_POPUP); ! if (wp == NULL || row < 0 || row >= wp->w_height || col >= wp->w_width) ! return FAIL; ! ! // Found a window and the cursor is in the text. Now find the line ! // number. ! if (mouse_comp_pos(wp, &row, &col, &lnum, NULL)) ! return FAIL; // position is below the last line ! ! // Not past end of the file. ! lbuf = ml_get_buf(wp->w_buffer, lnum, FALSE); ! if (col > win_linetabsize(wp, lnum, lbuf, (colnr_T)MAXCOL)) ! return FAIL; // past end of line ! ! // Not past end of line. ! if (getword) { ! // For Netbeans we get the relevant part of the line ! // instead of the whole line. ! int len; ! pos_T *spos = NULL, *epos = NULL; ! ! if (VIsual_active) { ! if (LT_POS(VIsual, curwin->w_cursor)) ! { ! spos = &VIsual; ! epos = &curwin->w_cursor; ! } ! else { ! spos = &curwin->w_cursor; ! epos = &VIsual; } } + + col = vcol2col(wp, lnum, col); + scol = col; + + if (VIsual_active + && wp->w_buffer == curwin->w_buffer + && (lnum == spos->lnum + ? col >= (int)spos->col + : lnum > spos->lnum) + && (lnum == epos->lnum + ? col <= (int)epos->col + : lnum < epos->lnum)) + { + // Visual mode and pointing to the line with the + // Visual selection: return selected text, with a + // maximum of one line. + if (spos->lnum != epos->lnum || spos->col == epos->col) + return FAIL; + + lbuf = ml_get_buf(curwin->w_buffer, VIsual.lnum, FALSE); + len = epos->col - spos->col; + if (*p_sel != 'e') + len += mb_ptr2len(lbuf + epos->col); + lbuf = vim_strnsave(lbuf + spos->col, len); + lnum = spos->lnum; + col = spos->col; + scol = col; + } + else + { + // Find the word under the cursor. + ++emsg_off; + len = find_ident_at_pos(wp, lnum, (colnr_T)col, + &lbuf, &scol, flags); + --emsg_off; + if (len == 0) + return FAIL; + lbuf = vim_strnsave(lbuf, len); + } } ! else ! scol = col; ! ! if (winp != NULL) ! *winp = wp; ! if (lnump != NULL) ! *lnump = lnum; ! *textp = lbuf; ! if (colp != NULL) ! *colp = col; ! if (startcolp != NULL) ! *startcolp = scol; ! ! return OK; } #endif *************** *** 220,225 **** --- 220,311 ---- ) && msg_scrolled == 0; } + # ifdef FEAT_EVAL + /* + * Evaluate the expression 'bexpr' and set the text in the balloon 'beval'. + */ + static void + bexpr_eval( + BalloonEval *beval, + char_u *bexpr, + win_T *wp, + linenr_T lnum, + int col, + char_u *text) + { + win_T *cw; + long winnr = 0; + buf_T *save_curbuf; + int use_sandbox; + static char_u *result = NULL; + size_t len; + + sctx_T save_sctx = current_sctx; + + // Convert window pointer to number. + for (cw = firstwin; cw != wp; cw = cw->w_next) + ++winnr; + + set_vim_var_nr(VV_BEVAL_BUFNR, (long)wp->w_buffer->b_fnum); + set_vim_var_nr(VV_BEVAL_WINNR, winnr); + set_vim_var_nr(VV_BEVAL_WINID, wp->w_id); + set_vim_var_nr(VV_BEVAL_LNUM, (long)lnum); + set_vim_var_nr(VV_BEVAL_COL, (long)(col + 1)); + set_vim_var_string(VV_BEVAL_TEXT, text, -1); + vim_free(text); + + /* + * Temporarily change the curbuf, so that we can determine whether + * the buffer-local balloonexpr option was set insecurely. + */ + save_curbuf = curbuf; + curbuf = wp->w_buffer; + use_sandbox = was_set_insecurely((char_u *)"balloonexpr", + *curbuf->b_p_bexpr == NUL ? 0 : OPT_LOCAL); + curbuf = save_curbuf; + if (use_sandbox) + ++sandbox; + ++textlock; + + if (bexpr == p_bexpr) + { + sctx_T *sp = get_option_sctx("balloonexpr"); + + if (sp != NULL) + current_sctx = *sp; + } + else + current_sctx = curbuf->b_p_script_ctx[BV_BEXPR]; + + vim_free(result); + result = eval_to_string(bexpr, TRUE); + + // Remove one trailing newline, it is added when the result was a + // list and it's hardly ever useful. If the user really wants a + // trailing newline he can add two and one remains. + if (result != NULL) + { + len = STRLEN(result); + if (len > 0 && result[len - 1] == NL) + result[len - 1] = NUL; + } + + if (use_sandbox) + --sandbox; + --textlock; + current_sctx = save_sctx; + + set_vim_var_string(VV_BEVAL_TEXT, NULL, -1); + if (result != NULL && result[0] != NUL) + post_balloon(beval, result, NULL); + + // The 'balloonexpr' evaluation may show something on the screen + // that requires a screen update. + if (must_redraw) + redraw_after_callback(FALSE, FALSE); + } + # endif + /* * Common code, invoked when the mouse is resting for a moment. */ *************** *** 229,243 **** #ifdef FEAT_EVAL win_T *wp; int col; - int use_sandbox; linenr_T lnum; char_u *text; - static char_u *result = NULL; - long winnr = 0; char_u *bexpr; - buf_T *save_curbuf; - size_t len; - win_T *cw; #endif static int recursive = FALSE; --- 315,323 ---- *************** *** 259,328 **** : wp->w_buffer->b_p_bexpr; if (*bexpr != NUL) { ! sctx_T save_sctx = current_sctx; ! ! // Convert window pointer to number. ! for (cw = firstwin; cw != wp; cw = cw->w_next) ! ++winnr; ! ! set_vim_var_nr(VV_BEVAL_BUFNR, (long)wp->w_buffer->b_fnum); ! set_vim_var_nr(VV_BEVAL_WINNR, winnr); ! set_vim_var_nr(VV_BEVAL_WINID, wp->w_id); ! set_vim_var_nr(VV_BEVAL_LNUM, (long)lnum); ! set_vim_var_nr(VV_BEVAL_COL, (long)(col + 1)); ! set_vim_var_string(VV_BEVAL_TEXT, text, -1); ! vim_free(text); ! ! /* ! * Temporarily change the curbuf, so that we can determine whether ! * the buffer-local balloonexpr option was set insecurely. ! */ ! save_curbuf = curbuf; ! curbuf = wp->w_buffer; ! use_sandbox = was_set_insecurely((char_u *)"balloonexpr", ! *curbuf->b_p_bexpr == NUL ? 0 : OPT_LOCAL); ! curbuf = save_curbuf; ! if (use_sandbox) ! ++sandbox; ! ++textlock; ! ! if (bexpr == p_bexpr) ! { ! sctx_T *sp = get_option_sctx("balloonexpr"); ! ! if (sp != NULL) ! current_sctx = *sp; ! } ! else ! current_sctx = curbuf->b_p_script_ctx[BV_BEXPR]; ! ! vim_free(result); ! result = eval_to_string(bexpr, TRUE); ! ! // Remove one trailing newline, it is added when the result was a ! // list and it's hardly ever useful. If the user really wants a ! // trailing newline he can add two and one remains. ! if (result != NULL) ! { ! len = STRLEN(result); ! if (len > 0 && result[len - 1] == NL) ! result[len - 1] = NUL; ! } ! ! if (use_sandbox) ! --sandbox; ! --textlock; ! current_sctx = save_sctx; ! ! set_vim_var_string(VV_BEVAL_TEXT, NULL, -1); ! if (result != NULL && result[0] != NUL) ! post_balloon(beval, result, NULL); ! ! // The 'balloonexpr' evaluation may show something on the screen ! // that requires a screen update. ! if (must_redraw) ! redraw_after_callback(FALSE, FALSE); ! recursive = FALSE; return; } --- 339,345 ---- : wp->w_buffer->b_p_bexpr; if (*bexpr != NUL) { ! bexpr_eval(beval, bexpr, wp, lnum, col, text); recursive = FALSE; return; } *** ../vim-9.0.0600/src/blob.c 2022-09-22 17:06:56.299037474 +0100 --- src/blob.c 2022-09-27 11:40:09.701171458 +0100 *************** *** 60,88 **** int blob_copy(blob_T *from, typval_T *to) { ! int ret = OK; to->v_type = VAR_BLOB; to->v_lock = 0; if (from == NULL) - to->vval.v_blob = NULL; - else if (rettv_blob_alloc(to) == FAIL) - ret = FAIL; - else { ! int len = from->bv_ga.ga_len; ! if (len > 0) ! { ! to->vval.v_blob->bv_ga.ga_data = ! vim_memsave(from->bv_ga.ga_data, len); ! if (to->vval.v_blob->bv_ga.ga_data == NULL) ! len = 0; ! } ! to->vval.v_blob->bv_ga.ga_len = len; ! to->vval.v_blob->bv_ga.ga_maxlen = len; } ! return ret; } void --- 60,90 ---- int blob_copy(blob_T *from, typval_T *to) { ! int len; to->v_type = VAR_BLOB; to->v_lock = 0; if (from == NULL) { ! to->vval.v_blob = NULL; ! return OK; ! } ! if (rettv_blob_alloc(to) == FAIL) ! return FAIL; ! ! len = from->bv_ga.ga_len; ! if (len > 0) ! { ! to->vval.v_blob->bv_ga.ga_data = ! vim_memsave(from->bv_ga.ga_data, len); ! if (to->vval.v_blob->bv_ga.ga_data == NULL) ! len = 0; } ! to->vval.v_blob->bv_ga.ga_len = len; ! to->vval.v_blob->bv_ga.ga_maxlen = len; ! ! return OK; } void *************** *** 280,359 **** return NULL; } ! int ! blob_slice_or_index( blob_T *blob, ! int is_range, varnumber_T n1, varnumber_T n2, int exclusive, typval_T *rettv) { ! long len = blob_len(blob); ! ! if (is_range) { ! // The resulting variable is a sub-blob. If the indexes ! // are out of range the result is empty. if (n1 < 0) { ! n1 = len + n1; ! if (n1 < 0) ! n1 = 0; ! } ! if (n2 < 0) ! n2 = len + n2; ! else if (n2 >= len) ! n2 = len - (exclusive ? 0 : 1); ! if (exclusive) ! --n2; ! if (n1 >= len || n2 < 0 || n1 > n2) ! { clear_tv(rettv); ! rettv->v_type = VAR_BLOB; ! rettv->vval.v_blob = NULL; } ! else ! { ! blob_T *new_blob = blob_alloc(); ! long i; ! if (new_blob != NULL) ! { ! if (ga_grow(&new_blob->bv_ga, n2 - n1 + 1) == FAIL) ! { ! blob_free(new_blob); ! return FAIL; ! } ! new_blob->bv_ga.ga_len = n2 - n1 + 1; ! for (i = n1; i <= n2; i++) ! blob_set(new_blob, i - n1, blob_get(blob, i)); ! clear_tv(rettv); ! rettv_blob_set(rettv, new_blob); ! } ! } } else { ! // The resulting variable is a byte value. ! // If the index is too big or negative that is an error. ! if (n1 < 0) ! n1 = len + n1; ! if (n1 < len && n1 >= 0) ! { ! int v = blob_get(blob, n1); ! ! clear_tv(rettv); ! rettv->v_type = VAR_NUMBER; ! rettv->vval.v_number = v; ! } ! else ! { ! semsg(_(e_blob_index_out_of_range_nr), n1); ! return FAIL; ! } } return OK; } --- 282,389 ---- return NULL; } ! /* ! * Returns a slice of 'blob' from index 'n1' to 'n2' in 'rettv'. The length of ! * the blob is 'len'. Returns an empty blob if the indexes are out of range. ! */ ! static int ! blob_slice( blob_T *blob, ! long len, varnumber_T n1, varnumber_T n2, int exclusive, typval_T *rettv) { ! if (n1 < 0) { ! n1 = len + n1; if (n1 < 0) + n1 = 0; + } + if (n2 < 0) + n2 = len + n2; + else if (n2 >= len) + n2 = len - (exclusive ? 0 : 1); + if (exclusive) + --n2; + if (n1 >= len || n2 < 0 || n1 > n2) + { + clear_tv(rettv); + rettv->v_type = VAR_BLOB; + rettv->vval.v_blob = NULL; + } + else + { + blob_T *new_blob = blob_alloc(); + long i; + + if (new_blob != NULL) { ! if (ga_grow(&new_blob->bv_ga, n2 - n1 + 1) == FAIL) ! { ! blob_free(new_blob); ! return FAIL; ! } ! new_blob->bv_ga.ga_len = n2 - n1 + 1; ! for (i = n1; i <= n2; i++) ! blob_set(new_blob, i - n1, blob_get(blob, i)); ! clear_tv(rettv); ! rettv_blob_set(rettv, new_blob); } ! } ! return OK; ! } ! /* ! * Return the byte value in 'blob' at index 'idx' in 'rettv'. If the index is ! * too big or negative that is an error. The length of the blob is 'len'. ! */ ! static int ! blob_index( ! blob_T *blob, ! int len, ! varnumber_T idx, ! typval_T *rettv) ! { ! // The resulting variable is a byte value. ! // If the index is too big or negative that is an error. ! if (idx < 0) ! idx = len + idx; ! if (idx < len && idx >= 0) ! { ! int v = blob_get(blob, idx); ! ! clear_tv(rettv); ! rettv->v_type = VAR_NUMBER; ! rettv->vval.v_number = v; } else { ! semsg(_(e_blob_index_out_of_range_nr), idx); ! return FAIL; } + + return OK; + } + + int + blob_slice_or_index( + blob_T *blob, + int is_range, + varnumber_T n1, + varnumber_T n2, + int exclusive, + typval_T *rettv) + { + long len = blob_len(blob); + + if (is_range) + return blob_slice(blob, len, n1, n2, exclusive, rettv); + else + return blob_index(blob, len, n1, rettv); return OK; } *** ../vim-9.0.0600/src/version.c 2022-09-27 11:35:06.095028109 +0100 --- src/version.c 2022-09-27 11:41:38.576725100 +0100 *************** *** 701,702 **** --- 701,704 ---- { /* Add new patch number below this line */ + /**/ + 601, /**/ -- hundred-and-one symptoms of being an internet addict: 190. You quickly hand over your wallet, leather jacket, and car keys during a mugging, then proceed to beat the crap out of your assailant when he asks for your laptop. /// 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 ///