| To: vim_dev@googlegroups.com |
| Subject: Patch 7.4.247 |
| Fcc: outbox |
| From: Bram Moolenaar <Bram@moolenaar.net> |
| Mime-Version: 1.0 |
| Content-Type: text/plain; charset=UTF-8 |
| Content-Transfer-Encoding: 8bit |
| |
| |
| Patch 7.4.247 |
| Problem: When passing input to system() there is no way to keep NUL and |
| NL characters separate. |
| Solution: Optionally use a list for the system() input. (ZyX) |
| Files: runtime/doc/eval.txt, src/eval.c |
| |
| |
| |
| |
| |
| *** 5951,5960 **** |
| |
| system({expr} [, {input}]) *system()* *E677* |
| Get the output of the shell command {expr}. |
| ! When {input} is given, this string is written to a file and |
| ! passed as stdin to the command. The string is written as-is, |
| ! you need to take care of using the correct line separators |
| ! yourself. Pipes are not used. |
| Note: Use |shellescape()| or |::S| with |expand()| or |
| |fnamemodify()| to escape special characters in a command |
| argument. Newlines in {expr} may cause the command to fail. |
| --- 5964,5980 ---- |
| |
| system({expr} [, {input}]) *system()* *E677* |
| Get the output of the shell command {expr}. |
| ! |
| ! When {input} is given and is a string this string is written |
| ! to a file and passed as stdin to the command. The string is |
| ! written as-is, you need to take care of using the correct line |
| ! separators yourself. |
| ! If {input} is given and is a |List| it is written to the file |
| ! in a way |writefile()| does with {binary} set to "b" (i.e. |
| ! with a newline between each list item with newlines inside |
| ! list items converted to NULs). |
| ! Pipes are not used. |
| ! |
| Note: Use |shellescape()| or |::S| with |expand()| or |
| |fnamemodify()| to escape special characters in a command |
| argument. Newlines in {expr} may cause the command to fail. |
| |
| |
| |
| *** 836,841 **** |
| --- 836,842 ---- |
| static int searchpair_cmn __ARGS((typval_T *argvars, pos_T *match_pos)); |
| static int search_cmn __ARGS((typval_T *argvars, pos_T *match_pos, int *flagsp)); |
| static void setwinvar __ARGS((typval_T *argvars, typval_T *rettv, int off)); |
| + static int write_list __ARGS((FILE *fd, list_T *list, int binary)); |
| |
| |
| #ifdef EBCDIC |
| |
| *** 18267,18280 **** |
| EMSG2(_(e_notopen), infile); |
| goto done; |
| } |
| ! p = get_tv_string_buf_chk(&argvars[1], buf); |
| ! if (p == NULL) |
| { |
| ! fclose(fd); |
| ! goto done; /* type error; errmsg already given */ |
| } |
| - if (fwrite(p, STRLEN(p), 1, fd) != 1) |
| - err = TRUE; |
| if (fclose(fd) != 0) |
| err = TRUE; |
| if (err) |
| --- 18268,18289 ---- |
| EMSG2(_(e_notopen), infile); |
| goto done; |
| } |
| ! if (argvars[1].v_type == VAR_LIST) |
| { |
| ! if (write_list(fd, argvars[1].vval.v_list, TRUE) == FAIL) |
| ! err = TRUE; |
| ! } |
| ! else |
| ! { |
| ! p = get_tv_string_buf_chk(&argvars[1], buf); |
| ! if (p == NULL) |
| ! { |
| ! fclose(fd); |
| ! goto done; /* type error; errmsg already given */ |
| ! } |
| ! if (fwrite(p, STRLEN(p), 1, fd) != 1) |
| ! err = TRUE; |
| } |
| if (fclose(fd) != 0) |
| err = TRUE; |
| if (err) |
| |
| *** 19173,19178 **** |
| --- 19182,19230 ---- |
| } |
| |
| /* |
| + * Write list of strings to file |
| + */ |
| + static int |
| + write_list(fd, list, binary) |
| + FILE *fd; |
| + list_T *list; |
| + int binary; |
| + { |
| + listitem_T *li; |
| + int c; |
| + int ret = OK; |
| + char_u *s; |
| + |
| + for (li = list->lv_first; li != NULL; li = li->li_next) |
| + { |
| + for (s = get_tv_string(&li->li_tv); *s != NUL; ++s) |
| + { |
| + if (*s == '\n') |
| + c = putc(NUL, fd); |
| + else |
| + c = putc(*s, fd); |
| + if (c == EOF) |
| + { |
| + ret = FAIL; |
| + break; |
| + } |
| + } |
| + if (!binary || li->li_next != NULL) |
| + if (putc('\n', fd) == EOF) |
| + { |
| + ret = FAIL; |
| + break; |
| + } |
| + if (ret == FAIL) |
| + { |
| + EMSG(_(e_write)); |
| + break; |
| + } |
| + } |
| + return ret; |
| + } |
| + |
| + /* |
| * "writefile()" function |
| */ |
| static void |
| |
| *** 19183,19192 **** |
| int binary = FALSE; |
| char_u *fname; |
| FILE *fd; |
| - listitem_T *li; |
| - char_u *s; |
| int ret = 0; |
| - int c; |
| |
| if (check_restricted() || check_secure()) |
| return; |
| --- 19235,19241 ---- |
| |
| *** 19213,19245 **** |
| } |
| else |
| { |
| ! for (li = argvars[0].vval.v_list->lv_first; li != NULL; |
| ! li = li->li_next) |
| ! { |
| ! for (s = get_tv_string(&li->li_tv); *s != NUL; ++s) |
| ! { |
| ! if (*s == '\n') |
| ! c = putc(NUL, fd); |
| ! else |
| ! c = putc(*s, fd); |
| ! if (c == EOF) |
| ! { |
| ! ret = -1; |
| ! break; |
| ! } |
| ! } |
| ! if (!binary || li->li_next != NULL) |
| ! if (putc('\n', fd) == EOF) |
| ! { |
| ! ret = -1; |
| ! break; |
| ! } |
| ! if (ret < 0) |
| ! { |
| ! EMSG(_(e_write)); |
| ! break; |
| ! } |
| ! } |
| fclose(fd); |
| } |
| |
| --- 19262,19269 ---- |
| } |
| else |
| { |
| ! if (write_list(fd, argvars[0].vval.v_list, binary) == FAIL) |
| ! ret = -1; |
| fclose(fd); |
| } |
| |
| |
| |
| |
| *** 736,737 **** |
| --- 736,739 ---- |
| { /* Add new patch number below this line */ |
| + /**/ |
| + 247, |
| /**/ |
| |
| -- |
| Time is an illusion. Lunchtime doubly so. |
| -- Ford Prefect, in Douglas Adams' |
| "The Hitchhiker's Guide to the Galaxy" |
| |
| /// Bram Moolenaar -- Bram@Moolenaar.net -- 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 /// |