# HG changeset patch # User ZyX <kp-...@ya.ru> # Date 1383995203 -14400 # Sat Nov 09 15:06:43 2013 +0400 # Branch NL-funcs # Node ID b719d5d95852adc804831af9c524db3640382067 # Parent c25ccecf79b681e79005bb0b8aed9153094ce207 Add readshell() function
diff --git a/runtime/doc/eval.txt b/runtime/doc/eval.txt --- a/runtime/doc/eval.txt +++ b/runtime/doc/eval.txt @@ -1893,6 +1893,7 @@ List items from {expr} to {max} readfile( {fname} [, {binary} [, {max}]]) List get list of lines from file {fname} +readshell( {expr} [, {input}]) List output of shell command/filter {expr} reltime( [{start} [, {end}]]) List get time value reltimestr( {time}) String turn time value into a String remote_expr( {server}, {string} [, {idvar}]) @@ -4742,6 +4743,15 @@ the result is an empty list. Also see |writefile()|. +readshell({expr} [, {input}]) *readshell()* + Same as |system()|, but returns a |List| with lines (parts of + output separated by NL) with NULs transformed into NLs. Output + is the same as |readfile()| will output with {binary} argument + set to "b". + + Returns an empty string on error, so be careful not to run + into |E706|. + reltime([{start} [, {end}]]) *reltime()* Return an item that represents a time value. The format of the item depends on the system. It can be passed to @@ -5931,7 +5941,8 @@ is filtered to replace <CR> with <NL> for Macintosh, and <CR><NL> with <NL> for DOS-like systems. To avoid the string being truncated at a NUL, all NUL - characters are replaced with SOH (0x01). + characters are replaced with SOH (0x01). See |readshell()| if + you want to distinguish NULs and SOHs. The command executed is constructed using several options: 'shell' 'shellcmdflag' 'shellxquote' {expr} 'shellredir' {tmp} 'shellxquote' diff --git a/src/eval.c b/src/eval.c --- a/src/eval.c +++ b/src/eval.c @@ -644,6 +644,7 @@ #endif static void f_range __ARGS((typval_T *argvars, typval_T *rettv)); static void f_readfile __ARGS((typval_T *argvars, typval_T *rettv)); +static void f_readshell __ARGS((typval_T *argvars, typval_T *rettv)); static void f_reltime __ARGS((typval_T *argvars, typval_T *rettv)); static void f_reltimestr __ARGS((typval_T *argvars, typval_T *rettv)); static void f_remote_expr __ARGS((typval_T *argvars, typval_T *rettv)); @@ -831,6 +832,7 @@ 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)); +static void get_cmd_output_as_rettv __ARGS((typval_T *argvars, typval_T *rettv, int retlist)); #ifdef EBCDIC @@ -8082,6 +8084,7 @@ #endif {"range", 1, 3, f_range}, {"readfile", 1, 3, f_readfile}, + {"readshell", 1, 2, f_readshell}, {"reltime", 0, 2, f_reltime}, {"reltimestr", 1, 1, f_reltimestr}, {"remote_expr", 2, 3, f_remote_expr}, @@ -15009,6 +15012,17 @@ fclose(fd); } +/* + * "readshell()" function + */ + static void +f_readshell(argvars, rettv) + typval_T *argvars; + typval_T *rettv; +{ + get_cmd_output_as_rettv(argvars, rettv, TRUE); +} + #if defined(FEAT_RELTIME) static int list2proftime __ARGS((typval_T *arg, proftime_T *tm)); @@ -18160,13 +18174,11 @@ #endif } -/* - * "system()" function - */ - static void -f_system(argvars, rettv) - typval_T *argvars; - typval_T *rettv; + static void +get_cmd_output_as_rettv(argvars, rettv, retlist) + typval_T *argvars; + typval_T *rettv; + int retlist; { char_u *res = NULL; char_u *p; @@ -18174,9 +18186,10 @@ char_u buf[NUMBUFLEN]; int err = FALSE; FILE *fd; + list_T *list = NULL; if (check_restricted() || check_secure()) - goto done; + goto errret; if (argvars[1].v_type != VAR_UNKNOWN) { @@ -18187,14 +18200,14 @@ if ((infile = vim_tempname('i')) == NULL) { EMSG(_(e_notmp)); - goto done; + goto errret; } fd = mch_fopen((char *)infile, WRITEBIN); if (fd == NULL) { EMSG2(_(e_notopen), infile); - goto done; + goto errret; } if (argvars[1].v_type == VAR_LIST) { @@ -18207,7 +18220,7 @@ if (p == NULL) { fclose(fd); - goto done; /* type error; errmsg already given */ + goto errret; /* type error; errmsg already given */ } if (fwrite(p, STRLEN(p), 1, fd) != 1) err = TRUE; @@ -18217,52 +18230,133 @@ if (err) { EMSG(_("E677: Error writing temp file")); - goto done; - } - } - - res = get_cmd_output(get_tv_string(&argvars[0]), infile, - SHELL_SILENT | SHELL_COOKED); + goto errret; + } + } + + if (retlist) + { + int len; + listitem_T *li; + char_u *s = NULL; + char_u *start; + char_u *end; + char_u *p; + int i; + + res = get_cmd_output(get_tv_string(&argvars[0]), infile, + SHELL_SILENT | SHELL_COOKED, + &len); + + if (res == NULL) + goto errret; + + list = list_alloc(); + if (list == NULL) + goto errret; + + for (i = 0 ; i <= len ; ++i) + { + start = res + i; + for (end = start; i < len && *end != NL; ++end) + ++i; + + s = vim_strnsave(start, (int) (end - start)); + if (s == NULL) + goto errret; + + for (p = s, end = s + (end - start); p < end; ++p) + if (*p == NUL) + *p = NL; + + li = listitem_alloc(); + if (li == NULL) + { + vim_free(s); + goto errret; + } + + li->li_tv.v_type = VAR_STRING; + li->li_tv.vval.v_string = s; + + list_append(list, li); + } + + vim_free(res); + + rettv->v_type = VAR_LIST; + rettv->vval.v_list = list; + } + else + { + res = get_cmd_output(get_tv_string(&argvars[0]), infile, + SHELL_SILENT | SHELL_COOKED, + NULL); #ifdef USE_CR - /* translate <CR> into <NL> */ - if (res != NULL) - { - char_u *s; - - for (s = res; *s; ++s) - { - if (*s == CAR) - *s = NL; - } - } + /* translate <CR> into <NL> */ + if (res != NULL) + { + char_u *s; + + for (s = res; *s; ++s) + { + if (*s == CAR) + *s = NL; + } + } #else # ifdef USE_CRNL - /* translate <CR><NL> into <NL> */ - if (res != NULL) - { - char_u *s, *d; - - d = res; - for (s = res; *s; ++s) - { - if (s[0] == CAR && s[1] == NL) - ++s; - *d++ = *s; - } - *d = NUL; - } -# endif -#endif - -done: + /* translate <CR><NL> into <NL> */ + if (res != NULL) + { + char_u *s, *d; + + d = res; + for (s = res; *s; ++s) + { + if (s[0] == CAR && s[1] == NL) + ++s; + *d++ = *s; + } + *d = NUL; + } +# endif +#endif + rettv->v_type = VAR_STRING; + rettv->vval.v_string = res; + } + if (infile != NULL) { mch_remove(infile); vim_free(infile); } - rettv->v_type = VAR_STRING; - rettv->vval.v_string = res; + return; + +errret: + if (infile != NULL) + { + mch_remove(infile); + vim_free(infile); + } + if (res != NULL) + vim_free(res); + if (list != NULL) + list_free(list, TRUE); + rettv->v_type = VAR_STRING; + rettv->vval.v_string = NULL; +} + +/* + * "system()" function + */ + static void +f_system(argvars, rettv) + typval_T *argvars; + typval_T *rettv; +{ + get_cmd_output_as_rettv(argvars, rettv, FALSE); } /* diff --git a/src/ex_cmds2.c b/src/ex_cmds2.c --- a/src/ex_cmds2.c +++ b/src/ex_cmds2.c @@ -4329,7 +4329,8 @@ /* Find all available locales by running command "locale -a". If this * doesn't work we won't have completion. */ char_u *locale_a = get_cmd_output((char_u *)"locale -a", - NULL, SHELL_SILENT); + NULL, SHELL_SILENT, + NULL); if (locale_a == NULL) return NULL; ga_init2(&locales_ga, sizeof(char_u *), 20); diff --git a/src/misc1.c b/src/misc1.c --- a/src/misc1.c +++ b/src/misc1.c @@ -10720,7 +10720,8 @@ else #endif buffer = get_cmd_output(cmd, NULL, - (flags & EW_SILENT) ? SHELL_SILENT : 0); + (flags & EW_SILENT) ? SHELL_SILENT : 0, + NULL); vim_free(cmd); if (buffer == NULL) return 0; @@ -10823,10 +10824,11 @@ * Returns an allocated string, or NULL for error. */ char_u * -get_cmd_output(cmd, infile, flags) +get_cmd_output(cmd, infile, flags, ret_len) char_u *cmd; char_u *infile; /* optional input file name */ int flags; /* can be SHELL_SILENT */ + int *ret_len; { char_u *tempname; char_u *command; @@ -10896,7 +10898,7 @@ vim_free(buffer); buffer = NULL; } - else + else if (ret_len == NULL) { /* Change NUL into SOH, otherwise the string is truncated. */ for (i = 0; i < len; ++i) @@ -10905,6 +10907,8 @@ buffer[len] = NUL; /* make sure the buffer is terminated */ } + else + *ret_len = len; done: vim_free(tempname); diff --git a/src/proto/misc1.pro b/src/proto/misc1.pro --- a/src/proto/misc1.pro +++ b/src/proto/misc1.pro @@ -98,7 +98,7 @@ void remove_duplicates __ARGS((garray_T *gap)); int gen_expand_wildcards __ARGS((int num_pat, char_u **pat, int *num_file, char_u ***file, int flags)); void addfile __ARGS((garray_T *gap, char_u *f, int flags)); -char_u *get_cmd_output __ARGS((char_u *cmd, char_u *infile, int flags)); +char_u *get_cmd_output __ARGS((char_u *cmd, char_u *infile, int flags, int *ret_len)); void FreeWild __ARGS((int count, char_u **files)); int goto_im __ARGS((void)); /* vim: set ft=c : */ -- -- You received this message from the "vim_dev" maillist. Do not top-post! Type your reply below the text you are replying to. For more information, visit http://www.vim.org/maillist.php --- You received this message because you are subscribed to the Google Groups "vim_dev" group. To unsubscribe from this group and stop receiving emails from it, send an email to vim_dev+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/groups/opt_out.
diff -crN -a vim-small-patches.c25ccecf79b6/runtime/doc/eval.txt vim-small-patches.b719d5d95852/runtime/doc/eval.txt *** vim-small-patches.c25ccecf79b6/runtime/doc/eval.txt 2013-11-09 15:07:13.565118811 +0400 --- vim-small-patches.b719d5d95852/runtime/doc/eval.txt 2013-11-09 15:07:13.617118813 +0400 *************** *** 1893,1898 **** --- 1893,1899 ---- List items from {expr} to {max} readfile( {fname} [, {binary} [, {max}]]) List get list of lines from file {fname} + readshell( {expr} [, {input}]) List output of shell command/filter {expr} reltime( [{start} [, {end}]]) List get time value reltimestr( {time}) String turn time value into a String remote_expr( {server}, {string} [, {idvar}]) *************** *** 4742,4747 **** --- 4743,4757 ---- the result is an empty list. Also see |writefile()|. + readshell({expr} [, {input}]) *readshell()* + Same as |system()|, but returns a |List| with lines (parts of + output separated by NL) with NULs transformed into NLs. Output + is the same as |readfile()| will output with {binary} argument + set to "b". + + Returns an empty string on error, so be careful not to run + into |E706|. + reltime([{start} [, {end}]]) *reltime()* Return an item that represents a time value. The format of the item depends on the system. It can be passed to *************** *** 5931,5937 **** is filtered to replace <CR> with <NL> for Macintosh, and <CR><NL> with <NL> for DOS-like systems. To avoid the string being truncated at a NUL, all NUL ! characters are replaced with SOH (0x01). The command executed is constructed using several options: 'shell' 'shellcmdflag' 'shellxquote' {expr} 'shellredir' {tmp} 'shellxquote' --- 5941,5948 ---- is filtered to replace <CR> with <NL> for Macintosh, and <CR><NL> with <NL> for DOS-like systems. To avoid the string being truncated at a NUL, all NUL ! characters are replaced with SOH (0x01). See |readshell()| if ! you want to distinguish NULs and SOHs. The command executed is constructed using several options: 'shell' 'shellcmdflag' 'shellxquote' {expr} 'shellredir' {tmp} 'shellxquote' diff -crN -a vim-small-patches.c25ccecf79b6/src/eval.c vim-small-patches.b719d5d95852/src/eval.c *** vim-small-patches.c25ccecf79b6/src/eval.c 2013-11-09 15:07:13.588118812 +0400 --- vim-small-patches.b719d5d95852/src/eval.c 2013-11-09 15:07:13.609118813 +0400 *************** *** 644,649 **** --- 644,650 ---- #endif static void f_range __ARGS((typval_T *argvars, typval_T *rettv)); static void f_readfile __ARGS((typval_T *argvars, typval_T *rettv)); + static void f_readshell __ARGS((typval_T *argvars, typval_T *rettv)); static void f_reltime __ARGS((typval_T *argvars, typval_T *rettv)); static void f_reltimestr __ARGS((typval_T *argvars, typval_T *rettv)); static void f_remote_expr __ARGS((typval_T *argvars, typval_T *rettv)); *************** *** 831,836 **** --- 832,838 ---- 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)); + static void get_cmd_output_as_rettv __ARGS((typval_T *argvars, typval_T *rettv, int retlist)); #ifdef EBCDIC *************** *** 8082,8087 **** --- 8084,8090 ---- #endif {"range", 1, 3, f_range}, {"readfile", 1, 3, f_readfile}, + {"readshell", 1, 2, f_readshell}, {"reltime", 0, 2, f_reltime}, {"reltimestr", 1, 1, f_reltimestr}, {"remote_expr", 2, 3, f_remote_expr}, *************** *** 15009,15014 **** --- 15012,15028 ---- fclose(fd); } + /* + * "readshell()" function + */ + static void + f_readshell(argvars, rettv) + typval_T *argvars; + typval_T *rettv; + { + get_cmd_output_as_rettv(argvars, rettv, TRUE); + } + #if defined(FEAT_RELTIME) static int list2proftime __ARGS((typval_T *arg, proftime_T *tm)); *************** *** 18160,18172 **** #endif } - /* - * "system()" function - */ static void ! f_system(argvars, rettv) typval_T *argvars; typval_T *rettv; { char_u *res = NULL; char_u *p; --- 18174,18184 ---- #endif } static void ! get_cmd_output_as_rettv(argvars, rettv, retlist) typval_T *argvars; typval_T *rettv; + int retlist; { char_u *res = NULL; char_u *p; *************** *** 18174,18182 **** char_u buf[NUMBUFLEN]; int err = FALSE; FILE *fd; if (check_restricted() || check_secure()) ! goto done; if (argvars[1].v_type != VAR_UNKNOWN) { --- 18186,18195 ---- char_u buf[NUMBUFLEN]; int err = FALSE; FILE *fd; + list_T *list = NULL; if (check_restricted() || check_secure()) ! goto errret; if (argvars[1].v_type != VAR_UNKNOWN) { *************** *** 18187,18200 **** if ((infile = vim_tempname('i')) == NULL) { EMSG(_(e_notmp)); ! goto done; } fd = mch_fopen((char *)infile, WRITEBIN); if (fd == NULL) { EMSG2(_(e_notopen), infile); ! goto done; } if (argvars[1].v_type == VAR_LIST) { --- 18200,18213 ---- if ((infile = vim_tempname('i')) == NULL) { EMSG(_(e_notmp)); ! goto errret; } fd = mch_fopen((char *)infile, WRITEBIN); if (fd == NULL) { EMSG2(_(e_notopen), infile); ! goto errret; } if (argvars[1].v_type == VAR_LIST) { *************** *** 18207,18213 **** if (p == NULL) { fclose(fd); ! goto done; /* type error; errmsg already given */ } if (fwrite(p, STRLEN(p), 1, fd) != 1) err = TRUE; --- 18220,18226 ---- if (p == NULL) { fclose(fd); ! goto errret; /* type error; errmsg already given */ } if (fwrite(p, STRLEN(p), 1, fd) != 1) err = TRUE; *************** *** 18217,18268 **** if (err) { EMSG(_("E677: Error writing temp file")); ! goto done; } } ! res = get_cmd_output(get_tv_string(&argvars[0]), infile, ! SHELL_SILENT | SHELL_COOKED); ! #ifdef USE_CR ! /* translate <CR> into <NL> */ ! if (res != NULL) { ! char_u *s; ! for (s = res; *s; ++s) { ! if (*s == CAR) ! *s = NL; } - } #else # ifdef USE_CRNL ! /* translate <CR><NL> into <NL> */ ! if (res != NULL) ! { ! char_u *s, *d; ! ! d = res; ! for (s = res; *s; ++s) { ! if (s[0] == CAR && s[1] == NL) ! ++s; ! *d++ = *s; } - *d = NUL; - } # endif #endif ! done: if (infile != NULL) { mch_remove(infile); vim_free(infile); } rettv->v_type = VAR_STRING; ! rettv->vval.v_string = res; } /* --- 18230,18362 ---- if (err) { EMSG(_("E677: Error writing temp file")); ! goto errret; } } ! if (retlist) ! { ! int len; ! listitem_T *li; ! char_u *s = NULL; ! char_u *start; ! char_u *end; ! char_u *p; ! int i; ! ! res = get_cmd_output(get_tv_string(&argvars[0]), infile, ! SHELL_SILENT | SHELL_COOKED, ! &len); ! ! if (res == NULL) ! goto errret; ! ! list = list_alloc(); ! if (list == NULL) ! goto errret; ! ! for (i = 0 ; i <= len ; ++i) ! { ! start = res + i; ! for (end = start; i < len && *end != NL; ++end) ! ++i; ! s = vim_strnsave(start, (int) (end - start)); ! if (s == NULL) ! goto errret; ! ! for (p = s, end = s + (end - start); p < end; ++p) ! if (*p == NUL) ! *p = NL; ! ! li = listitem_alloc(); ! if (li == NULL) ! { ! vim_free(s); ! goto errret; ! } ! ! li->li_tv.v_type = VAR_STRING; ! li->li_tv.vval.v_string = s; ! ! list_append(list, li); ! } ! ! vim_free(res); ! ! rettv->v_type = VAR_LIST; ! rettv->vval.v_list = list; ! } ! else { ! res = get_cmd_output(get_tv_string(&argvars[0]), infile, ! SHELL_SILENT | SHELL_COOKED, ! NULL); ! #ifdef USE_CR ! /* translate <CR> into <NL> */ ! if (res != NULL) { ! char_u *s; ! ! for (s = res; *s; ++s) ! { ! if (*s == CAR) ! *s = NL; ! } } #else # ifdef USE_CRNL ! /* translate <CR><NL> into <NL> */ ! if (res != NULL) { ! char_u *s, *d; ! ! d = res; ! for (s = res; *s; ++s) ! { ! if (s[0] == CAR && s[1] == NL) ! ++s; ! *d++ = *s; ! } ! *d = NUL; } # endif #endif + rettv->v_type = VAR_STRING; + rettv->vval.v_string = res; + } + + if (infile != NULL) + { + mch_remove(infile); + vim_free(infile); + } + return; ! errret: if (infile != NULL) { mch_remove(infile); vim_free(infile); } + if (res != NULL) + vim_free(res); + if (list != NULL) + list_free(list, TRUE); rettv->v_type = VAR_STRING; ! rettv->vval.v_string = NULL; ! } ! ! /* ! * "system()" function ! */ ! static void ! f_system(argvars, rettv) ! typval_T *argvars; ! typval_T *rettv; ! { ! get_cmd_output_as_rettv(argvars, rettv, FALSE); } /* diff -crN -a vim-small-patches.c25ccecf79b6/src/ex_cmds2.c vim-small-patches.b719d5d95852/src/ex_cmds2.c *** vim-small-patches.c25ccecf79b6/src/ex_cmds2.c 2013-11-09 15:07:13.567118811 +0400 --- vim-small-patches.b719d5d95852/src/ex_cmds2.c 2013-11-09 15:07:13.619118813 +0400 *************** *** 4329,4335 **** /* Find all available locales by running command "locale -a". If this * doesn't work we won't have completion. */ char_u *locale_a = get_cmd_output((char_u *)"locale -a", ! NULL, SHELL_SILENT); if (locale_a == NULL) return NULL; ga_init2(&locales_ga, sizeof(char_u *), 20); --- 4329,4336 ---- /* Find all available locales by running command "locale -a". If this * doesn't work we won't have completion. */ char_u *locale_a = get_cmd_output((char_u *)"locale -a", ! NULL, SHELL_SILENT, ! NULL); if (locale_a == NULL) return NULL; ga_init2(&locales_ga, sizeof(char_u *), 20); diff -crN -a vim-small-patches.c25ccecf79b6/src/misc1.c vim-small-patches.b719d5d95852/src/misc1.c *** vim-small-patches.c25ccecf79b6/src/misc1.c 2013-11-09 15:07:13.555118811 +0400 --- vim-small-patches.b719d5d95852/src/misc1.c 2013-11-09 15:07:13.625118813 +0400 *************** *** 10720,10726 **** else #endif buffer = get_cmd_output(cmd, NULL, ! (flags & EW_SILENT) ? SHELL_SILENT : 0); vim_free(cmd); if (buffer == NULL) return 0; --- 10720,10727 ---- else #endif buffer = get_cmd_output(cmd, NULL, ! (flags & EW_SILENT) ? SHELL_SILENT : 0, ! NULL); vim_free(cmd); if (buffer == NULL) return 0; *************** *** 10823,10832 **** * Returns an allocated string, or NULL for error. */ char_u * ! get_cmd_output(cmd, infile, flags) char_u *cmd; char_u *infile; /* optional input file name */ int flags; /* can be SHELL_SILENT */ { char_u *tempname; char_u *command; --- 10824,10834 ---- * Returns an allocated string, or NULL for error. */ char_u * ! get_cmd_output(cmd, infile, flags, ret_len) char_u *cmd; char_u *infile; /* optional input file name */ int flags; /* can be SHELL_SILENT */ + int *ret_len; { char_u *tempname; char_u *command; *************** *** 10896,10902 **** vim_free(buffer); buffer = NULL; } ! else { /* Change NUL into SOH, otherwise the string is truncated. */ for (i = 0; i < len; ++i) --- 10898,10904 ---- vim_free(buffer); buffer = NULL; } ! else if (ret_len == NULL) { /* Change NUL into SOH, otherwise the string is truncated. */ for (i = 0; i < len; ++i) *************** *** 10905,10910 **** --- 10907,10914 ---- buffer[len] = NUL; /* make sure the buffer is terminated */ } + else + *ret_len = len; done: vim_free(tempname); diff -crN -a vim-small-patches.c25ccecf79b6/src/proto/misc1.pro vim-small-patches.b719d5d95852/src/proto/misc1.pro *** vim-small-patches.c25ccecf79b6/src/proto/misc1.pro 2013-11-09 15:07:13.589118812 +0400 --- vim-small-patches.b719d5d95852/src/proto/misc1.pro 2013-11-09 15:07:13.625118813 +0400 *************** *** 98,104 **** void remove_duplicates __ARGS((garray_T *gap)); int gen_expand_wildcards __ARGS((int num_pat, char_u **pat, int *num_file, char_u ***file, int flags)); void addfile __ARGS((garray_T *gap, char_u *f, int flags)); ! char_u *get_cmd_output __ARGS((char_u *cmd, char_u *infile, int flags)); void FreeWild __ARGS((int count, char_u **files)); int goto_im __ARGS((void)); /* vim: set ft=c : */ --- 98,104 ---- void remove_duplicates __ARGS((garray_T *gap)); int gen_expand_wildcards __ARGS((int num_pat, char_u **pat, int *num_file, char_u ***file, int flags)); void addfile __ARGS((garray_T *gap, char_u *f, int flags)); ! char_u *get_cmd_output __ARGS((char_u *cmd, char_u *infile, int flags, int *ret_len)); void FreeWild __ARGS((int count, char_u **files)); int goto_im __ARGS((void)); /* vim: set ft=c : */