aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/os/shell.c36
-rw-r--r--src/os/shell.h1
-rw-r--r--src/os_unix.c21
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 *)));