Patch 8.1.1584
Problem:    The evalfunc.c file is getting too big.
Solution:   Move channel and job related functions to channel.c.
Files:      src/channel.c, src/evalfunc.c, src/proto/channel.pro


*** ../vim-8.1.1583/src/channel.c       2019-06-20 03:45:31.171536943 +0200
--- src/channel.c       2019-06-24 00:39:29.760645473 +0200
***************
*** 952,1127 ****
  }
  
  /*
!  * Implements ch_open().
   */
-     channel_T *
- channel_open_func(typval_T *argvars)
- {
-     char_u    *address;
-     char_u    *p;
-     char      *rest;
-     int               port;
-     jobopt_T    opt;
-     channel_T *channel = NULL;
- 
-     address = tv_get_string(&argvars[0]);
-     if (argvars[1].v_type != VAR_UNKNOWN
-        && (argvars[1].v_type != VAR_DICT || argvars[1].vval.v_dict == NULL))
-     {
-       emsg(_(e_invarg));
-       return NULL;
-     }
- 
-     /* parse address */
-     p = vim_strchr(address, ':');
-     if (p == NULL)
-     {
-       semsg(_(e_invarg2), address);
-       return NULL;
-     }
-     *p++ = NUL;
-     port = strtol((char *)p, &rest, 10);
-     if (*address == NUL || port <= 0 || *rest != NUL)
-     {
-       p[-1] = ':';
-       semsg(_(e_invarg2), address);
-       return NULL;
-     }
- 
-     /* parse options */
-     clear_job_options(&opt);
-     opt.jo_mode = MODE_JSON;
-     opt.jo_timeout = 2000;
-     if (get_job_options(&argvars[1], &opt,
-           JO_MODE_ALL + JO_CB_ALL + JO_WAITTIME + JO_TIMEOUT_ALL, 0) == FAIL)
-       goto theend;
-     if (opt.jo_timeout < 0)
-     {
-       emsg(_(e_invarg));
-       goto theend;
-     }
- 
-     channel = channel_open((char *)address, port, opt.jo_waittime, NULL);
-     if (channel != NULL)
-     {
-       opt.jo_set = JO_ALL;
-       channel_set_options(channel, &opt);
-     }
- theend:
-     free_job_options(&opt);
-     return channel;
- }
- 
      static void
! ch_close_part(channel_T *channel, ch_part_T part)
! {
!     sock_T *fd = &channel->ch_part[part].ch_fd;
! 
!     if (*fd != INVALID_FD)
!     {
!       if (part == PART_SOCK)
!           sock_close(*fd);
!       else
!       {
!           /* When using a pty the same FD is set on multiple parts, only
!            * close it when the last reference is closed. */
!           if ((part == PART_IN || channel->CH_IN_FD != *fd)
!                   && (part == PART_OUT || channel->CH_OUT_FD != *fd)
!                   && (part == PART_ERR || channel->CH_ERR_FD != *fd))
!           {
! #ifdef MSWIN
!               if (channel->ch_named_pipe)
!                   DisconnectNamedPipe((HANDLE)fd);
! #endif
!               fd_close(*fd);
!           }
!       }
!       *fd = INVALID_FD;
! 
!       /* channel is closed, may want to end the job if it was the last */
!       channel->ch_to_be_closed &= ~(1U << part);
!     }
! }
! 
!     void
! channel_set_pipes(channel_T *channel, sock_T in, sock_T out, sock_T err)
  {
!     if (in != INVALID_FD)
!     {
!       ch_close_part(channel, PART_IN);
!       channel->CH_IN_FD = in;
! # if defined(UNIX)
!       /* Do not end the job when all output channels are closed, wait until
!        * the job ended. */
!       if (mch_isatty(in))
!           channel->ch_to_be_closed |= (1U << PART_IN);
! # endif
!     }
!     if (out != INVALID_FD)
      {
! # if defined(FEAT_GUI)
!       channel_gui_unregister_one(channel, PART_OUT);
! # endif
!       ch_close_part(channel, PART_OUT);
!       channel->CH_OUT_FD = out;
!       channel->ch_to_be_closed |= (1U << PART_OUT);
! # if defined(FEAT_GUI)
!       channel_gui_register_one(channel, PART_OUT);
! # endif
      }
!     if (err != INVALID_FD)
      {
! # if defined(FEAT_GUI)
!       channel_gui_unregister_one(channel, PART_ERR);
! # endif
!       ch_close_part(channel, PART_ERR);
!       channel->CH_ERR_FD = err;
!       channel->ch_to_be_closed |= (1U << PART_ERR);
! # if defined(FEAT_GUI)
!       channel_gui_register_one(channel, PART_ERR);
! # endif
      }
  }
  
! /*
!  * Sets the job the channel is associated with and associated options.
!  * This does not keep a refcount, when the job is freed ch_job is cleared.
!  */
!     void
! channel_set_job(channel_T *channel, job_T *job, jobopt_T *options)
  {
!     channel->ch_job = job;
! 
!     channel_set_options(channel, options);
! 
!     if (job->jv_in_buf != NULL)
!     {
!       chanpart_T *in_part = &channel->ch_part[PART_IN];
  
!       set_bufref(&in_part->ch_bufref, job->jv_in_buf);
!       ch_log(channel, "reading from buffer '%s'",
!                                (char *)in_part->ch_bufref.br_buf->b_ffname);
!       if (options->jo_set & JO_IN_TOP)
!       {
!           if (options->jo_in_top == 0 && !(options->jo_set & JO_IN_BOT))
!           {
!               /* Special mode: send last-but-one line when appending a line
!                * to the buffer. */
!               in_part->ch_bufref.br_buf->b_write_to_channel = TRUE;
!               in_part->ch_buf_append = TRUE;
!               in_part->ch_buf_top =
!                           in_part->ch_bufref.br_buf->b_ml.ml_line_count + 1;
!           }
!           else
!               in_part->ch_buf_top = options->jo_in_top;
!       }
!       else
!           in_part->ch_buf_top = 1;
!       if (options->jo_set & JO_IN_BOT)
!           in_part->ch_buf_bot = options->jo_in_bot;
!       else
!           in_part->ch_buf_bot = in_part->ch_bufref.br_buf->b_ml.ml_line_count;
!     }
  }
  
  /*
--- 952,986 ----
  }
  
  /*
!  * Copy callback from "src" to "dest", incrementing the refcounts.
   */
      static void
! copy_callback(callback_T *dest, callback_T *src)
  {
!     dest->cb_partial = src->cb_partial;
!     if (dest->cb_partial != NULL)
      {
!       dest->cb_name = src->cb_name;
!       dest->cb_free_name = FALSE;
!       ++dest->cb_partial->pt_refcount;
      }
!     else
      {
!       dest->cb_name = vim_strsave(src->cb_name);
!       dest->cb_free_name = TRUE;
!       func_ref(src->cb_name);
      }
  }
  
!     static void
! free_set_callback(callback_T *cbp, callback_T *callback)
  {
!     free_callback(cbp);
  
!     if (callback->cb_name != NULL && *callback->cb_name != NUL)
!       copy_callback(cbp, callback);
!     else
!       cbp->cb_name = NULL;
  }
  
  /*
***************
*** 1179,1219 ****
  }
  
  /*
-  * Copy callback from "src" to "dest", incrementing the refcounts.
-  */
-     static void
- copy_callback(callback_T *dest, callback_T *src)
- {
-     dest->cb_partial = src->cb_partial;
-     if (dest->cb_partial != NULL)
-     {
-       dest->cb_name = src->cb_name;
-       dest->cb_free_name = FALSE;
-       ++dest->cb_partial->pt_refcount;
-     }
-     else
-     {
-       dest->cb_name = vim_strsave(src->cb_name);
-       dest->cb_free_name = TRUE;
-       func_ref(src->cb_name);
-     }
- }
- 
-     static void
- free_set_callback(callback_T *cbp, callback_T *callback)
- {
-     free_callback(cbp);
- 
-     if (callback->cb_name != NULL && *callback->cb_name != NUL)
-       copy_callback(cbp, callback);
-     else
-       cbp->cb_name = NULL;
- }
- 
- /*
   * Set various properties from an "opt" argument.
   */
!     void
  channel_set_options(channel_T *channel, jobopt_T *opt)
  {
      ch_part_T part;
--- 1038,1046 ----
  }
  
  /*
   * Set various properties from an "opt" argument.
   */
!     static void
  channel_set_options(channel_T *channel, jobopt_T *opt)
  {
      ch_part_T part;
***************
*** 1346,1351 ****
--- 1173,1351 ----
  }
  
  /*
+  * Implements ch_open().
+  */
+     channel_T *
+ channel_open_func(typval_T *argvars)
+ {
+     char_u    *address;
+     char_u    *p;
+     char      *rest;
+     int               port;
+     jobopt_T    opt;
+     channel_T *channel = NULL;
+ 
+     address = tv_get_string(&argvars[0]);
+     if (argvars[1].v_type != VAR_UNKNOWN
+        && (argvars[1].v_type != VAR_DICT || argvars[1].vval.v_dict == NULL))
+     {
+       emsg(_(e_invarg));
+       return NULL;
+     }
+ 
+     /* parse address */
+     p = vim_strchr(address, ':');
+     if (p == NULL)
+     {
+       semsg(_(e_invarg2), address);
+       return NULL;
+     }
+     *p++ = NUL;
+     port = strtol((char *)p, &rest, 10);
+     if (*address == NUL || port <= 0 || *rest != NUL)
+     {
+       p[-1] = ':';
+       semsg(_(e_invarg2), address);
+       return NULL;
+     }
+ 
+     /* parse options */
+     clear_job_options(&opt);
+     opt.jo_mode = MODE_JSON;
+     opt.jo_timeout = 2000;
+     if (get_job_options(&argvars[1], &opt,
+           JO_MODE_ALL + JO_CB_ALL + JO_WAITTIME + JO_TIMEOUT_ALL, 0) == FAIL)
+       goto theend;
+     if (opt.jo_timeout < 0)
+     {
+       emsg(_(e_invarg));
+       goto theend;
+     }
+ 
+     channel = channel_open((char *)address, port, opt.jo_waittime, NULL);
+     if (channel != NULL)
+     {
+       opt.jo_set = JO_ALL;
+       channel_set_options(channel, &opt);
+     }
+ theend:
+     free_job_options(&opt);
+     return channel;
+ }
+ 
+     static void
+ ch_close_part(channel_T *channel, ch_part_T part)
+ {
+     sock_T *fd = &channel->ch_part[part].ch_fd;
+ 
+     if (*fd != INVALID_FD)
+     {
+       if (part == PART_SOCK)
+           sock_close(*fd);
+       else
+       {
+           /* When using a pty the same FD is set on multiple parts, only
+            * close it when the last reference is closed. */
+           if ((part == PART_IN || channel->CH_IN_FD != *fd)
+                   && (part == PART_OUT || channel->CH_OUT_FD != *fd)
+                   && (part == PART_ERR || channel->CH_ERR_FD != *fd))
+           {
+ #ifdef MSWIN
+               if (channel->ch_named_pipe)
+                   DisconnectNamedPipe((HANDLE)fd);
+ #endif
+               fd_close(*fd);
+           }
+       }
+       *fd = INVALID_FD;
+ 
+       /* channel is closed, may want to end the job if it was the last */
+       channel->ch_to_be_closed &= ~(1U << part);
+     }
+ }
+ 
+     void
+ channel_set_pipes(channel_T *channel, sock_T in, sock_T out, sock_T err)
+ {
+     if (in != INVALID_FD)
+     {
+       ch_close_part(channel, PART_IN);
+       channel->CH_IN_FD = in;
+ # if defined(UNIX)
+       /* Do not end the job when all output channels are closed, wait until
+        * the job ended. */
+       if (mch_isatty(in))
+           channel->ch_to_be_closed |= (1U << PART_IN);
+ # endif
+     }
+     if (out != INVALID_FD)
+     {
+ # if defined(FEAT_GUI)
+       channel_gui_unregister_one(channel, PART_OUT);
+ # endif
+       ch_close_part(channel, PART_OUT);
+       channel->CH_OUT_FD = out;
+       channel->ch_to_be_closed |= (1U << PART_OUT);
+ # if defined(FEAT_GUI)
+       channel_gui_register_one(channel, PART_OUT);
+ # endif
+     }
+     if (err != INVALID_FD)
+     {
+ # if defined(FEAT_GUI)
+       channel_gui_unregister_one(channel, PART_ERR);
+ # endif
+       ch_close_part(channel, PART_ERR);
+       channel->CH_ERR_FD = err;
+       channel->ch_to_be_closed |= (1U << PART_ERR);
+ # if defined(FEAT_GUI)
+       channel_gui_register_one(channel, PART_ERR);
+ # endif
+     }
+ }
+ 
+ /*
+  * Sets the job the channel is associated with and associated options.
+  * This does not keep a refcount, when the job is freed ch_job is cleared.
+  */
+     void
+ channel_set_job(channel_T *channel, job_T *job, jobopt_T *options)
+ {
+     channel->ch_job = job;
+ 
+     channel_set_options(channel, options);
+ 
+     if (job->jv_in_buf != NULL)
+     {
+       chanpart_T *in_part = &channel->ch_part[PART_IN];
+ 
+       set_bufref(&in_part->ch_bufref, job->jv_in_buf);
+       ch_log(channel, "reading from buffer '%s'",
+                                (char *)in_part->ch_bufref.br_buf->b_ffname);
+       if (options->jo_set & JO_IN_TOP)
+       {
+           if (options->jo_in_top == 0 && !(options->jo_set & JO_IN_BOT))
+           {
+               /* Special mode: send last-but-one line when appending a line
+                * to the buffer. */
+               in_part->ch_bufref.br_buf->b_write_to_channel = TRUE;
+               in_part->ch_buf_append = TRUE;
+               in_part->ch_buf_top =
+                           in_part->ch_bufref.br_buf->b_ml.ml_line_count + 1;
+           }
+           else
+               in_part->ch_buf_top = options->jo_in_top;
+       }
+       else
+           in_part->ch_buf_top = 1;
+       if (options->jo_set & JO_IN_BOT)
+           in_part->ch_buf_bot = options->jo_in_bot;
+       else
+           in_part->ch_buf_bot = in_part->ch_bufref.br_buf->b_ml.ml_line_count;
+     }
+ }
+ 
+ /*
   * Set the callback for "channel"/"part" for the response with "id".
   */
      void
***************
*** 3627,3632 ****
--- 3627,3672 ----
  }
  
  /*
+  * Get the channel from the argument.
+  * Returns NULL if the handle is invalid.
+  * When "check_open" is TRUE check that the channel can be used.
+  * When "reading" is TRUE "check_open" considers typeahead useful.
+  * "part" is used to check typeahead, when PART_COUNT use the default part.
+  */
+     static channel_T *
+ get_channel_arg(typval_T *tv, int check_open, int reading, ch_part_T part)
+ {
+     channel_T *channel = NULL;
+     int               has_readahead = FALSE;
+ 
+     if (tv->v_type == VAR_JOB)
+     {
+       if (tv->vval.v_job != NULL)
+           channel = tv->vval.v_job->jv_channel;
+     }
+     else if (tv->v_type == VAR_CHANNEL)
+     {
+       channel = tv->vval.v_channel;
+     }
+     else
+     {
+       semsg(_(e_invarg2), tv_get_string(tv));
+       return NULL;
+     }
+     if (channel != NULL && reading)
+       has_readahead = channel_has_readahead(channel,
+                      part != PART_COUNT ? part : channel_part_read(channel));
+ 
+     if (check_open && (channel == NULL || (!channel_is_open(channel)
+                                            && !(reading && has_readahead))))
+     {
+       emsg(_("E906: not an open channel"));
+       return NULL;
+     }
+     return channel;
+ }
+ 
+ /*
   * Common for ch_read() and ch_readraw().
   */
      void
***************
*** 5193,5238 ****
      return OK;
  }
  
- /*
-  * Get the channel from the argument.
-  * Returns NULL if the handle is invalid.
-  * When "check_open" is TRUE check that the channel can be used.
-  * When "reading" is TRUE "check_open" considers typeahead useful.
-  * "part" is used to check typeahead, when PART_COUNT use the default part.
-  */
-     channel_T *
- get_channel_arg(typval_T *tv, int check_open, int reading, ch_part_T part)
- {
-     channel_T *channel = NULL;
-     int               has_readahead = FALSE;
- 
-     if (tv->v_type == VAR_JOB)
-     {
-       if (tv->vval.v_job != NULL)
-           channel = tv->vval.v_job->jv_channel;
-     }
-     else if (tv->v_type == VAR_CHANNEL)
-     {
-       channel = tv->vval.v_channel;
-     }
-     else
-     {
-       semsg(_(e_invarg2), tv_get_string(tv));
-       return NULL;
-     }
-     if (channel != NULL && reading)
-       has_readahead = channel_has_readahead(channel,
-                      part != PART_COUNT ? part : channel_part_read(channel));
- 
-     if (check_open && (channel == NULL || (!channel_is_open(channel)
-                                            && !(reading && has_readahead))))
-     {
-       emsg(_("E906: not an open channel"));
-       return NULL;
-     }
-     return channel;
- }
- 
  static job_T *first_job = NULL;
  
      static void
--- 5233,5238 ----
***************
*** 5976,6052 ****
  }
  
  /*
-  * Implementation of job_info().
-  */
-     void
- job_info(job_T *job, dict_T *dict)
- {
-     dictitem_T        *item;
-     varnumber_T       nr;
-     list_T    *l;
-     int               i;
- 
-     dict_add_string(dict, "status", (char_u *)job_status(job));
- 
-     item = dictitem_alloc((char_u *)"channel");
-     if (item == NULL)
-       return;
-     item->di_tv.v_type = VAR_CHANNEL;
-     item->di_tv.vval.v_channel = job->jv_channel;
-     if (job->jv_channel != NULL)
-       ++job->jv_channel->ch_refcount;
-     if (dict_add(dict, item) == FAIL)
-       dictitem_free(item);
- 
- #ifdef UNIX
-     nr = job->jv_pid;
- #else
-     nr = job->jv_proc_info.dwProcessId;
- #endif
-     dict_add_number(dict, "process", nr);
-     dict_add_string(dict, "tty_in", job->jv_tty_in);
-     dict_add_string(dict, "tty_out", job->jv_tty_out);
- 
-     dict_add_number(dict, "exitval", job->jv_exitval);
-     dict_add_string(dict, "exit_cb", job->jv_exit_cb.cb_name);
-     dict_add_string(dict, "stoponexit", job->jv_stoponexit);
- #ifdef UNIX
-     dict_add_string(dict, "termsig", job->jv_termsig);
- #endif
- #ifdef MSWIN
-     dict_add_string(dict, "tty_type", job->jv_tty_type);
- #endif
- 
-     l = list_alloc();
-     if (l != NULL)
-     {
-       dict_add_list(dict, "cmd", l);
-       if (job->jv_argv != NULL)
-           for (i = 0; job->jv_argv[i] != NULL; i++)
-               list_append_string(l, (char_u *)job->jv_argv[i], -1);
-     }
- }
- 
- /*
-  * Implementation of job_info() to return info for all jobs.
-  */
-     void
- job_info_all(list_T *l)
- {
-     job_T     *job;
-     typval_T  tv;
- 
-     for (job = first_job; job != NULL; job = job->jv_next)
-     {
-       tv.v_type = VAR_JOB;
-       tv.vval.v_job = job;
- 
-       if (list_append_tv(l, &tv) != OK)
-           return;
-     }
- }
- 
- /*
   * Send a signal to "job".  Implements job_stop().
   * When "type" is not NULL use this for the type.
   * Otherwise use argvars[1] for the type.
--- 5976,5981 ----
***************
*** 6147,6150 ****
--- 6076,6581 ----
      return TRUE;
  }
  
+ /*
+  * "prompt_setcallback({buffer}, {callback})" function
+  */
+     void
+ f_prompt_setcallback(typval_T *argvars, typval_T *rettv UNUSED)
+ {
+     buf_T     *buf;
+     callback_T        callback;
+ 
+     if (check_secure())
+       return;
+     buf = tv_get_buf(&argvars[0], FALSE);
+     if (buf == NULL)
+       return;
+ 
+     callback = get_callback(&argvars[1]);
+     if (callback.cb_name == NULL)
+       return;
+ 
+     free_callback(&buf->b_prompt_callback);
+     set_callback(&buf->b_prompt_callback, &callback);
+ }
+ 
+ /*
+  * "prompt_setinterrupt({buffer}, {callback})" function
+  */
+     void
+ f_prompt_setinterrupt(typval_T *argvars, typval_T *rettv UNUSED)
+ {
+     buf_T     *buf;
+     callback_T        callback;
+ 
+     if (check_secure())
+       return;
+     buf = tv_get_buf(&argvars[0], FALSE);
+     if (buf == NULL)
+       return;
+ 
+     callback = get_callback(&argvars[1]);
+     if (callback.cb_name == NULL)
+       return;
+ 
+     free_callback(&buf->b_prompt_interrupt);
+     set_callback(&buf->b_prompt_interrupt, &callback);
+ }
+ 
+ /*
+  * "prompt_setprompt({buffer}, {text})" function
+  */
+     void
+ f_prompt_setprompt(typval_T *argvars, typval_T *rettv UNUSED)
+ {
+     buf_T     *buf;
+     char_u    *text;
+ 
+     if (check_secure())
+       return;
+     buf = tv_get_buf(&argvars[0], FALSE);
+     if (buf == NULL)
+       return;
+ 
+     text = tv_get_string(&argvars[1]);
+     vim_free(buf->b_prompt_text);
+     buf->b_prompt_text = vim_strsave(text);
+ }
+ 
+ /*
+  * "ch_canread()" function
+  */
+     void
+ f_ch_canread(typval_T *argvars, typval_T *rettv)
+ {
+     channel_T *channel = get_channel_arg(&argvars[0], FALSE, FALSE, 0);
+ 
+     rettv->vval.v_number = 0;
+     if (channel != NULL)
+       rettv->vval.v_number = channel_has_readahead(channel, PART_SOCK)
+                           || channel_has_readahead(channel, PART_OUT)
+                           || channel_has_readahead(channel, PART_ERR);
+ }
+ 
+ /*
+  * "ch_close()" function
+  */
+     void
+ f_ch_close(typval_T *argvars, typval_T *rettv UNUSED)
+ {
+     channel_T *channel = get_channel_arg(&argvars[0], TRUE, FALSE, 0);
+ 
+     if (channel != NULL)
+     {
+       channel_close(channel, FALSE);
+       channel_clear(channel);
+     }
+ }
+ 
+ /*
+  * "ch_close()" function
+  */
+     void
+ f_ch_close_in(typval_T *argvars, typval_T *rettv UNUSED)
+ {
+     channel_T *channel = get_channel_arg(&argvars[0], TRUE, FALSE, 0);
+ 
+     if (channel != NULL)
+       channel_close_in(channel);
+ }
+ 
+ /*
+  * "ch_getbufnr()" function
+  */
+     void
+ f_ch_getbufnr(typval_T *argvars, typval_T *rettv)
+ {
+     channel_T *channel = get_channel_arg(&argvars[0], FALSE, FALSE, 0);
+ 
+     rettv->vval.v_number = -1;
+     if (channel != NULL)
+     {
+       char_u  *what = tv_get_string(&argvars[1]);
+       int     part;
+ 
+       if (STRCMP(what, "err") == 0)
+           part = PART_ERR;
+       else if (STRCMP(what, "out") == 0)
+           part = PART_OUT;
+       else if (STRCMP(what, "in") == 0)
+           part = PART_IN;
+       else
+           part = PART_SOCK;
+       if (channel->ch_part[part].ch_bufref.br_buf != NULL)
+           rettv->vval.v_number =
+                             channel->ch_part[part].ch_bufref.br_buf->b_fnum;
+     }
+ }
+ 
+ /*
+  * "ch_getjob()" function
+  */
+     void
+ f_ch_getjob(typval_T *argvars, typval_T *rettv)
+ {
+     channel_T *channel = get_channel_arg(&argvars[0], FALSE, FALSE, 0);
+ 
+     if (channel != NULL)
+     {
+       rettv->v_type = VAR_JOB;
+       rettv->vval.v_job = channel->ch_job;
+       if (channel->ch_job != NULL)
+           ++channel->ch_job->jv_refcount;
+     }
+ }
+ 
+ /*
+  * "ch_info()" function
+  */
+     void
+ f_ch_info(typval_T *argvars, typval_T *rettv UNUSED)
+ {
+     channel_T *channel = get_channel_arg(&argvars[0], FALSE, FALSE, 0);
+ 
+     if (channel != NULL && rettv_dict_alloc(rettv) != FAIL)
+       channel_info(channel, rettv->vval.v_dict);
+ }
+ 
+ /*
+  * "ch_log()" function
+  */
+     void
+ f_ch_log(typval_T *argvars, typval_T *rettv UNUSED)
+ {
+     char_u    *msg = tv_get_string(&argvars[0]);
+     channel_T *channel = NULL;
+ 
+     if (argvars[1].v_type != VAR_UNKNOWN)
+       channel = get_channel_arg(&argvars[1], FALSE, FALSE, 0);
+ 
+     ch_log(channel, "%s", msg);
+ }
+ 
+ /*
+  * "ch_logfile()" function
+  */
+     void
+ f_ch_logfile(typval_T *argvars, typval_T *rettv UNUSED)
+ {
+     char_u *fname;
+     char_u *opt = (char_u *)"";
+     char_u buf[NUMBUFLEN];
+ 
+     /* Don't open a file in restricted mode. */
+     if (check_restricted() || check_secure())
+       return;
+     fname = tv_get_string(&argvars[0]);
+     if (argvars[1].v_type == VAR_STRING)
+       opt = tv_get_string_buf(&argvars[1], buf);
+     ch_logfile(fname, opt);
+ }
+ 
+ /*
+  * "ch_open()" function
+  */
+     void
+ f_ch_open(typval_T *argvars, typval_T *rettv)
+ {
+     rettv->v_type = VAR_CHANNEL;
+     if (check_restricted() || check_secure())
+       return;
+     rettv->vval.v_channel = channel_open_func(argvars);
+ }
+ 
+ /*
+  * "ch_read()" function
+  */
+     void
+ f_ch_read(typval_T *argvars, typval_T *rettv)
+ {
+     common_channel_read(argvars, rettv, FALSE, FALSE);
+ }
+ 
+ /*
+  * "ch_readblob()" function
+  */
+     void
+ f_ch_readblob(typval_T *argvars, typval_T *rettv)
+ {
+     common_channel_read(argvars, rettv, TRUE, TRUE);
+ }
+ 
+ /*
+  * "ch_readraw()" function
+  */
+     void
+ f_ch_readraw(typval_T *argvars, typval_T *rettv)
+ {
+     common_channel_read(argvars, rettv, TRUE, FALSE);
+ }
+ 
+ /*
+  * "ch_evalexpr()" function
+  */
+     void
+ f_ch_evalexpr(typval_T *argvars, typval_T *rettv)
+ {
+     ch_expr_common(argvars, rettv, TRUE);
+ }
+ 
+ /*
+  * "ch_sendexpr()" function
+  */
+     void
+ f_ch_sendexpr(typval_T *argvars, typval_T *rettv)
+ {
+     ch_expr_common(argvars, rettv, FALSE);
+ }
+ 
+ /*
+  * "ch_evalraw()" function
+  */
+     void
+ f_ch_evalraw(typval_T *argvars, typval_T *rettv)
+ {
+     ch_raw_common(argvars, rettv, TRUE);
+ }
+ 
+ /*
+  * "ch_sendraw()" function
+  */
+     void
+ f_ch_sendraw(typval_T *argvars, typval_T *rettv)
+ {
+     ch_raw_common(argvars, rettv, FALSE);
+ }
+ 
+ /*
+  * "ch_setoptions()" function
+  */
+     void
+ f_ch_setoptions(typval_T *argvars, typval_T *rettv UNUSED)
+ {
+     channel_T *channel;
+     jobopt_T  opt;
+ 
+     channel = get_channel_arg(&argvars[0], FALSE, FALSE, 0);
+     if (channel == NULL)
+       return;
+     clear_job_options(&opt);
+     if (get_job_options(&argvars[1], &opt,
+                           JO_CB_ALL + JO_TIMEOUT_ALL + JO_MODE_ALL, 0) == OK)
+       channel_set_options(channel, &opt);
+     free_job_options(&opt);
+ }
+ 
+ /*
+  * "ch_status()" function
+  */
+     void
+ f_ch_status(typval_T *argvars, typval_T *rettv)
+ {
+     channel_T *channel;
+     jobopt_T  opt;
+     int               part = -1;
+ 
+     /* return an empty string by default */
+     rettv->v_type = VAR_STRING;
+     rettv->vval.v_string = NULL;
+ 
+     channel = get_channel_arg(&argvars[0], FALSE, FALSE, 0);
+ 
+     if (argvars[1].v_type != VAR_UNKNOWN)
+     {
+       clear_job_options(&opt);
+       if (get_job_options(&argvars[1], &opt, JO_PART, 0) == OK
+                                                    && (opt.jo_set & JO_PART))
+           part = opt.jo_part;
+     }
+ 
+     rettv->vval.v_string = vim_strsave((char_u *)channel_status(channel, 
part));
+ }
+ 
+ /*
+  * Get the job from the argument.
+  * Returns NULL if the job is invalid.
+  */
+     static job_T *
+ get_job_arg(typval_T *tv)
+ {
+     job_T *job;
+ 
+     if (tv->v_type != VAR_JOB)
+     {
+       semsg(_(e_invarg2), tv_get_string(tv));
+       return NULL;
+     }
+     job = tv->vval.v_job;
+ 
+     if (job == NULL)
+       emsg(_("E916: not a valid job"));
+     return job;
+ }
+ 
+ /*
+  * "job_getchannel()" function
+  */
+     void
+ f_job_getchannel(typval_T *argvars, typval_T *rettv)
+ {
+     job_T     *job = get_job_arg(&argvars[0]);
+ 
+     if (job != NULL)
+     {
+       rettv->v_type = VAR_CHANNEL;
+       rettv->vval.v_channel = job->jv_channel;
+       if (job->jv_channel != NULL)
+           ++job->jv_channel->ch_refcount;
+     }
+ }
+ 
+ /*
+  * Implementation of job_info().
+  */
+     static void
+ job_info(job_T *job, dict_T *dict)
+ {
+     dictitem_T        *item;
+     varnumber_T       nr;
+     list_T    *l;
+     int               i;
+ 
+     dict_add_string(dict, "status", (char_u *)job_status(job));
+ 
+     item = dictitem_alloc((char_u *)"channel");
+     if (item == NULL)
+       return;
+     item->di_tv.v_type = VAR_CHANNEL;
+     item->di_tv.vval.v_channel = job->jv_channel;
+     if (job->jv_channel != NULL)
+       ++job->jv_channel->ch_refcount;
+     if (dict_add(dict, item) == FAIL)
+       dictitem_free(item);
+ 
+ #ifdef UNIX
+     nr = job->jv_pid;
+ #else
+     nr = job->jv_proc_info.dwProcessId;
+ #endif
+     dict_add_number(dict, "process", nr);
+     dict_add_string(dict, "tty_in", job->jv_tty_in);
+     dict_add_string(dict, "tty_out", job->jv_tty_out);
+ 
+     dict_add_number(dict, "exitval", job->jv_exitval);
+     dict_add_string(dict, "exit_cb", job->jv_exit_cb.cb_name);
+     dict_add_string(dict, "stoponexit", job->jv_stoponexit);
+ #ifdef UNIX
+     dict_add_string(dict, "termsig", job->jv_termsig);
+ #endif
+ #ifdef MSWIN
+     dict_add_string(dict, "tty_type", job->jv_tty_type);
+ #endif
+ 
+     l = list_alloc();
+     if (l != NULL)
+     {
+       dict_add_list(dict, "cmd", l);
+       if (job->jv_argv != NULL)
+           for (i = 0; job->jv_argv[i] != NULL; i++)
+               list_append_string(l, (char_u *)job->jv_argv[i], -1);
+     }
+ }
+ 
+ /*
+  * Implementation of job_info() to return info for all jobs.
+  */
+     static void
+ job_info_all(list_T *l)
+ {
+     job_T     *job;
+     typval_T  tv;
+ 
+     for (job = first_job; job != NULL; job = job->jv_next)
+     {
+       tv.v_type = VAR_JOB;
+       tv.vval.v_job = job;
+ 
+       if (list_append_tv(l, &tv) != OK)
+           return;
+     }
+ }
+ 
+ /*
+  * "job_info()" function
+  */
+     void
+ f_job_info(typval_T *argvars, typval_T *rettv)
+ {
+     if (argvars[0].v_type != VAR_UNKNOWN)
+     {
+       job_T   *job = get_job_arg(&argvars[0]);
+ 
+       if (job != NULL && rettv_dict_alloc(rettv) != FAIL)
+           job_info(job, rettv->vval.v_dict);
+     }
+     else if (rettv_list_alloc(rettv) == OK)
+       job_info_all(rettv->vval.v_list);
+ }
+ 
+ /*
+  * "job_setoptions()" function
+  */
+     void
+ f_job_setoptions(typval_T *argvars, typval_T *rettv UNUSED)
+ {
+     job_T     *job = get_job_arg(&argvars[0]);
+     jobopt_T  opt;
+ 
+     if (job == NULL)
+       return;
+     clear_job_options(&opt);
+     if (get_job_options(&argvars[1], &opt, JO_STOPONEXIT + JO_EXIT_CB, 0) == 
OK)
+       job_set_options(job, &opt);
+     free_job_options(&opt);
+ }
+ 
+ /*
+  * "job_start()" function
+  */
+     void
+ f_job_start(typval_T *argvars, typval_T *rettv)
+ {
+     rettv->v_type = VAR_JOB;
+     if (check_restricted() || check_secure())
+       return;
+     rettv->vval.v_job = job_start(argvars, NULL, NULL, FALSE);
+ }
+ 
+ /*
+  * "job_status()" function
+  */
+     void
+ f_job_status(typval_T *argvars, typval_T *rettv)
+ {
+     job_T     *job = get_job_arg(&argvars[0]);
+ 
+     if (job != NULL)
+     {
+       rettv->v_type = VAR_STRING;
+       rettv->vval.v_string = vim_strsave((char_u *)job_status(job));
+     }
+ }
+ 
+ /*
+  * "job_stop()" function
+  */
+     void
+ f_job_stop(typval_T *argvars, typval_T *rettv)
+ {
+     job_T     *job = get_job_arg(&argvars[0]);
+ 
+     if (job != NULL)
+       rettv->vval.v_number = job_stop(job, argvars, NULL);
+ }
+ 
  #endif /* FEAT_JOB_CHANNEL */
*** ../vim-8.1.1583/src/evalfunc.c      2019-06-22 01:40:38.169537422 +0200
--- src/evalfunc.c      2019-06-24 00:39:29.764645457 +0200
***************
*** 86,111 ****
  #ifdef FEAT_FLOAT
  static void f_ceil(typval_T *argvars, typval_T *rettv);
  #endif
- #ifdef FEAT_JOB_CHANNEL
- static void f_ch_canread(typval_T *argvars, typval_T *rettv);
- static void f_ch_close(typval_T *argvars, typval_T *rettv);
- static void f_ch_close_in(typval_T *argvars, typval_T *rettv);
- static void f_ch_evalexpr(typval_T *argvars, typval_T *rettv);
- static void f_ch_evalraw(typval_T *argvars, typval_T *rettv);
- static void f_ch_getbufnr(typval_T *argvars, typval_T *rettv);
- static void f_ch_getjob(typval_T *argvars, typval_T *rettv);
- static void f_ch_info(typval_T *argvars, typval_T *rettv);
- static void f_ch_log(typval_T *argvars, typval_T *rettv);
- static void f_ch_logfile(typval_T *argvars, typval_T *rettv);
- static void f_ch_open(typval_T *argvars, typval_T *rettv);
- static void f_ch_read(typval_T *argvars, typval_T *rettv);
- static void f_ch_readblob(typval_T *argvars, typval_T *rettv);
- static void f_ch_readraw(typval_T *argvars, typval_T *rettv);
- static void f_ch_sendexpr(typval_T *argvars, typval_T *rettv);
- static void f_ch_sendraw(typval_T *argvars, typval_T *rettv);
- static void f_ch_setoptions(typval_T *argvars, typval_T *rettv);
- static void f_ch_status(typval_T *argvars, typval_T *rettv);
- #endif
  static void f_changenr(typval_T *argvars, typval_T *rettv);
  static void f_char2nr(typval_T *argvars, typval_T *rettv);
  static void f_chdir(typval_T *argvars, typval_T *rettv);
--- 86,91 ----
***************
*** 246,259 ****
  static void f_isnan(typval_T *argvars, typval_T *rettv);
  #endif
  static void f_items(typval_T *argvars, typval_T *rettv);
- #ifdef FEAT_JOB_CHANNEL
- static void f_job_getchannel(typval_T *argvars, typval_T *rettv);
- static void f_job_info(typval_T *argvars, typval_T *rettv);
- static void f_job_setoptions(typval_T *argvars, typval_T *rettv);
- static void f_job_start(typval_T *argvars, typval_T *rettv);
- static void f_job_stop(typval_T *argvars, typval_T *rettv);
- static void f_job_status(typval_T *argvars, typval_T *rettv);
- #endif
  static void f_join(typval_T *argvars, typval_T *rettv);
  static void f_js_decode(typval_T *argvars, typval_T *rettv);
  static void f_js_encode(typval_T *argvars, typval_T *rettv);
--- 226,231 ----
***************
*** 309,319 ****
  #endif
  static void f_prevnonblank(typval_T *argvars, typval_T *rettv);
  static void f_printf(typval_T *argvars, typval_T *rettv);
- #ifdef FEAT_JOB_CHANNEL
- static void f_prompt_setcallback(typval_T *argvars, typval_T *rettv);
- static void f_prompt_setinterrupt(typval_T *argvars, typval_T *rettv);
- static void f_prompt_setprompt(typval_T *argvars, typval_T *rettv);
- #endif
  static void f_pumvisible(typval_T *argvars, typval_T *rettv);
  #ifdef FEAT_PYTHON3
  static void f_py3eval(typval_T *argvars, typval_T *rettv);
--- 281,286 ----
***************
*** 2271,2532 ****
  }
  #endif
  
- #ifdef FEAT_JOB_CHANNEL
- /*
-  * "ch_canread()" function
-  */
-     static void
- f_ch_canread(typval_T *argvars, typval_T *rettv)
- {
-     channel_T *channel = get_channel_arg(&argvars[0], FALSE, FALSE, 0);
- 
-     rettv->vval.v_number = 0;
-     if (channel != NULL)
-       rettv->vval.v_number = channel_has_readahead(channel, PART_SOCK)
-                           || channel_has_readahead(channel, PART_OUT)
-                           || channel_has_readahead(channel, PART_ERR);
- }
- 
- /*
-  * "ch_close()" function
-  */
-     static void
- f_ch_close(typval_T *argvars, typval_T *rettv UNUSED)
- {
-     channel_T *channel = get_channel_arg(&argvars[0], TRUE, FALSE, 0);
- 
-     if (channel != NULL)
-     {
-       channel_close(channel, FALSE);
-       channel_clear(channel);
-     }
- }
- 
- /*
-  * "ch_close()" function
-  */
-     static void
- f_ch_close_in(typval_T *argvars, typval_T *rettv UNUSED)
- {
-     channel_T *channel = get_channel_arg(&argvars[0], TRUE, FALSE, 0);
- 
-     if (channel != NULL)
-       channel_close_in(channel);
- }
- 
- /*
-  * "ch_getbufnr()" function
-  */
-     static void
- f_ch_getbufnr(typval_T *argvars, typval_T *rettv)
- {
-     channel_T *channel = get_channel_arg(&argvars[0], FALSE, FALSE, 0);
- 
-     rettv->vval.v_number = -1;
-     if (channel != NULL)
-     {
-       char_u  *what = tv_get_string(&argvars[1]);
-       int     part;
- 
-       if (STRCMP(what, "err") == 0)
-           part = PART_ERR;
-       else if (STRCMP(what, "out") == 0)
-           part = PART_OUT;
-       else if (STRCMP(what, "in") == 0)
-           part = PART_IN;
-       else
-           part = PART_SOCK;
-       if (channel->ch_part[part].ch_bufref.br_buf != NULL)
-           rettv->vval.v_number =
-                             channel->ch_part[part].ch_bufref.br_buf->b_fnum;
-     }
- }
- 
- /*
-  * "ch_getjob()" function
-  */
-     static void
- f_ch_getjob(typval_T *argvars, typval_T *rettv)
- {
-     channel_T *channel = get_channel_arg(&argvars[0], FALSE, FALSE, 0);
- 
-     if (channel != NULL)
-     {
-       rettv->v_type = VAR_JOB;
-       rettv->vval.v_job = channel->ch_job;
-       if (channel->ch_job != NULL)
-           ++channel->ch_job->jv_refcount;
-     }
- }
- 
- /*
-  * "ch_info()" function
-  */
-     static void
- f_ch_info(typval_T *argvars, typval_T *rettv UNUSED)
- {
-     channel_T *channel = get_channel_arg(&argvars[0], FALSE, FALSE, 0);
- 
-     if (channel != NULL && rettv_dict_alloc(rettv) != FAIL)
-       channel_info(channel, rettv->vval.v_dict);
- }
- 
- /*
-  * "ch_log()" function
-  */
-     static void
- f_ch_log(typval_T *argvars, typval_T *rettv UNUSED)
- {
-     char_u    *msg = tv_get_string(&argvars[0]);
-     channel_T *channel = NULL;
- 
-     if (argvars[1].v_type != VAR_UNKNOWN)
-       channel = get_channel_arg(&argvars[1], FALSE, FALSE, 0);
- 
-     ch_log(channel, "%s", msg);
- }
- 
- /*
-  * "ch_logfile()" function
-  */
-     static void
- f_ch_logfile(typval_T *argvars, typval_T *rettv UNUSED)
- {
-     char_u *fname;
-     char_u *opt = (char_u *)"";
-     char_u buf[NUMBUFLEN];
- 
-     /* Don't open a file in restricted mode. */
-     if (check_restricted() || check_secure())
-       return;
-     fname = tv_get_string(&argvars[0]);
-     if (argvars[1].v_type == VAR_STRING)
-       opt = tv_get_string_buf(&argvars[1], buf);
-     ch_logfile(fname, opt);
- }
- 
- /*
-  * "ch_open()" function
-  */
-     static void
- f_ch_open(typval_T *argvars, typval_T *rettv)
- {
-     rettv->v_type = VAR_CHANNEL;
-     if (check_restricted() || check_secure())
-       return;
-     rettv->vval.v_channel = channel_open_func(argvars);
- }
- 
- /*
-  * "ch_read()" function
-  */
-     static void
- f_ch_read(typval_T *argvars, typval_T *rettv)
- {
-     common_channel_read(argvars, rettv, FALSE, FALSE);
- }
- 
- /*
-  * "ch_readblob()" function
-  */
-     static void
- f_ch_readblob(typval_T *argvars, typval_T *rettv)
- {
-     common_channel_read(argvars, rettv, TRUE, TRUE);
- }
- 
- /*
-  * "ch_readraw()" function
-  */
-     static void
- f_ch_readraw(typval_T *argvars, typval_T *rettv)
- {
-     common_channel_read(argvars, rettv, TRUE, FALSE);
- }
- 
- /*
-  * "ch_evalexpr()" function
-  */
-     static void
- f_ch_evalexpr(typval_T *argvars, typval_T *rettv)
- {
-     ch_expr_common(argvars, rettv, TRUE);
- }
- 
- /*
-  * "ch_sendexpr()" function
-  */
-     static void
- f_ch_sendexpr(typval_T *argvars, typval_T *rettv)
- {
-     ch_expr_common(argvars, rettv, FALSE);
- }
- 
- /*
-  * "ch_evalraw()" function
-  */
-     static void
- f_ch_evalraw(typval_T *argvars, typval_T *rettv)
- {
-     ch_raw_common(argvars, rettv, TRUE);
- }
- 
- /*
-  * "ch_sendraw()" function
-  */
-     static void
- f_ch_sendraw(typval_T *argvars, typval_T *rettv)
- {
-     ch_raw_common(argvars, rettv, FALSE);
- }
- 
- /*
-  * "ch_setoptions()" function
-  */
-     static void
- f_ch_setoptions(typval_T *argvars, typval_T *rettv UNUSED)
- {
-     channel_T *channel;
-     jobopt_T  opt;
- 
-     channel = get_channel_arg(&argvars[0], FALSE, FALSE, 0);
-     if (channel == NULL)
-       return;
-     clear_job_options(&opt);
-     if (get_job_options(&argvars[1], &opt,
-                           JO_CB_ALL + JO_TIMEOUT_ALL + JO_MODE_ALL, 0) == OK)
-       channel_set_options(channel, &opt);
-     free_job_options(&opt);
- }
- 
- /*
-  * "ch_status()" function
-  */
-     static void
- f_ch_status(typval_T *argvars, typval_T *rettv)
- {
-     channel_T *channel;
-     jobopt_T  opt;
-     int               part = -1;
- 
-     /* return an empty string by default */
-     rettv->v_type = VAR_STRING;
-     rettv->vval.v_string = NULL;
- 
-     channel = get_channel_arg(&argvars[0], FALSE, FALSE, 0);
- 
-     if (argvars[1].v_type != VAR_UNKNOWN)
-     {
-       clear_job_options(&opt);
-       if (get_job_options(&argvars[1], &opt, JO_PART, 0) == OK
-                                                    && (opt.jo_set & JO_PART))
-           part = opt.jo_part;
-     }
- 
-     rettv->vval.v_string = vim_strsave((char_u *)channel_status(channel, 
part));
- }
- #endif
- 
  /*
   * "changenr()" function
   */
--- 2238,2243 ----
***************
*** 7750,7868 ****
      dict_list(argvars, rettv, 2);
  }
  
- #if defined(FEAT_JOB_CHANNEL) || defined(PROTO)
- /*
-  * Get the job from the argument.
-  * Returns NULL if the job is invalid.
-  */
-     static job_T *
- get_job_arg(typval_T *tv)
- {
-     job_T *job;
- 
-     if (tv->v_type != VAR_JOB)
-     {
-       semsg(_(e_invarg2), tv_get_string(tv));
-       return NULL;
-     }
-     job = tv->vval.v_job;
- 
-     if (job == NULL)
-       emsg(_("E916: not a valid job"));
-     return job;
- }
- 
- /*
-  * "job_getchannel()" function
-  */
-     static void
- f_job_getchannel(typval_T *argvars, typval_T *rettv)
- {
-     job_T     *job = get_job_arg(&argvars[0]);
- 
-     if (job != NULL)
-     {
-       rettv->v_type = VAR_CHANNEL;
-       rettv->vval.v_channel = job->jv_channel;
-       if (job->jv_channel != NULL)
-           ++job->jv_channel->ch_refcount;
-     }
- }
- 
- /*
-  * "job_info()" function
-  */
-     static void
- f_job_info(typval_T *argvars, typval_T *rettv)
- {
-     if (argvars[0].v_type != VAR_UNKNOWN)
-     {
-       job_T   *job = get_job_arg(&argvars[0]);
- 
-       if (job != NULL && rettv_dict_alloc(rettv) != FAIL)
-           job_info(job, rettv->vval.v_dict);
-     }
-     else if (rettv_list_alloc(rettv) == OK)
-       job_info_all(rettv->vval.v_list);
- }
- 
- /*
-  * "job_setoptions()" function
-  */
-     static void
- f_job_setoptions(typval_T *argvars, typval_T *rettv UNUSED)
- {
-     job_T     *job = get_job_arg(&argvars[0]);
-     jobopt_T  opt;
- 
-     if (job == NULL)
-       return;
-     clear_job_options(&opt);
-     if (get_job_options(&argvars[1], &opt, JO_STOPONEXIT + JO_EXIT_CB, 0) == 
OK)
-       job_set_options(job, &opt);
-     free_job_options(&opt);
- }
- 
- /*
-  * "job_start()" function
-  */
-     static void
- f_job_start(typval_T *argvars, typval_T *rettv)
- {
-     rettv->v_type = VAR_JOB;
-     if (check_restricted() || check_secure())
-       return;
-     rettv->vval.v_job = job_start(argvars, NULL, NULL, FALSE);
- }
- 
- /*
-  * "job_status()" function
-  */
-     static void
- f_job_status(typval_T *argvars, typval_T *rettv)
- {
-     job_T     *job = get_job_arg(&argvars[0]);
- 
-     if (job != NULL)
-     {
-       rettv->v_type = VAR_STRING;
-       rettv->vval.v_string = vim_strsave((char_u *)job_status(job));
-     }
- }
- 
- /*
-  * "job_stop()" function
-  */
-     static void
- f_job_stop(typval_T *argvars, typval_T *rettv)
- {
-     job_T     *job = get_job_arg(&argvars[0]);
- 
-     if (job != NULL)
-       rettv->vval.v_number = job_stop(job, argvars, NULL);
- }
- #endif
- 
  /*
   * "join()" function
   */
--- 7461,7466 ----
***************
*** 9248,9321 ****
      did_emsg |= saved_did_emsg;
  }
  
- #ifdef FEAT_JOB_CHANNEL
- /*
-  * "prompt_setcallback({buffer}, {callback})" function
-  */
-     static void
- f_prompt_setcallback(typval_T *argvars, typval_T *rettv UNUSED)
- {
-     buf_T     *buf;
-     callback_T        callback;
- 
-     if (check_secure())
-       return;
-     buf = tv_get_buf(&argvars[0], FALSE);
-     if (buf == NULL)
-       return;
- 
-     callback = get_callback(&argvars[1]);
-     if (callback.cb_name == NULL)
-       return;
- 
-     free_callback(&buf->b_prompt_callback);
-     set_callback(&buf->b_prompt_callback, &callback);
- }
- 
- /*
-  * "prompt_setinterrupt({buffer}, {callback})" function
-  */
-     static void
- f_prompt_setinterrupt(typval_T *argvars, typval_T *rettv UNUSED)
- {
-     buf_T     *buf;
-     callback_T        callback;
- 
-     if (check_secure())
-       return;
-     buf = tv_get_buf(&argvars[0], FALSE);
-     if (buf == NULL)
-       return;
- 
-     callback = get_callback(&argvars[1]);
-     if (callback.cb_name == NULL)
-       return;
- 
-     free_callback(&buf->b_prompt_interrupt);
-     set_callback(&buf->b_prompt_interrupt, &callback);
- }
- 
- /*
-  * "prompt_setprompt({buffer}, {text})" function
-  */
-     static void
- f_prompt_setprompt(typval_T *argvars, typval_T *rettv UNUSED)
- {
-     buf_T     *buf;
-     char_u    *text;
- 
-     if (check_secure())
-       return;
-     buf = tv_get_buf(&argvars[0], FALSE);
-     if (buf == NULL)
-       return;
- 
-     text = tv_get_string(&argvars[1]);
-     vim_free(buf->b_prompt_text);
-     buf->b_prompt_text = vim_strsave(text);
- }
- #endif
- 
  /*
   * "pumvisible()" function
   */
--- 8846,8851 ----
*** ../vim-8.1.1583/src/proto/channel.pro       2019-06-01 13:28:30.269829512 
+0200
--- src/proto/channel.pro       2019-06-24 00:40:42.972356415 +0200
***************
*** 11,17 ****
  channel_T *channel_open_func(typval_T *argvars);
  void channel_set_pipes(channel_T *channel, sock_T in, sock_T out, sock_T err);
  void channel_set_job(channel_T *channel, job_T *job, jobopt_T *options);
- void channel_set_options(channel_T *channel, jobopt_T *opt);
  void channel_set_req_callback(channel_T *channel, ch_part_T part, callback_T 
*callback, int id);
  void channel_buffer_free(buf_T *buf);
  void channel_write_any_lines(void);
--- 11,16 ----
***************
*** 52,58 ****
  void clear_job_options(jobopt_T *opt);
  void free_job_options(jobopt_T *opt);
  int get_job_options(typval_T *tv, jobopt_T *opt, int supported, int 
supported2);
- channel_T *get_channel_arg(typval_T *tv, int check_open, int reading, 
ch_part_T part);
  void job_free_all(void);
  int job_any_running(void);
  int win32_build_cmd(list_T *l, garray_T *gap);
--- 51,56 ----
***************
*** 68,76 ****
  int job_check_ended(void);
  job_T *job_start(typval_T *argvars, char **argv_arg, jobopt_T *opt_arg, int 
is_terminal);
  char *job_status(job_T *job);
- void job_info(job_T *job, dict_T *dict);
- void job_info_all(list_T *l);
  int job_stop(job_T *job, typval_T *argvars, char *type);
  void invoke_prompt_callback(void);
  int invoke_prompt_interrupt(void);
  /* vim: set ft=c : */
--- 66,99 ----
  int job_check_ended(void);
  job_T *job_start(typval_T *argvars, char **argv_arg, jobopt_T *opt_arg, int 
is_terminal);
  char *job_status(job_T *job);
  int job_stop(job_T *job, typval_T *argvars, char *type);
  void invoke_prompt_callback(void);
  int invoke_prompt_interrupt(void);
+ void f_prompt_setcallback(typval_T *argvars, typval_T *rettv);
+ void f_prompt_setinterrupt(typval_T *argvars, typval_T *rettv);
+ void f_prompt_setprompt(typval_T *argvars, typval_T *rettv);
+ void f_ch_canread(typval_T *argvars, typval_T *rettv);
+ void f_ch_close(typval_T *argvars, typval_T *rettv);
+ void f_ch_close_in(typval_T *argvars, typval_T *rettv);
+ void f_ch_getbufnr(typval_T *argvars, typval_T *rettv);
+ void f_ch_getjob(typval_T *argvars, typval_T *rettv);
+ void f_ch_info(typval_T *argvars, typval_T *rettv);
+ void f_ch_log(typval_T *argvars, typval_T *rettv);
+ void f_ch_logfile(typval_T *argvars, typval_T *rettv);
+ void f_ch_open(typval_T *argvars, typval_T *rettv);
+ void f_ch_read(typval_T *argvars, typval_T *rettv);
+ void f_ch_readblob(typval_T *argvars, typval_T *rettv);
+ void f_ch_readraw(typval_T *argvars, typval_T *rettv);
+ void f_ch_evalexpr(typval_T *argvars, typval_T *rettv);
+ void f_ch_sendexpr(typval_T *argvars, typval_T *rettv);
+ void f_ch_evalraw(typval_T *argvars, typval_T *rettv);
+ void f_ch_sendraw(typval_T *argvars, typval_T *rettv);
+ void f_ch_setoptions(typval_T *argvars, typval_T *rettv);
+ void f_ch_status(typval_T *argvars, typval_T *rettv);
+ void f_job_getchannel(typval_T *argvars, typval_T *rettv);
+ void f_job_info(typval_T *argvars, typval_T *rettv);
+ void f_job_setoptions(typval_T *argvars, typval_T *rettv);
+ void f_job_start(typval_T *argvars, typval_T *rettv);
+ void f_job_status(typval_T *argvars, typval_T *rettv);
+ void f_job_stop(typval_T *argvars, typval_T *rettv);
  /* vim: set ft=c : */
*** ../vim-8.1.1583/src/version.c       2019-06-23 01:46:11.840059790 +0200
--- src/version.c       2019-06-24 00:40:39.768369063 +0200
***************
*** 779,780 ****
--- 779,782 ----
  {   /* Add new patch number below this line */
+ /**/
+     1584,
  /**/

-- 
hundred-and-one symptoms of being an internet addict:
257. Your "hundred-and-one" lists include well over 101 items, since you
     automatically interpret all numbers in hexadecimal notation.
     (hex 101 = decimal 257)

 /// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net   \\\
///        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\  an exciting new programming language -- http://www.Zimbu.org        ///
 \\\            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 [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/vim_dev/201906232244.x5NMiQck025542%40masaka.moolenaar.net.
For more options, visit https://groups.google.com/d/optout.

Raspunde prin e-mail lui