diff options
Diffstat (limited to 'data/vim/patches/8.1.0741')
-rw-r--r-- | data/vim/patches/8.1.0741 | 292 |
1 files changed, 292 insertions, 0 deletions
diff --git a/data/vim/patches/8.1.0741 b/data/vim/patches/8.1.0741 new file mode 100644 index 000000000..0f485f98b --- /dev/null +++ b/data/vim/patches/8.1.0741 @@ -0,0 +1,292 @@ +To: vim_dev@googlegroups.com +Subject: Patch 8.1.0741 +Fcc: outbox +From: Bram Moolenaar <Bram@moolenaar.net> +Mime-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit +------------ + +Patch 8.1.0741 +Problem: Viminfo with Blob is not tested. +Solution: Extend the viminfo test. Fix reading a blob. Fixed storing a + special variable value. +Files: src/testdir/test_viminfo.vim, src/eval.c, src/blob.c, + src/proto/blob.pro + + +*** ../vim-8.1.0740/src/testdir/test_viminfo.vim 2017-08-30 20:45:28.000000000 +0200 +--- src/testdir/test_viminfo.vim 2019-01-13 17:13:36.651426379 +0100 +*************** +*** 39,52 **** +--- 39,74 ---- + " store a really long list, so line wrapping will occur in viminfo file + let test_list = range(1,100) + let g:MY_GLOBAL_LIST = test_list ++ let test_blob = 0z00112233445566778899aabbccddeeff ++ let g:MY_GLOBAL_BLOB = test_blob ++ let test_false = v:false ++ let g:MY_GLOBAL_FALSE = test_false ++ let test_true = v:true ++ let g:MY_GLOBAL_TRUE = test_true ++ let test_null = v:null ++ let g:MY_GLOBAL_NULL = test_null ++ let test_none = v:none ++ let g:MY_GLOBAL_NONE = test_none ++ + set viminfo='100,<50,s10,h,!,nviminfo + wv! Xviminfo ++ + unlet g:MY_GLOBAL_DICT + unlet g:MY_GLOBAL_LIST ++ unlet g:MY_GLOBAL_BLOB ++ unlet g:MY_GLOBAL_FALSE ++ unlet g:MY_GLOBAL_TRUE ++ unlet g:MY_GLOBAL_NULL ++ unlet g:MY_GLOBAL_NONE + + rv! Xviminfo + call assert_equal(test_dict, g:MY_GLOBAL_DICT) + call assert_equal(test_list, g:MY_GLOBAL_LIST) ++ call assert_equal(test_blob, g:MY_GLOBAL_BLOB) ++ call assert_equal(test_false, g:MY_GLOBAL_FALSE) ++ call assert_equal(test_true, g:MY_GLOBAL_TRUE) ++ call assert_equal(test_null, g:MY_GLOBAL_NULL) ++ call assert_equal(test_none, g:MY_GLOBAL_NONE) + + call delete('Xviminfo') + set viminfo-=! +*** ../vim-8.1.0740/src/eval.c 2019-01-13 16:46:18.807309467 +0100 +--- src/eval.c 2019-01-13 17:45:45.167029149 +0100 +*************** +*** 5882,5914 **** + } + + case VAR_BLOB: +! if (tv->vval.v_blob == NULL) +! { +! *tofree = NULL; +! r = (char_u *)"[]"; +! } +! else +! { +! blob_T *b; +! int i; +! garray_T ga; +! +! // Store bytes in the growarray. +! ga_init2(&ga, 1, 4000); +! b = tv->vval.v_blob; +! ga_append(&ga, '['); +! for (i = 0; i < blob_len(b); i++) +! { +! if (i > 0) +! ga_concat(&ga, (char_u *)","); +! vim_snprintf((char *)numbuf, NUMBUFLEN, "0x%02X", +! (int)blob_get(b, i)); +! ga_concat(&ga, numbuf); +! } +! ga_append(&ga, ']'); +! *tofree = ga.ga_data; +! r = *tofree; +! } + break; + + case VAR_LIST: +--- 5882,5888 ---- + } + + case VAR_BLOB: +! r = blob2string(tv->vval.v_blob, tofree, numbuf); + break; + + case VAR_LIST: +*************** +*** 8948,8955 **** + if (tab != NULL) + { + tv.v_type = type; +! if (type == VAR_STRING || type == VAR_DICT || +! type == VAR_LIST || type == VAR_BLOB) + tv.vval.v_string = viminfo_readstring(virp, + (int)(tab - virp->vir_line + 1), TRUE); + #ifdef FEAT_FLOAT +--- 8922,8929 ---- + if (tab != NULL) + { + tv.v_type = type; +! if (type == VAR_STRING || type == VAR_DICT +! || type == VAR_LIST || type == VAR_BLOB) + tv.vval.v_string = viminfo_readstring(virp, + (int)(tab - virp->vir_line + 1), TRUE); + #ifdef FEAT_FLOAT +*************** +*** 8958,8964 **** + #endif + else + tv.vval.v_number = atol((char *)tab + 1); +! if (type == VAR_DICT || type == VAR_LIST || type == VAR_BLOB) + { + typval_T *etv = eval_expr(tv.vval.v_string, NULL); + +--- 8932,8938 ---- + #endif + else + tv.vval.v_number = atol((char *)tab + 1); +! if (type == VAR_DICT || type == VAR_LIST) + { + typval_T *etv = eval_expr(tv.vval.v_string, NULL); + +*************** +*** 8973,8978 **** +--- 8947,8966 ---- + vim_free(etv); + } + } ++ else if (type == VAR_BLOB) ++ { ++ blob_T *blob = string2blob(tv.vval.v_string); ++ ++ if (blob == NULL) ++ // Failed to parse back the blob, use it as a string. ++ tv.v_type = VAR_STRING; ++ else ++ { ++ vim_free(tv.vval.v_string); ++ tv.v_type = VAR_BLOB; ++ tv.vval.v_blob = blob; ++ } ++ } + + /* when in a function use global variables */ + save_funccal(&funccal_entry); +*************** +*** 9037,9043 **** + continue; + } + fprintf(fp, "!%s\t%s\t", this_var->di_key, s); +! p = echo_string(&this_var->di_tv, &tofree, numbuf, 0); + if (p != NULL) + viminfo_writestring(fp, p); + vim_free(tofree); +--- 9025,9039 ---- + continue; + } + fprintf(fp, "!%s\t%s\t", this_var->di_key, s); +! if (this_var->di_tv.v_type == VAR_SPECIAL) +! { +! sprintf((char *)numbuf, "%ld", +! (long)this_var->di_tv.vval.v_number); +! p = numbuf; +! tofree = NULL; +! } +! else +! p = echo_string(&this_var->di_tv, &tofree, numbuf, 0); + if (p != NULL) + viminfo_writestring(fp, p); + vim_free(tofree); +*** ../vim-8.1.0740/src/blob.c 2019-01-13 15:15:54.392762879 +0100 +--- src/blob.c 2019-01-13 17:42:19.000391564 +0100 +*************** +*** 167,170 **** +--- 167,237 ---- + return OK; + } + ++ /* ++ * Convert a blob to a readable form: "[0x11,0x34]" ++ */ ++ char_u * ++ blob2string(blob_T *blob, char_u **tofree, char_u *numbuf) ++ { ++ int i; ++ garray_T ga; ++ ++ if (blob == NULL) ++ { ++ *tofree = NULL; ++ return (char_u *)"[]"; ++ } ++ ++ // Store bytes in the growarray. ++ ga_init2(&ga, 1, 4000); ++ ga_append(&ga, '['); ++ for (i = 0; i < blob_len(blob); i++) ++ { ++ if (i > 0) ++ ga_concat(&ga, (char_u *)","); ++ vim_snprintf((char *)numbuf, NUMBUFLEN, "0x%02X", (int)blob_get(blob, i)); ++ ga_concat(&ga, numbuf); ++ } ++ ga_append(&ga, ']'); ++ *tofree = ga.ga_data; ++ return *tofree; ++ } ++ ++ /* ++ * Convert a string variable, in the format of blob2string(), to a blob. ++ * Return NULL when conversion failed. ++ */ ++ blob_T * ++ string2blob(char_u *str) ++ { ++ blob_T *blob = blob_alloc(); ++ char_u *s = str; ++ ++ if (*s != '[') ++ goto failed; ++ s = skipwhite(s + 1); ++ while (*s != ']') ++ { ++ if (s[0] != '0' || s[1] != 'x' ++ || !vim_isxdigit(s[2]) || !vim_isxdigit(s[3])) ++ goto failed; ++ ga_append(&blob->bv_ga, (hex2nr(s[2]) << 4) + hex2nr(s[3])); ++ s += 4; ++ if (*s == ',') ++ s = skipwhite(s + 1); ++ else if (*s != ']') ++ goto failed; ++ } ++ s = skipwhite(s + 1); ++ if (*s != NUL) ++ goto failed; // text after final ']' ++ ++ ++blob->bv_refcount; ++ return blob; ++ ++ failed: ++ blob_free(blob); ++ return NULL; ++ } ++ + #endif /* defined(FEAT_EVAL) */ +*** ../vim-8.1.0740/src/proto/blob.pro 2019-01-12 22:47:01.264088074 +0100 +--- src/proto/blob.pro 2019-01-13 17:34:42.075344422 +0100 +*************** +*** 10,13 **** +--- 10,15 ---- + int blob_equal(blob_T *b1, blob_T *b2); + int read_blob(FILE *fd, blob_T *blob); + int write_blob(FILE *fd, blob_T *blob); ++ char_u *blob2string(blob_T *blob, char_u **tofree, char_u *numbuf); ++ blob_T *string2blob(char_u *str); + /* vim: set ft=c : */ +*** ../vim-8.1.0740/src/version.c 2019-01-13 16:46:18.807309467 +0100 +--- src/version.c 2019-01-13 17:47:30.098331505 +0100 +*************** +*** 797,798 **** +--- 797,800 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 741, + /**/ + +-- +What is the difference between a professional and an amateur? +The ark was built by an amateur; professionals gave us the Titanic. + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ an exciting new programming language -- http://www.Zimbu.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// |