mirror of
https://github.com/neovim/neovim.git
synced 2025-09-16 08:18:17 +00:00
vim-patch:8.2.2957: using getchar() in Vim9 script is problematic
Problem: Using getchar() in Vim9 script is problematic.
Solution: Add getcharstr(). (closes vim/vim#8343)
3a7503c34c
Cherry-pick Test_getchar() changes from patch v8.1.2304
to sync with upstream.
Port f_getcharstr() to src/nvim/eval/funcs.c, not src/nvim/getchar.c.
Patch v8.1.2042 is not ported yet.
This commit is contained in:
@@ -3028,10 +3028,9 @@ static void f_getchangelist(typval_T *argvars, typval_T *rettv, FunPtr fptr)
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* "getchar()" function
|
||||
*/
|
||||
static void f_getchar(typval_T *argvars, typval_T *rettv, FunPtr fptr)
|
||||
// "getchar()" and "getcharstr()" functions
|
||||
static void getchar_common(typval_T *argvars, typval_T *rettv)
|
||||
FUNC_ATTR_NONNULL_ALL
|
||||
{
|
||||
varnumber_T n;
|
||||
bool error = false;
|
||||
@@ -3098,6 +3097,7 @@ static void f_getchar(typval_T *argvars, typval_T *rettv, FunPtr fptr)
|
||||
} else {
|
||||
i += utf_char2bytes(n, temp + i);
|
||||
}
|
||||
assert(i < 10);
|
||||
temp[i++] = NUL;
|
||||
rettv->v_type = VAR_STRING;
|
||||
rettv->vval.v_string = vim_strsave(temp);
|
||||
@@ -3106,15 +3106,14 @@ static void f_getchar(typval_T *argvars, typval_T *rettv, FunPtr fptr)
|
||||
int row = mouse_row;
|
||||
int col = mouse_col;
|
||||
int grid = mouse_grid;
|
||||
win_T *win;
|
||||
linenr_T lnum;
|
||||
win_T *wp;
|
||||
int winnr = 1;
|
||||
|
||||
if (row >= 0 && col >= 0) {
|
||||
/* Find the window at the mouse coordinates and compute the
|
||||
* text position. */
|
||||
win = mouse_find_win(&grid, &row, &col);
|
||||
// Find the window at the mouse coordinates and compute the
|
||||
// text position.
|
||||
win_T *const win = mouse_find_win(&grid, &row, &col);
|
||||
if (win == NULL) {
|
||||
return;
|
||||
}
|
||||
@@ -3130,6 +3129,32 @@ static void f_getchar(typval_T *argvars, typval_T *rettv, FunPtr fptr)
|
||||
}
|
||||
}
|
||||
|
||||
// "getchar()" function
|
||||
static void f_getchar(typval_T *argvars, typval_T *rettv, FunPtr fptr)
|
||||
{
|
||||
getchar_common(argvars, rettv);
|
||||
}
|
||||
|
||||
// "getcharstr()" function
|
||||
static void f_getcharstr(typval_T *argvars, typval_T *rettv, FunPtr fptr)
|
||||
{
|
||||
getchar_common(argvars, rettv);
|
||||
|
||||
if (rettv->v_type == VAR_NUMBER) {
|
||||
char_u temp[7]; // mbyte-char: 6, NUL: 1
|
||||
const varnumber_T n = rettv->vval.v_number;
|
||||
int i = 0;
|
||||
|
||||
if (n != 0) {
|
||||
i += utf_char2bytes(n, temp);
|
||||
}
|
||||
assert(i < 7);
|
||||
temp[i++] = NUL;
|
||||
rettv->v_type = VAR_STRING;
|
||||
rettv->vval.v_string = vim_strsave(temp);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* "getcharmod()" function
|
||||
*/
|
||||
|
Reference in New Issue
Block a user