10typedef const char **(*cmdline_insert_fn_t)(
const char **result,
size_t result_capacity,
char *cmdline,
size_t *result_count);
14 if (*result_count == result_capacity)
17 result[*result_count] = cmdline;
25 argv = (
const char **) krealloc(argv,
sizeof(
char *) * (*result_count + 1));
26 argv[*result_count] =
strdup(cmdline);
33 char *buf_start = start;
45 } quote_type = Q_NONE;
47 for (
char *c = start; c != &buf_start[length + 1]; c++)
61 if (*c ==
'\'' && quote_type != Q_DOUBLE)
63 quote_type = quote_type == Q_SINGLE ? Q_NONE : Q_SINGLE;
67 if (*c ==
'"' && quote_type != Q_SINGLE)
69 quote_type = quote_type == Q_DOUBLE ? Q_NONE : Q_DOUBLE;
73 if (*c ==
' ' && quote_type == Q_NONE)
76 if (*c ==
'\0' && quote_type != Q_NONE)
83 *argv_ptr = inserter(*argv_ptr, cmdline_max, start, out_count);
95bool cmdline_parse_inplace(
char *inbuf,
size_t length,
size_t cmdline_max,
size_t *out_count,
const char **out_cmdlines)
100const char **
cmdline_parse(
char *inbuf,
size_t length,
const char **outargv,
size_t *out_count)
115 for (
size_t i = 0; i < count; i++)
128 if (quote !=
'\'' && quote !=
'"')
131 if (str[len - 1] != quote)
134 for (
size_t i = 1; i < len - 1; i++)
138 if (str[i + 1] == quote)
140 memmove(&str[i], &str[i + 1], len - i);
143 else if (str[i + 1] ==
'\\')
145 memmove(&str[i], &str[i + 1], len - i);
152 memmove(str, &str[1], len - 1);
auto push_back(const TItem &value) noexcept
MOSAPI char * strdup(const char *src)
MOSAPI void * memmove(void *dest, const void *src, size_t n)
const char **(* cmdline_insert_fn_t)(const char **result, size_t result_capacity, char *cmdline, size_t *result_count)
const char ** cmdline_parse(char *inbuf, size_t length, const char **outargv, size_t *out_count)
static bool cmdline_parse_generic(char *start, size_t length, size_t cmdline_max, size_t *out_count, const char ***argv_ptr, cmdline_insert_fn_t inserter)
mos::vector< mos::string > cmdline_parse_vector(char *inbuf, size_t length)
static const char ** cmdline_static_array_insert(const char **result, size_t result_capacity, char *cmdline, size_t *result_count)
bool cmdline_parse_inplace(char *inbuf, size_t length, size_t cmdline_max, size_t *out_count, const char **out_cmdlines)
void string_unquote(char *str)
static const char ** cmdline_dynamic_array_insert(const char **argv, size_t result_capacity, char *cmdline, size_t *result_count)
static size_t strlen(const char *s)