diff options
-rw-r--r-- | src/os/shell.c | 23 | ||||
-rw-r--r-- | src/os/shell.h | 11 | ||||
-rw-r--r-- | src/os_unix.c | 19 |
3 files changed, 37 insertions, 16 deletions
diff --git a/src/os/shell.c b/src/os/shell.c new file mode 100644 index 0000000000..b2248541b9 --- /dev/null +++ b/src/os/shell.c @@ -0,0 +1,23 @@ +#include <stdbool.h> + +#include "os/shell.h" +#include "types.h" +#include "ascii.h" + + +void shell_skip_word(char_u **ptr) +{ + char_u *p = *ptr; + bool inquote = false; + + // Move `p` to the end of shell word by advancing the pointer it while it's + // inside a quote or it's a non-whitespace character + while (*p && (inquote || (*p != ' ' && *p != TAB))) { + if (*p == '"') + // Found a quote character, switch the `inquote` flag + inquote = !inquote; + ++p; + } + + *ptr = p; +} diff --git a/src/os/shell.h b/src/os/shell.h new file mode 100644 index 0000000000..166dd26846 --- /dev/null +++ b/src/os/shell.h @@ -0,0 +1,11 @@ +#ifndef NEOVIM_OS_SHELL_H +#define NEOVIM_OS_SHELL_H + +#include <stdbool.h> + +#include "types.h" + +void shell_skip_word(char_u **ptr); + +#endif // NEOVIM_OS_SHELL_H + diff --git a/src/os_unix.c b/src/os_unix.c index b8d42b5b42..7324f1318b 100644 --- a/src/os_unix.c +++ b/src/os_unix.c @@ -53,6 +53,7 @@ #include "os/time.h" #include "os/event.h" #include "os/input.h" +#include "os/shell.h" #include "os_unixx.h" /* unix includes for os_unix.c only */ @@ -1705,7 +1706,6 @@ int options; /* SHELL_*, see vim.h */ char_u *p_shcf_copy = NULL; int i; char_u *p; - int inquote; int pty_master_fd = -1; /* for pty's */ int fd_toshell[2]; /* for pipes */ int fd_fromshell[2]; @@ -1723,18 +1723,10 @@ int options; /* SHELL_*, see vim.h */ // Count the number of arguments for the shell p = newcmd; - inquote = FALSE; argc = 0; while (true) { ++argc; - // Move `p` to the end of shell word by advancing the pointer it while it's - // inside a quote or it's a non-whitespace character - while (*p && (inquote || (*p != ' ' && *p != TAB))) { - if (*p == '"') - // Found a quote character, switch the `inquote` flag - inquote = !inquote; - ++p; - } + shell_skip_word(&p); if (*p == NUL) break; // Move to the next word @@ -1759,16 +1751,11 @@ int options; /* SHELL_*, see vim.h */ // Build argv[] p = newcmd; - inquote = FALSE; argc = 0; while (true) { argv[argc] = (char *)p; ++argc; - while (*p && (inquote || (*p != ' ' && *p != TAB))) { - if (*p == '"') - inquote = !inquote; - ++p; - } + shell_skip_word(&p); if (*p == NUL) break; // Terminate the word |