comparison src/eval.c @ 8455:d0717262d802 v7.4.1518

commit https://github.com/vim/vim/commit/f65333c9b59654a70f2a07200f65c93dfcaa49b3 Author: Bram Moolenaar <Bram@vim.org> Date: Tue Mar 8 18:27:21 2016 +0100 patch 7.4.1518 Problem: Channel with disconnected in/out/err is not supported. Solution: Implement it for Unix.
author Christian Brabandt <cb@256bit.org>
date Tue, 08 Mar 2016 18:30:05 +0100
parents c0b5c2b0a5ee
children c08c6d19db4d
comparison
equal deleted inserted replaced
8454:41802f51dbb4 8455:d0717262d802
10283 /* 10283 /*
10284 * Get the channel from the argument. 10284 * Get the channel from the argument.
10285 * Returns NULL if the handle is invalid. 10285 * Returns NULL if the handle is invalid.
10286 */ 10286 */
10287 static channel_T * 10287 static channel_T *
10288 get_channel_arg(typval_T *tv) 10288 get_channel_arg(typval_T *tv, int check_open)
10289 { 10289 {
10290 channel_T *channel = NULL; 10290 channel_T *channel = NULL;
10291 10291
10292 if (tv->v_type == VAR_JOB) 10292 if (tv->v_type == VAR_JOB)
10293 { 10293 {
10302 { 10302 {
10303 EMSG2(_(e_invarg2), get_tv_string(tv)); 10303 EMSG2(_(e_invarg2), get_tv_string(tv));
10304 return NULL; 10304 return NULL;
10305 } 10305 }
10306 10306
10307 if (channel == NULL || !channel_is_open(channel)) 10307 if (check_open && (channel == NULL || !channel_is_open(channel)))
10308 { 10308 {
10309 EMSG(_("E906: not an open channel")); 10309 EMSG(_("E906: not an open channel"));
10310 return NULL; 10310 return NULL;
10311 } 10311 }
10312 return channel; 10312 return channel;
10316 * "ch_close()" function 10316 * "ch_close()" function
10317 */ 10317 */
10318 static void 10318 static void
10319 f_ch_close(typval_T *argvars, typval_T *rettv UNUSED) 10319 f_ch_close(typval_T *argvars, typval_T *rettv UNUSED)
10320 { 10320 {
10321 channel_T *channel = get_channel_arg(&argvars[0]); 10321 channel_T *channel = get_channel_arg(&argvars[0], TRUE);
10322 10322
10323 if (channel != NULL) 10323 if (channel != NULL)
10324 { 10324 {
10325 channel_close(channel, FALSE); 10325 channel_close(channel, FALSE);
10326 channel_clear(channel); 10326 channel_clear(channel);
10331 * "ch_getbufnr()" function 10331 * "ch_getbufnr()" function
10332 */ 10332 */
10333 static void 10333 static void
10334 f_ch_getbufnr(typval_T *argvars, typval_T *rettv) 10334 f_ch_getbufnr(typval_T *argvars, typval_T *rettv)
10335 { 10335 {
10336 channel_T *channel = get_channel_arg(&argvars[0]); 10336 channel_T *channel = get_channel_arg(&argvars[0], TRUE);
10337 10337
10338 rettv->vval.v_number = -1; 10338 rettv->vval.v_number = -1;
10339 if (channel != NULL) 10339 if (channel != NULL)
10340 { 10340 {
10341 char_u *what = get_tv_string(&argvars[1]); 10341 char_u *what = get_tv_string(&argvars[1]);
10359 * "ch_getjob()" function 10359 * "ch_getjob()" function
10360 */ 10360 */
10361 static void 10361 static void
10362 f_ch_getjob(typval_T *argvars, typval_T *rettv) 10362 f_ch_getjob(typval_T *argvars, typval_T *rettv)
10363 { 10363 {
10364 channel_T *channel = get_channel_arg(&argvars[0]); 10364 channel_T *channel = get_channel_arg(&argvars[0], TRUE);
10365 10365
10366 if (channel != NULL) 10366 if (channel != NULL)
10367 { 10367 {
10368 rettv->v_type = VAR_JOB; 10368 rettv->v_type = VAR_JOB;
10369 rettv->vval.v_job = channel->ch_job; 10369 rettv->vval.v_job = channel->ch_job;
10381 { 10381 {
10382 char_u *msg = get_tv_string(&argvars[0]); 10382 char_u *msg = get_tv_string(&argvars[0]);
10383 channel_T *channel = NULL; 10383 channel_T *channel = NULL;
10384 10384
10385 if (argvars[1].v_type != VAR_UNKNOWN) 10385 if (argvars[1].v_type != VAR_UNKNOWN)
10386 channel = get_channel_arg(&argvars[1]); 10386 channel = get_channel_arg(&argvars[1], TRUE);
10387 10387
10388 ch_log(channel, (char *)msg); 10388 ch_log(channel, (char *)msg);
10389 } 10389 }
10390 10390
10391 /* 10391 /*
10498 clear_job_options(&opt); 10498 clear_job_options(&opt);
10499 if (get_job_options(&argvars[1], &opt, JO_TIMEOUT + JO_PART + JO_ID) 10499 if (get_job_options(&argvars[1], &opt, JO_TIMEOUT + JO_PART + JO_ID)
10500 == FAIL) 10500 == FAIL)
10501 return; 10501 return;
10502 10502
10503 channel = get_channel_arg(&argvars[0]); 10503 channel = get_channel_arg(&argvars[0], TRUE);
10504 if (channel != NULL) 10504 if (channel != NULL)
10505 { 10505 {
10506 if (opt.jo_set & JO_PART) 10506 if (opt.jo_set & JO_PART)
10507 part = opt.jo_part; 10507 part = opt.jo_part;
10508 else 10508 else
10568 int *part_read) 10568 int *part_read)
10569 { 10569 {
10570 channel_T *channel; 10570 channel_T *channel;
10571 int part_send; 10571 int part_send;
10572 10572
10573 channel = get_channel_arg(&argvars[0]); 10573 channel = get_channel_arg(&argvars[0], TRUE);
10574 if (channel == NULL) 10574 if (channel == NULL)
10575 return NULL; 10575 return NULL;
10576 part_send = channel_part_send(channel); 10576 part_send = channel_part_send(channel);
10577 *part_read = channel_part_read(channel); 10577 *part_read = channel_part_read(channel);
10578 10578
10617 10617
10618 /* return an empty string by default */ 10618 /* return an empty string by default */
10619 rettv->v_type = VAR_STRING; 10619 rettv->v_type = VAR_STRING;
10620 rettv->vval.v_string = NULL; 10620 rettv->vval.v_string = NULL;
10621 10621
10622 channel = get_channel_arg(&argvars[0]); 10622 channel = get_channel_arg(&argvars[0], TRUE);
10623 if (channel == NULL) 10623 if (channel == NULL)
10624 return; 10624 return;
10625 part_send = channel_part_send(channel); 10625 part_send = channel_part_send(channel);
10626 10626
10627 ch_mode = channel_get_mode(channel, part_send); 10627 ch_mode = channel_get_mode(channel, part_send);
10734 f_ch_setoptions(typval_T *argvars, typval_T *rettv UNUSED) 10734 f_ch_setoptions(typval_T *argvars, typval_T *rettv UNUSED)
10735 { 10735 {
10736 channel_T *channel; 10736 channel_T *channel;
10737 jobopt_T opt; 10737 jobopt_T opt;
10738 10738
10739 channel = get_channel_arg(&argvars[0]); 10739 channel = get_channel_arg(&argvars[0], TRUE);
10740 if (channel == NULL) 10740 if (channel == NULL)
10741 return; 10741 return;
10742 clear_job_options(&opt); 10742 clear_job_options(&opt);
10743 if (get_job_options(&argvars[1], &opt, 10743 if (get_job_options(&argvars[1], &opt,
10744 JO_CB_ALL + JO_TIMEOUT_ALL + JO_MODE_ALL) == FAIL) 10744 JO_CB_ALL + JO_TIMEOUT_ALL + JO_MODE_ALL) == FAIL)
10750 * "ch_status()" function 10750 * "ch_status()" function
10751 */ 10751 */
10752 static void 10752 static void
10753 f_ch_status(typval_T *argvars, typval_T *rettv) 10753 f_ch_status(typval_T *argvars, typval_T *rettv)
10754 { 10754 {
10755 channel_T *channel;
10756
10755 /* return an empty string by default */ 10757 /* return an empty string by default */
10756 rettv->v_type = VAR_STRING; 10758 rettv->v_type = VAR_STRING;
10757 10759 rettv->vval.v_string = NULL;
10758 if (argvars[0].v_type != VAR_CHANNEL) 10760
10759 { 10761 channel = get_channel_arg(&argvars[0], FALSE);
10760 EMSG2(_(e_invarg2), get_tv_string(&argvars[0])); 10762 rettv->vval.v_string = vim_strsave((char_u *)channel_status(channel));
10761 rettv->vval.v_string = NULL;
10762 }
10763 else
10764 rettv->vval.v_string = vim_strsave(
10765 (char_u *)channel_status(argvars[0].vval.v_channel));
10766 } 10763 }
10767 #endif 10764 #endif
10768 10765
10769 /* 10766 /*
10770 * "changenr()" function 10767 * "changenr()" function