Mercurial > vim
comparison src/eval.c @ 8031:ece323e2b57f v7.4.1310
commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Author: Bram Moolenaar <Bram@vim.org>
Date: Sat Feb 13 17:04:46 2016 +0100
patch 7.4.1310
Problem: Jobs don't open a channel.
Solution: Create pipes and add them to the channel. Add ch_logfile().
Only Unix for now.
author | Christian Brabandt <cb@256bit.org> |
---|---|
date | Sat, 13 Feb 2016 17:15:05 +0100 |
parents | 75e0831549f1 |
children | c6443e78cf2d |
comparison
equal
deleted
inserted
replaced
8030:05f57db9d8da | 8031:ece323e2b57f |
---|---|
501 static void f_call(typval_T *argvars, typval_T *rettv); | 501 static void f_call(typval_T *argvars, typval_T *rettv); |
502 #ifdef FEAT_FLOAT | 502 #ifdef FEAT_FLOAT |
503 static void f_ceil(typval_T *argvars, typval_T *rettv); | 503 static void f_ceil(typval_T *argvars, typval_T *rettv); |
504 #endif | 504 #endif |
505 #ifdef FEAT_CHANNEL | 505 #ifdef FEAT_CHANNEL |
506 static void f_ch_close(typval_T *argvars, typval_T *rettv); | |
507 static void f_ch_logfile(typval_T *argvars, typval_T *rettv); | |
506 static void f_ch_open(typval_T *argvars, typval_T *rettv); | 508 static void f_ch_open(typval_T *argvars, typval_T *rettv); |
507 static void f_ch_close(typval_T *argvars, typval_T *rettv); | 509 static void f_ch_readraw(typval_T *argvars, typval_T *rettv); |
508 static void f_ch_sendexpr(typval_T *argvars, typval_T *rettv); | 510 static void f_ch_sendexpr(typval_T *argvars, typval_T *rettv); |
509 static void f_ch_sendraw(typval_T *argvars, typval_T *rettv); | 511 static void f_ch_sendraw(typval_T *argvars, typval_T *rettv); |
510 #endif | 512 #endif |
511 static void f_changenr(typval_T *argvars, typval_T *rettv); | 513 static void f_changenr(typval_T *argvars, typval_T *rettv); |
512 static void f_char2nr(typval_T *argvars, typval_T *rettv); | 514 static void f_char2nr(typval_T *argvars, typval_T *rettv); |
622 static void f_invert(typval_T *argvars, typval_T *rettv); | 624 static void f_invert(typval_T *argvars, typval_T *rettv); |
623 static void f_isdirectory(typval_T *argvars, typval_T *rettv); | 625 static void f_isdirectory(typval_T *argvars, typval_T *rettv); |
624 static void f_islocked(typval_T *argvars, typval_T *rettv); | 626 static void f_islocked(typval_T *argvars, typval_T *rettv); |
625 static void f_items(typval_T *argvars, typval_T *rettv); | 627 static void f_items(typval_T *argvars, typval_T *rettv); |
626 #ifdef FEAT_JOB | 628 #ifdef FEAT_JOB |
629 static void f_job_getchannel(typval_T *argvars, typval_T *rettv); | |
627 static void f_job_start(typval_T *argvars, typval_T *rettv); | 630 static void f_job_start(typval_T *argvars, typval_T *rettv); |
628 static void f_job_stop(typval_T *argvars, typval_T *rettv); | 631 static void f_job_stop(typval_T *argvars, typval_T *rettv); |
629 static void f_job_status(typval_T *argvars, typval_T *rettv); | 632 static void f_job_status(typval_T *argvars, typval_T *rettv); |
630 #endif | 633 #endif |
631 static void f_join(typval_T *argvars, typval_T *rettv); | 634 static void f_join(typval_T *argvars, typval_T *rettv); |
7718 | 7721 |
7719 #ifdef FEAT_JOB | 7722 #ifdef FEAT_JOB |
7720 static void | 7723 static void |
7721 job_free(job_T *job) | 7724 job_free(job_T *job) |
7722 { | 7725 { |
7726 if (job->jv_channel >= 0) | |
7727 channel_close(job->jv_channel); | |
7723 mch_clear_job(job); | 7728 mch_clear_job(job); |
7724 vim_free(job); | 7729 vim_free(job); |
7725 } | 7730 } |
7726 | 7731 |
7727 static void | 7732 static void |
8081 #ifdef FEAT_FLOAT | 8086 #ifdef FEAT_FLOAT |
8082 {"ceil", 1, 1, f_ceil}, | 8087 {"ceil", 1, 1, f_ceil}, |
8083 #endif | 8088 #endif |
8084 #ifdef FEAT_CHANNEL | 8089 #ifdef FEAT_CHANNEL |
8085 {"ch_close", 1, 1, f_ch_close}, | 8090 {"ch_close", 1, 1, f_ch_close}, |
8091 {"ch_logfile", 1, 2, f_ch_logfile}, | |
8086 {"ch_open", 1, 2, f_ch_open}, | 8092 {"ch_open", 1, 2, f_ch_open}, |
8093 {"ch_readraw", 1, 2, f_ch_readraw}, | |
8087 {"ch_sendexpr", 2, 3, f_ch_sendexpr}, | 8094 {"ch_sendexpr", 2, 3, f_ch_sendexpr}, |
8088 {"ch_sendraw", 2, 3, f_ch_sendraw}, | 8095 {"ch_sendraw", 2, 3, f_ch_sendraw}, |
8089 #endif | 8096 #endif |
8090 {"changenr", 0, 0, f_changenr}, | 8097 {"changenr", 0, 0, f_changenr}, |
8091 {"char2nr", 1, 2, f_char2nr}, | 8098 {"char2nr", 1, 2, f_char2nr}, |
8205 {"invert", 1, 1, f_invert}, | 8212 {"invert", 1, 1, f_invert}, |
8206 {"isdirectory", 1, 1, f_isdirectory}, | 8213 {"isdirectory", 1, 1, f_isdirectory}, |
8207 {"islocked", 1, 1, f_islocked}, | 8214 {"islocked", 1, 1, f_islocked}, |
8208 {"items", 1, 1, f_items}, | 8215 {"items", 1, 1, f_items}, |
8209 #ifdef FEAT_JOB | 8216 #ifdef FEAT_JOB |
8217 {"job_getchannel", 1, 1, f_job_getchannel}, | |
8210 {"job_start", 1, 2, f_job_start}, | 8218 {"job_start", 1, 2, f_job_start}, |
8211 {"job_status", 1, 1, f_job_status}, | 8219 {"job_status", 1, 1, f_job_status}, |
8212 {"job_stop", 1, 2, f_job_stop}, | 8220 {"job_stop", 1, 2, f_job_stop}, |
8213 #endif | 8221 #endif |
8214 {"join", 1, 2, f_join}, | 8222 {"join", 1, 2, f_join}, |
9786 EMSG2(_(e_invarg2), get_tv_string(tv)); | 9794 EMSG2(_(e_invarg2), get_tv_string(tv)); |
9787 return -1; | 9795 return -1; |
9788 } | 9796 } |
9789 ch_idx = tv->vval.v_number; | 9797 ch_idx = tv->vval.v_number; |
9790 | 9798 |
9791 if (!channel_is_open(ch_idx)) | 9799 if (!channel_can_write_to(ch_idx)) |
9792 { | 9800 { |
9793 EMSGN(_("E906: not an open channel"), ch_idx); | 9801 EMSGN(_("E906: not an open channel"), ch_idx); |
9794 return -1; | 9802 return -1; |
9795 } | 9803 } |
9796 return ch_idx; | 9804 return ch_idx; |
9820 return arg->vval.v_string; | 9828 return arg->vval.v_string; |
9821 if (arg->v_type == VAR_NUMBER && arg->vval.v_number == 0) | 9829 if (arg->v_type == VAR_NUMBER && arg->vval.v_number == 0) |
9822 return (char_u *)""; | 9830 return (char_u *)""; |
9823 EMSG(_("E999: Invalid callback argument")); | 9831 EMSG(_("E999: Invalid callback argument")); |
9824 return NULL; | 9832 return NULL; |
9833 } | |
9834 | |
9835 /* | |
9836 * "ch_logfile()" function | |
9837 */ | |
9838 static void | |
9839 f_ch_logfile(typval_T *argvars, typval_T *rettv UNUSED) | |
9840 { | |
9841 char_u *fname; | |
9842 char_u *opt = (char_u *)""; | |
9843 char_u buf[NUMBUFLEN]; | |
9844 FILE *file = NULL; | |
9845 | |
9846 fname = get_tv_string(&argvars[0]); | |
9847 if (argvars[1].v_type == VAR_STRING) | |
9848 opt = get_tv_string_buf(&argvars[1], buf); | |
9849 if (*fname != NUL) | |
9850 { | |
9851 file = fopen((char *)fname, *opt == 'w' ? "w" : "a"); | |
9852 if (file == NULL) | |
9853 { | |
9854 EMSG2(_(e_notopen), fname); | |
9855 return; | |
9856 } | |
9857 } | |
9858 ch_logfile(file); | |
9825 } | 9859 } |
9826 | 9860 |
9827 /* | 9861 /* |
9828 * "ch_open()" function | 9862 * "ch_open()" function |
9829 */ | 9863 */ |
9909 channel_set_timeout(ch_idx, timeout); | 9943 channel_set_timeout(ch_idx, timeout); |
9910 if (callback != NULL && *callback != NUL) | 9944 if (callback != NULL && *callback != NUL) |
9911 channel_set_callback(ch_idx, callback); | 9945 channel_set_callback(ch_idx, callback); |
9912 } | 9946 } |
9913 rettv->vval.v_number = ch_idx; | 9947 rettv->vval.v_number = ch_idx; |
9948 } | |
9949 | |
9950 /* | |
9951 * "ch_readraw()" function | |
9952 */ | |
9953 static void | |
9954 f_ch_readraw(typval_T *argvars, typval_T *rettv) | |
9955 { | |
9956 int ch_idx; | |
9957 | |
9958 /* return an empty string by default */ | |
9959 rettv->v_type = VAR_STRING; | |
9960 rettv->vval.v_string = NULL; | |
9961 | |
9962 ch_idx = get_channel_arg(&argvars[0]); | |
9963 if (ch_idx < 0) | |
9964 { | |
9965 EMSG(_(e_invarg)); | |
9966 return; | |
9967 } | |
9968 rettv->vval.v_string = channel_read_block(ch_idx); | |
9914 } | 9969 } |
9915 | 9970 |
9916 /* | 9971 /* |
9917 * common for "sendexpr()" and "sendraw()" | 9972 * common for "sendexpr()" and "sendraw()" |
9918 * Returns the channel index if the caller should read the response. | 9973 * Returns the channel index if the caller should read the response. |
14298 dict_list(argvars, rettv, 2); | 14353 dict_list(argvars, rettv, 2); |
14299 } | 14354 } |
14300 | 14355 |
14301 #ifdef FEAT_JOB | 14356 #ifdef FEAT_JOB |
14302 /* | 14357 /* |
14358 * "job_getchannel()" function | |
14359 */ | |
14360 static void | |
14361 f_job_getchannel(typval_T *argvars, typval_T *rettv) | |
14362 { | |
14363 if (argvars[0].v_type != VAR_JOB) | |
14364 EMSG(_(e_invarg)); | |
14365 else | |
14366 { | |
14367 job_T *job = argvars[0].vval.v_job; | |
14368 | |
14369 rettv->v_type = VAR_NUMBER; | |
14370 rettv->vval.v_number = job->jv_channel; | |
14371 } | |
14372 } | |
14373 | |
14374 /* | |
14303 * "job_start()" function | 14375 * "job_start()" function |
14304 */ | 14376 */ |
14305 static void | 14377 static void |
14306 f_job_start(typval_T *argvars UNUSED, typval_T *rettv) | 14378 f_job_start(typval_T *argvars UNUSED, typval_T *rettv) |
14307 { | 14379 { |
14399 | 14471 |
14400 /* | 14472 /* |
14401 * "job_status()" function | 14473 * "job_status()" function |
14402 */ | 14474 */ |
14403 static void | 14475 static void |
14404 f_job_status(typval_T *argvars UNUSED, typval_T *rettv UNUSED) | 14476 f_job_status(typval_T *argvars, typval_T *rettv) |
14405 { | 14477 { |
14406 char *result; | 14478 char *result; |
14407 | 14479 |
14408 if (argvars[0].v_type != VAR_JOB) | 14480 if (argvars[0].v_type != VAR_JOB) |
14409 EMSG(_(e_invarg)); | 14481 EMSG(_(e_invarg)); |