aboutsummaryrefslogtreecommitdiff
path: root/src/nvim/eval.c
diff options
context:
space:
mode:
authorSean Dewar <seandewar@users.noreply.github.com>2022-02-01 12:44:14 +0000
committerSean Dewar <seandewar@users.noreply.github.com>2022-02-12 12:00:36 +0000
commitcdb2c100118ab788772a6a0a1d60f555370fd201 (patch)
tree744caa88947432672753f274876ce726d866c1f3 /src/nvim/eval.c
parenta7321e37a75fff5c0048b0779cf91d504455d6f3 (diff)
downloadrneovim-cdb2c100118ab788772a6a0a1d60f555370fd201.tar.gz
rneovim-cdb2c100118ab788772a6a0a1d60f555370fd201.tar.bz2
rneovim-cdb2c100118ab788772a6a0a1d60f555370fd201.zip
vim-patch:8.2.0915: search() cannot skip over matches like searchpair() can
Problem: Search() cannot skip over matches like searchpair() can. Solution: Add an optional "skip" argument. (Christian Brabandt, closes vim/vim#861) https://github.com/vim/vim/commit/adc17a5f9d207fd1623fd923457a46efc9214777 Enable skip arg usage in autoload/freebasic.vim evalarg_T doesn't really matter because it's deleted in v8.2.0918 (and reincarnated for Vim9 script in v8.2.1047), but I found out too late :P Anyway: - Port evalarg_T into eval.h and use const char * and Callback fields - Use EVALARG_INIT to initialize - Return bool over OK/FAIL from evalarg functions - Remove check from evalarg_clean as callback_free ignores None callbacks anyway - Move eva_buf field into evalarg_get as a local (not sure what reason it has being in the struct) N/A patches for version.c: vim-patch:8.2.4355: unnecessary call to check_colorcolumn() Problem: Unnecessary call to check_colorcolumn(). Solution: Remove the call. (Sean Dewar, closes vim/vim#9748) https://github.com/vim/vim/commit/0f7ff851cb721bb3c07261adbf82b591229f530d
Diffstat (limited to 'src/nvim/eval.c')
-rw-r--r--src/nvim/eval.c61
1 files changed, 61 insertions, 0 deletions
diff --git a/src/nvim/eval.c b/src/nvim/eval.c
index c197754685..2d8d1694d1 100644
--- a/src/nvim/eval.c
+++ b/src/nvim/eval.c
@@ -3381,6 +3381,67 @@ static int eval_func(char_u **const arg, char_u *const name, const int name_len,
return ret;
}
+/// Process a function argument that can be a string expression or a function
+/// reference.
+/// "tv" must remain valid until calling evalarg_clean()!
+/// @return false when the argument is invalid.
+bool evalarg_get(typval_T *const tv, evalarg_T *const eva)
+ FUNC_ATTR_NONNULL_ALL
+{
+ if (tv->v_type == VAR_STRING || tv->v_type == VAR_NUMBER || tv->v_type == VAR_BOOL
+ || tv->v_type == VAR_SPECIAL) {
+ char numbuf[NUMBUFLEN];
+ eva->eva_string = tv_get_string_buf(tv, numbuf);
+ return true;
+ }
+
+ return callback_from_typval(&eva->eva_callback, tv);
+}
+
+/// @return whether "eva" has a valid expression or callback.
+bool evalarg_valid(const evalarg_T *const eva)
+ FUNC_ATTR_NONNULL_ALL FUNC_ATTR_CONST
+{
+ return eva->eva_string != NULL || eva->eva_callback.type != kCallbackNone;
+}
+
+/// Invoke the expression or callback "eva" and return the result in "tv".
+/// @return false if something failed
+bool evalarg_call(evalarg_T *const eva, typval_T *const tv)
+ FUNC_ATTR_NONNULL_ALL
+{
+ if (eva->eva_string != NULL) {
+ return eval0((char_u *)eva->eva_string, tv, NULL, true);
+ }
+
+ typval_T argv[1];
+ argv[0].v_type = VAR_UNKNOWN;
+ return callback_call(&eva->eva_callback, 0, argv, tv);
+}
+
+/// Like evalarg_call(), but just return true or false.
+/// Sets "error" to true if evaluation failed.
+bool evalarg_call_bool(evalarg_T *const eva, bool *const error)
+ FUNC_ATTR_NONNULL_ALL
+{
+ typval_T tv;
+ if (!evalarg_call(eva, &tv)) {
+ *error = true;
+ return false;
+ }
+
+ const bool r = tv_get_number(&tv);
+ tv_clear(&tv);
+ *error = false;
+ return r;
+}
+
+void evalarg_clean(evalarg_T *const eva)
+ FUNC_ATTR_NONNULL_ALL
+{
+ callback_free(&eva->eva_callback);
+}
+
// TODO(ZyX-I): move to eval/expressions
/*