Patch 9.0.1673
Problem:    Cannot produce a status 418 or 503 message.
Solution:   Add err_teapot().
Files:      runtime/doc/builtin.txt, src/errors.h, src/evalfunc.c,
            src/testdir/test_functions.vim


*** ../vim-9.0.1672/runtime/doc/builtin.txt     2023-06-14 13:10:09.799148187 
+0100
--- runtime/doc/builtin.txt     2023-07-07 18:28:34.726592448 +0100
***************
*** 154,159 ****
--- 154,160 ----
  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,2181 ****
--- 2177,2190 ----
  <             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
*** ../vim-9.0.1672/src/errors.h        2023-05-31 17:12:07.884535632 +0100
--- src/errors.h        2023-07-07 18:11:36.427706851 +0100
***************
*** 1037,1042 ****
--- 1037,1044 ----
        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,1275 ****
--- 1272,1279 ----
        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')"));
*** ../vim-9.0.1672/src/evalfunc.c      2023-06-24 16:42:22.158719360 +0100
--- src/evalfunc.c      2023-07-07 18:55:11.501897399 +0100
***************
*** 45,50 ****
--- 45,51 ----
  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,1886 ****
--- 1882,1889 ----
                        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,3928 ****
--- 3926,3958 ----
  }
  
  /*
+  * "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
***************
*** 6456,6461 ****
--- 6486,6499 ----
                1
  #else
                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}
*** ../vim-9.0.1672/src/testdir/test_functions.vim      2023-06-14 
13:10:09.803148193 +0100
--- src/testdir/test_functions.vim      2023-07-07 18:42:09.138377511 +0100
***************
*** 30,39 ****
--- 30,42 ----
      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,91 ****
--- 89,105 ----
    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:')
*** ../vim-9.0.1672/src/version.c       2023-07-01 20:24:36.105801444 +0100
--- src/version.c       2023-07-07 17:48:49.425056765 +0100
***************
*** 697,698 ****
--- 697,700 ----
  {   /* Add new patch number below this line */
+ /**/
+     1673,
  /**/

-- 
GALAHAD:   Camelot ...
LAUNCELOT: Camelot ...
GAWAIN:    It's only a model.
                 "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD

 /// Bram Moolenaar -- b...@moolenaar.net -- http://www.Moolenaar.net   \\\
///                                                                      \\\
\\\        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ ///
 \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///

-- 
-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to vim_dev+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/vim_dev/20230707175810.4C1031C09A9%40moolenaar.net.

Reply via email to