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));