Mercurial > vim
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 |