@@ -726,6 +726,7 @@ static void f_synIDtrans __ARGS((typval_T *argvars, typval_T *rettv));
726726static void f_synstack __ARGS((typval_T *argvars, typval_T *rettv));
727727static void f_synconcealed __ARGS((typval_T *argvars, typval_T *rettv));
728728static void f_system __ARGS((typval_T *argvars, typval_T *rettv));
729+ static void f_systemlist __ARGS((typval_T *argvars, typval_T *rettv));
729730static void f_tabpagebuflist __ARGS((typval_T *argvars, typval_T *rettv));
730731static void f_tabpagenr __ARGS((typval_T *argvars, typval_T *rettv));
731732static void f_tabpagewinnr __ARGS((typval_T *argvars, typval_T *rettv));
@@ -837,6 +838,7 @@ static int searchpair_cmn __ARGS((typval_T *argvars, pos_T *match_pos));
837838static int search_cmn __ARGS((typval_T *argvars, pos_T *match_pos, int *flagsp));
838839static void setwinvar __ARGS((typval_T *argvars, typval_T *rettv, int off));
839840static int write_list __ARGS((FILE *fd, list_T *list, int binary));
841+ static void get_cmd_output_as_rettv __ARGS((typval_T *argvars, typval_T *rettv, int retlist));
840842
841843
842844#ifdef EBCDIC
@@ -8139,6 +8141,7 @@ static struct fst
81398141 {"synconcealed", 2, 2, f_synconcealed},
81408142 {"synstack", 2, 2, f_synstack},
81418143 {"system", 1, 2, f_system},
8144+ {"systemlist", 1, 2, f_systemlist},
81428145 {"tabpagebuflist", 0, 1, f_tabpagebuflist},
81438146 {"tabpagenr", 0, 1, f_tabpagenr},
81448147 {"tabpagewinnr", 1, 2, f_tabpagewinnr},
@@ -18232,23 +18235,24 @@ f_synstack(argvars, rettv)
1823218235#endif
1823318236}
1823418237
18235- /*
18236- * "system()" function
18237- */
1823818238 static void
18239- f_system (argvars, rettv)
18239+ get_cmd_output_as_rettv (argvars, rettv, retlist )
1824018240 typval_T *argvars;
1824118241 typval_T *rettv;
18242+ int retlist;
1824218243{
1824318244 char_u *res = NULL;
1824418245 char_u *p;
1824518246 char_u *infile = NULL;
1824618247 char_u buf[NUMBUFLEN];
1824718248 int err = FALSE;
1824818249 FILE *fd;
18250+ list_T *list = NULL;
1824918251
18252+ rettv->v_type = VAR_STRING;
18253+ rettv->vval.v_string = NULL;
1825018254 if (check_restricted() || check_secure())
18251- goto done ;
18255+ goto errret ;
1825218256
1825318257 if (argvars[1].v_type != VAR_UNKNOWN)
1825418258 {
@@ -18259,14 +18263,14 @@ f_system(argvars, rettv)
1825918263 if ((infile = vim_tempname('i')) == NULL)
1826018264 {
1826118265 EMSG(_(e_notmp));
18262- goto done ;
18266+ goto errret ;
1826318267 }
1826418268
1826518269 fd = mch_fopen((char *)infile, WRITEBIN);
1826618270 if (fd == NULL)
1826718271 {
1826818272 EMSG2(_(e_notopen), infile);
18269- goto done ;
18273+ goto errret ;
1827018274 }
1827118275 if (argvars[1].v_type == VAR_LIST)
1827218276 {
@@ -18279,7 +18283,7 @@ f_system(argvars, rettv)
1827918283 if (p == NULL)
1828018284 {
1828118285 fclose(fd);
18282- goto done ; /* type error; errmsg already given */
18286+ goto errret ; /* type error; errmsg already given */
1828318287 }
1828418288 if (fwrite(p, STRLEN(p), 1, fd) != 1)
1828518289 err = TRUE;
@@ -18289,52 +18293,128 @@ f_system(argvars, rettv)
1828918293 if (err)
1829018294 {
1829118295 EMSG(_("E677: Error writing temp file"));
18292- goto done ;
18296+ goto errret ;
1829318297 }
1829418298 }
1829518299
18296- res = get_cmd_output(get_tv_string(&argvars[0]), infile,
18297- SHELL_SILENT | SHELL_COOKED);
18298-
18299- #ifdef USE_CR
18300- /* translate <CR> into <NL> */
18301- if (res != NULL)
18300+ if (retlist)
1830218301 {
18303- char_u *s;
18302+ int len;
18303+ listitem_T *li;
18304+ char_u *s = NULL;
18305+ char_u *start;
18306+ char_u *end;
18307+ char_u *p;
18308+ int i;
18309+
18310+ res = get_cmd_output(get_tv_string(&argvars[0]), infile,
18311+ SHELL_SILENT | SHELL_COOKED, &len);
18312+ if (res == NULL)
18313+ goto errret;
18314+
18315+ list = list_alloc();
18316+ if (list == NULL)
18317+ goto errret;
1830418318
18305- for (s = res; *s ; ++s )
18319+ for (i = 0; i < len ; ++i )
1830618320 {
18307- if (*s == CAR)
18308- *s = NL;
18321+ start = res + i;
18322+ for (end = start; i < len && *end != NL; ++end)
18323+ ++i;
18324+
18325+ s = vim_strnsave(start, (int)(end - start));
18326+ if (s == NULL)
18327+ goto errret;
18328+
18329+ for (p = s, end = s + (end - start); p < end; ++p)
18330+ if (*p == NUL)
18331+ *p = NL;
18332+
18333+ li = listitem_alloc();
18334+ if (li == NULL)
18335+ {
18336+ vim_free(s);
18337+ goto errret;
18338+ }
18339+ li->li_tv.v_type = VAR_STRING;
18340+ li->li_tv.vval.v_string = s;
18341+ list_append(list, li);
1830918342 }
18343+
18344+ rettv->v_type = VAR_LIST;
18345+ rettv->vval.v_list = list;
18346+ list = NULL;
1831018347 }
18311- #else
18312- # ifdef USE_CRNL
18313- /* translate <CR><NL> into <NL> */
18314- if (res != NULL)
18348+ else
1831518349 {
18316- char_u *s, *d;
18350+ res = get_cmd_output(get_tv_string(&argvars[0]), infile,
18351+ SHELL_SILENT | SHELL_COOKED, NULL);
18352+ #ifdef USE_CR
18353+ /* translate <CR> into <NL> */
18354+ if (res != NULL)
18355+ {
18356+ char_u *s;
1831718357
18318- d = res;
18319- for (s = res; *s; ++s)
18358+ for (s = res; *s; ++s)
18359+ {
18360+ if (*s == CAR)
18361+ *s = NL;
18362+ }
18363+ }
18364+ #else
18365+ # ifdef USE_CRNL
18366+ /* translate <CR><NL> into <NL> */
18367+ if (res != NULL)
1832018368 {
18321- if (s[0] == CAR && s[1] == NL)
18322- ++s;
18323- *d++ = *s;
18369+ char_u *s, *d;
18370+
18371+ d = res;
18372+ for (s = res; *s; ++s)
18373+ {
18374+ if (s[0] == CAR && s[1] == NL)
18375+ ++s;
18376+ *d++ = *s;
18377+ }
18378+ *d = NUL;
1832418379 }
18325- *d = NUL;
18326- }
1832718380# endif
1832818381#endif
18382+ rettv->vval.v_string = res;
18383+ res = NULL;
18384+ }
1832918385
18330- done :
18386+ errret :
1833118387 if (infile != NULL)
1833218388 {
1833318389 mch_remove(infile);
1833418390 vim_free(infile);
1833518391 }
18336- rettv->v_type = VAR_STRING;
18337- rettv->vval.v_string = res;
18392+ if (res != NULL)
18393+ vim_free(res);
18394+ if (list != NULL)
18395+ list_free(list, TRUE);
18396+ }
18397+
18398+ /*
18399+ * "system()" function
18400+ */
18401+ static void
18402+ f_system(argvars, rettv)
18403+ typval_T *argvars;
18404+ typval_T *rettv;
18405+ {
18406+ get_cmd_output_as_rettv(argvars, rettv, FALSE);
18407+ }
18408+
18409+ /*
18410+ * "systemlist()" function
18411+ */
18412+ static void
18413+ f_systemlist(argvars, rettv)
18414+ typval_T *argvars;
18415+ typval_T *rettv;
18416+ {
18417+ get_cmd_output_as_rettv(argvars, rettv, TRUE);
1833818418}
1833918419
1834018420/*
0 commit comments