From: Bakudankun Date: Sun, 23 Feb 2025 19:29:21 +0000 (+0100) Subject: patch 9.1.1144: no way to create raw strings from a blob X-Git-Tag: v9.1.1144^0 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=b3854bfc543f0628699f58315ce6ec02dd59e415;p=thirdparty%2Fvim.git patch 9.1.1144: no way to create raw strings from a blob Problem: no way to create raw strings from a blob Solution: support the "encoding": "none" option to create raw strings (which may be invalid!) (Bakudankun) closes: #16666 Signed-off-by: Bakudankun Signed-off-by: Christian Brabandt --- diff --git a/runtime/doc/builtin.txt b/runtime/doc/builtin.txt index 344dfdfd88..80b8a9cc4a 100644 --- a/runtime/doc/builtin.txt +++ b/runtime/doc/builtin.txt @@ -1,4 +1,4 @@ -*builtin.txt* For Vim version 9.1. Last change: 2025 Feb 17 +*builtin.txt* For Vim version 9.1. Last change: 2025 Feb 23 VIM REFERENCE MANUAL by Bram Moolenaar @@ -1309,10 +1309,14 @@ blob2str({blob} [, {options}]) *blob2str()* items: encoding Decode the bytes in {blob} using this encoding. The value is a |String|. See - |encoding-names| for the supported values. + |encoding-names| for the supported values + (plus the special value "none"). *E1515* - An error is given and an empty List is returned if - an invalid byte sequence is encountered in {blob}, + When current 'encoding' is "utf-8", an error is given and an + empty List is returned if an invalid byte sequence is + encountered in {blob}. To suppress this validation and get + potentially invalid string, set "encoding" in {options} to + "none". Returns an empty List if blob is empty. @@ -10645,7 +10649,8 @@ str2blob({list} [, {options}]) *str2blob()* The argument {options} is a |Dict| and supports the following items: - encoding Encode the characters using this encoding. + encoding Convert the characters using this encoding + before making the Blob. The value is a |String|. See |encoding-names| for the supported values. diff --git a/src/strings.c b/src/strings.c index 5de3162bb0..9e39c45acb 100644 --- a/src/strings.c +++ b/src/strings.c @@ -1289,7 +1289,7 @@ f_blob2str(typval_T *argvars, typval_T *rettv) blob_T *blob; int blen; long idx; - int utf8_inuse = FALSE; + int validate_utf8 = FALSE; if (check_for_blob_arg(argvars, 0) == FAIL || check_for_opt_dict_arg(argvars, 1) == FAIL) @@ -1316,7 +1316,14 @@ f_blob2str(typval_T *argvars, typval_T *rettv) } if (STRCMP(p_enc, "utf-8") == 0 || STRCMP(p_enc, "utf8") == 0) - utf8_inuse = TRUE; + validate_utf8 = TRUE; + + if (from_encoding != NULL && STRCMP(from_encoding, "none") == 0) + { + validate_utf8 = FALSE; + vim_free(from_encoding); + from_encoding = NULL; + } idx = 0; while (idx < blen) @@ -1340,7 +1347,7 @@ f_blob2str(typval_T *argvars, typval_T *rettv) } } - if (utf8_inuse) + if (validate_utf8) { if (!utf_valid_string(converted_str, NULL)) { diff --git a/src/testdir/test_functions.vim b/src/testdir/test_functions.vim index 8ecc3a6710..6928cda8d4 100644 --- a/src/testdir/test_functions.vim +++ b/src/testdir/test_functions.vim @@ -4446,6 +4446,9 @@ func Test_blob2str() call assert_equal(['a'], blob2str(0z61, test_null_dict())) call assert_equal(['a'], blob2str(0z61, {'encoding': test_null_string()})) + call assert_equal(["\x80"], blob2str(0z80, {'encoding': 'none'})) + call assert_equal(['a', "\x80"], blob2str(0z610A80, {'encoding': 'none'})) + #" Invalid encoding call assert_fails("call blob2str(0z80)", "E1515: Unable to convert from 'utf-8' encoding") call assert_fails("call blob2str(0z610A80)", "E1515: Unable to convert from 'utf-8' encoding") diff --git a/src/version.c b/src/version.c index 07bede551a..5652fc34d3 100644 --- a/src/version.c +++ b/src/version.c @@ -704,6 +704,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 1144, /**/ 1143, /**/