summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2023-07-07 18:57:40 +0100
committerBram Moolenaar <Bram@vim.org>2023-07-07 18:57:40 +0100
commit80adaa8ae8398403ca4e9797219ea9a501fc76a5 (patch)
treece2882609cc012d5c22cd394afac6f17546962ab
parentd392a74c5a8af8271a33a20d37ae1a8ea422cb4b (diff)
patch 9.0.1673: cannot produce a status 418 or 503 messagev9.0.1673
Problem: Cannot produce a status 418 or 503 message. Solution: Add err_teapot().
-rw-r--r--runtime/doc/builtin.txt9
-rw-r--r--src/errors.h4
-rw-r--r--src/evalfunc.c38
-rw-r--r--src/testdir/test_functions.vim14
-rw-r--r--src/version.c2
5 files changed, 67 insertions, 0 deletions
diff --git a/runtime/doc/builtin.txt b/runtime/doc/builtin.txt
index 1b7c6dcc6e..7fb1a435c3 100644
--- a/runtime/doc/builtin.txt
+++ b/runtime/doc/builtin.txt
@@ -154,6 +154,7 @@ digraph_getlist([{listall}]) List get all |digraph|s
digraph_set({chars}, {digraph}) Boolean register |digraph|
digraph_setlist({digraphlist}) Boolean register multiple |digraph|s
echoraw({expr}) none output {expr} as-is
+err_teapot() Number produce error 418
empty({expr}) Number |TRUE| if {expr} is empty
environ() Dict return environment variables
escape({string}, {chars}) String escape {chars} in {string} with '\'
@@ -2176,6 +2177,14 @@ echoraw({string}) *echoraw()*
< Use with care, you can mess up the terminal this way.
+err_teapot([{expr}]) *err_teapot()*
+ Produce an error with number 418, needed for implementation of
+ RFC 2325.
+ If {expr} is present and it is TRUE error 503 is given,
+ indicating that coffee is temporarily not available.
+ If {expr} is present it must be a String.
+
+
empty({expr}) *empty()*
Return the Number 1 if {expr} is empty, zero otherwise.
- A |List| or |Dictionary| is empty when it does not have any
diff --git a/src/errors.h b/src/errors.h
index a209413fc2..9b40cb2549 100644
--- a/src/errors.h
+++ b/src/errors.h
@@ -1037,6 +1037,8 @@ EXTERN char e_missing_argument_str[]
INIT(= N_("E417: Missing argument: %s"));
EXTERN char e_illegal_value_str[]
INIT(= N_("E418: Illegal value: %s"));
+EXTERN char e_im_a_teapot[]
+ INIT(= N_("E418: I'm a teapot"));
EXTERN char e_fg_color_unknown[]
INIT(= N_("E419: FG color unknown"));
EXTERN char e_bg_color_unknown[]
@@ -1270,6 +1272,8 @@ EXTERN char e_is_not_file_or_writable_device[]
INIT(= N_("is not a file or writable device"));
EXTERN char e_str_is_not_file_or_writable_device[]
INIT(= N_("E503: \"%s\" is not a file or writable device"));
+EXTERN char e_coffee_currently_not_available[]
+ INIT(= N_("E503: Coffee is currently not available"));
// E504
EXTERN char e_is_read_only_cannot_override_W_in_cpoptions[]
INIT(= N_("is read-only (cannot override: \"W\" in 'cpoptions')"));
diff --git a/src/evalfunc.c b/src/evalfunc.c
index d644a3ee54..8970ac7937 100644
--- a/src/evalfunc.c
+++ b/src/evalfunc.c
@@ -45,6 +45,7 @@ static void f_did_filetype(typval_T *argvars, typval_T *rettv);
static void f_echoraw(typval_T *argvars, typval_T *rettv);
static void f_empty(typval_T *argvars, typval_T *rettv);
static void f_environ(typval_T *argvars, typval_T *rettv);
+static void f_err_teapot(typval_T *argvars, typval_T *rettv);
static void f_escape(typval_T *argvars, typval_T *rettv);
static void f_eval(typval_T *argvars, typval_T *rettv);
static void f_eventhandler(typval_T *argvars, typval_T *rettv);
@@ -1881,6 +1882,8 @@ static funcentry_T global_functions[] =
ret_number_bool, f_empty},
{"environ", 0, 0, 0, NULL,
ret_dict_string, f_environ},
+ {"err_teapot", 0, 1, 0, NULL,
+ ret_number_bool, f_err_teapot},
{"escape", 2, 2, FEARG_1, arg2_string,
ret_string, f_escape},
{"eval", 1, 1, FEARG_1, arg1_string,
@@ -3923,6 +3926,33 @@ f_environ(typval_T *argvars UNUSED, typval_T *rettv)
}
/*
+ * "err_teapot()" function
+ */
+ static void
+f_err_teapot(typval_T *argvars, typval_T *rettv UNUSED)
+{
+ if (argvars[0].v_type != VAR_UNKNOWN)
+ {
+ if (argvars[0].v_type == VAR_STRING)
+ {
+ char_u *s = tv_get_string_strict(&argvars[0]);
+ if (s == NULL || *skipwhite(s) == NUL)
+ return;
+ }
+
+ int err = FALSE;
+ int do_503 = eval_expr_to_bool(&argvars[0], &err);
+ if (!err && do_503)
+ {
+ emsg(_(e_coffee_currently_not_available));
+ return;
+ }
+ }
+
+ emsg(_(e_im_a_teapot));
+}
+
+/*
* "escape({string}, {chars})" function
*/
static void
@@ -6458,6 +6488,14 @@ f_has(typval_T *argvars, typval_T *rettv)
0
#endif
},
+ {":tearoff",
+// same #ifdef as used for ex_tearoff().
+#if defined(FEAT_GUI_MSWIN) && defined(FEAT_MENU) && defined(FEAT_TEAROFF)
+ 1
+#else
+ 0
+#endif
+ },
{NULL, 0}
};
diff --git a/src/testdir/test_functions.vim b/src/testdir/test_functions.vim
index a17c19e179..750c4a2bf1 100644
--- a/src/testdir/test_functions.vim
+++ b/src/testdir/test_functions.vim
@@ -30,10 +30,13 @@ func Test_has()
call assert_equal(1, or(has('ttyin'), 1))
call assert_equal(0, and(has('ttyout'), 0))
call assert_equal(1, has('multi_byte_encoding'))
+ call assert_equal(0, has(':tearoff'))
endif
call assert_equal(1, has('vcon', 1))
call assert_equal(1, has('mouse_gpm_enabled', 1))
+ call assert_equal(has('gui_win32') && has('menu'), has(':tearoff'))
+
call assert_equal(0, has('nonexistent'))
call assert_equal(0, has('nonexistent', 1))
@@ -86,6 +89,17 @@ func Test_empty()
call assert_fails("call empty(test_unknown())", ['E340:', 'E685:'])
endfunc
+func Test_err_teapot()
+ call assert_fails('call err_teapot()', "E418: I'm a teapot")
+ call assert_fails('call err_teapot(0)', "E418: I'm a teapot")
+ call assert_fails('call err_teapot(v:false)', "E418: I'm a teapot")
+
+ call assert_fails('call err_teapot("1")', "E503: Coffee is currently not available")
+ call assert_fails('call err_teapot(v:true)', "E503: Coffee is currently not available")
+ let expr = 1
+ call assert_fails('call err_teapot(expr)', "E503: Coffee is currently not available")
+endfunc
+
func Test_test_void()
call assert_fails('echo 1 == test_void()', 'E1031:')
call assert_fails('echo 1.0 == test_void()', 'E1031:')
diff --git a/src/version.c b/src/version.c
index 876e20c274..840f338560 100644
--- a/src/version.c
+++ b/src/version.c
@@ -696,6 +696,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 1673,
+/**/
1672,
/**/
1671,