diff options
| -rw-r--r-- | src/os/shell.c | 36 | ||||
| -rw-r--r-- | src/os/shell.h | 1 | ||||
| -rw-r--r-- | src/os_unix.c | 21 | 
3 files changed, 36 insertions, 22 deletions
| diff --git a/src/os/shell.c b/src/os/shell.c index b2248541b9..51e6d65b5b 100644 --- a/src/os/shell.c +++ b/src/os/shell.c @@ -2,12 +2,14 @@  #include "os/shell.h"  #include "types.h" +#include "vim.h"  #include "ascii.h" +#include "charset.h" -void shell_skip_word(char_u **ptr) +void shell_skip_word(char_u **cmd)  { -  char_u *p = *ptr; +  char_u *p = *cmd;    bool inquote = false;    // Move `p` to the end of shell word by advancing the pointer it while it's @@ -19,5 +21,35 @@ void shell_skip_word(char_u **ptr)      ++p;    } +  *cmd = p; +} + +int shell_count_argc(char_u **ptr) +{ +  int rv = 0; +  char_u *p = *ptr; + +  while (true) { +    rv++; +    shell_skip_word(&p); +    if (*p == NUL) +      break; +    // Move to the next word +    p = skipwhite(p); +  } + +  // Account for multiple args in p_shcf('shellcmdflag' option) +  p = p_shcf; +  while (true) { +    // Same as above, but doesn't need to take quotes into consideration +    p = skiptowhite(p); +    if (*p == NUL) +      break; +    rv++; +    p = skipwhite(p); +  } +    *ptr = p; + +  return rv;  } diff --git a/src/os/shell.h b/src/os/shell.h index 166dd26846..754f27df37 100644 --- a/src/os/shell.h +++ b/src/os/shell.h @@ -6,6 +6,7 @@  #include "types.h"  void shell_skip_word(char_u **ptr); +int shell_count_argc(char_u **ptr);  #endif  // NEOVIM_OS_SHELL_H diff --git a/src/os_unix.c b/src/os_unix.c index 7324f1318b..7a3124130f 100644 --- a/src/os_unix.c +++ b/src/os_unix.c @@ -1723,26 +1723,7 @@ int options;                    /* SHELL_*, see vim.h */    // Count the number of arguments for the shell    p = newcmd; -  argc = 0; -  while (true) { -    ++argc; -    shell_skip_word(&p); -    if (*p == NUL) -      break; -    // Move to the next word -    p = skipwhite(p); -  } - -  // Account for multiple args in p_shcf('shellcmdflag' option) -  p = p_shcf; -  while (true) { -    // Same as above, but doesn't need to take quotes into consideration -    p = skiptowhite(p); -    if (*p == NUL) -      break; -    ++argc; -    p = skipwhite(p); -  } +  argc = shell_count_argc(&p);    // Allocate argv memory    argv = (char **)alloc((unsigned)((argc + 4) * sizeof(char *))); | 
