vim-patch:9.1.1774: cannot calculate sha256 of a Blob

Problem:  cannot calculate sha256() of a Blob
Solution: Change sha256() to accept a Blob or String argument
          (thinca).

closes: vim/vim#18336

4150283b83

Co-authored-by: thinca <thinca@gmail.com>
This commit is contained in:
zeertzjq
2025-09-21 06:16:20 +08:00
parent 19ba589946
commit 39a21d749d
5 changed files with 39 additions and 15 deletions

View File

@@ -10419,13 +10419,14 @@ M.funcs = {
base = 1,
desc = [=[
Returns a String with 64 hex characters, which is the SHA256
checksum of {string}.
checksum of {expr}.
{expr} is a String or a Blob.
]=],
name = 'sha256',
params = { { 'string', 'string' } },
params = { { 'expr', 'string' } },
returns = 'string',
signature = 'sha256({string})',
signature = 'sha256({expr})',
},
shellescape = {
args = { 1, 2 },

View File

@@ -7189,15 +7189,24 @@ static void f_settagstack(typval_T *argvars, typval_T *rettv, EvalFuncData fptr)
}
}
/// f_sha256 - sha256({string}) function
/// "sha256({expr})" function
static void f_sha256(typval_T *argvars, typval_T *rettv, EvalFuncData fptr)
{
const char *p = tv_get_string(&argvars[0]);
const char *hash = sha256_bytes((const uint8_t *)p, strlen(p), NULL, 0);
// make a copy of the hash (sha256_bytes returns a static buffer)
rettv->vval.v_string = xstrdup(hash);
rettv->v_type = VAR_STRING;
rettv->vval.v_string = NULL;
if (argvars[0].v_type == VAR_BLOB) {
blob_T *blob = argvars[0].vval.v_blob;
if (blob != NULL) {
const uint8_t *p = (uint8_t *)blob->bv_ga.ga_data;
int len = blob->bv_ga.ga_len;
rettv->vval.v_string = xstrdup(sha256_bytes(p, (size_t)len, NULL, 0));
}
} else {
const char *p = tv_get_string(&argvars[0]);
const char *hash = sha256_bytes((const uint8_t *)p, strlen(p), NULL, 0);
rettv->vval.v_string = xstrdup(hash);
}
}
/// "shellescape({string})" function