diff options
author | zeertzjq <zeertzjq@outlook.com> | 2023-02-28 21:07:56 +0800 |
---|---|---|
committer | zeertzjq <zeertzjq@outlook.com> | 2023-02-28 21:27:43 +0800 |
commit | 278aeee3aed753d1084597378e653395bd472c42 (patch) | |
tree | 4790d7d0eb363611d524dad5b09e2687bec2a1ec /src/nvim/eval/funcs.c | |
parent | 1e513fd112767e57f2b39dfaa395c83cb4f6a9f7 (diff) | |
download | rneovim-278aeee3aed753d1084597378e653395bd472c42.tar.gz rneovim-278aeee3aed753d1084597378e653395bd472c42.tar.bz2 rneovim-278aeee3aed753d1084597378e653395bd472c42.zip |
vim-patch:9.0.0430: cannot use repeat() with a blob
Problem: Cannot use repeat() with a blob.
Solution: Implement blob repeat. (closes vim/vim#11090)
https://github.com/vim/vim/commit/375141e1f80dced9be738568a3418f65813f4a2f
Co-authored-by: Bakudankun <bakudankun@gmail.com>
Diffstat (limited to 'src/nvim/eval/funcs.c')
-rw-r--r-- | src/nvim/eval/funcs.c | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/src/nvim/eval/funcs.c b/src/nvim/eval/funcs.c index 5da6233e38..4208c5ca46 100644 --- a/src/nvim/eval/funcs.c +++ b/src/nvim/eval/funcs.c @@ -5976,6 +5976,37 @@ static void f_repeat(typval_T *argvars, typval_T *rettv, EvalFuncData fptr) while (n-- > 0) { tv_list_extend(rettv->vval.v_list, argvars[0].vval.v_list, NULL); } + } else if (argvars[0].v_type == VAR_BLOB) { + tv_blob_alloc_ret(rettv); + if (argvars[0].vval.v_blob == NULL || n <= 0) { + return; + } + + const int slen = argvars[0].vval.v_blob->bv_ga.ga_len; + const int len = (int)(slen * n); + if (len <= 0) { + return; + } + + ga_grow(&rettv->vval.v_blob->bv_ga, len); + + rettv->vval.v_blob->bv_ga.ga_len = len; + + int i; + for (i = 0; i < slen; i++) { + if (tv_blob_get(argvars[0].vval.v_blob, i) != 0) { + break; + } + } + + if (i == slen) { + // No need to copy since all bytes are already zero + return; + } + + for (i = 0; i < n; i++) { + tv_blob_set_range(rettv->vval.v_blob, i * slen, (i + 1) * slen - 1, argvars); + } } else { rettv->v_type = VAR_STRING; rettv->vval.v_string = NULL; |