Program Listing for File client_command_split.c¶
↰ Return to documentation for file (server/client/client_command_split.c)
#include <string.h>
#include "event.h"
static
bool eat_quoted_argument(
char **buffp, char *argv[static COMMAND_WORD_COUNT], size_t i
)
{
size_t next;
char *buff = *buffp;
buff++;
argv[i - 1]++;
next = strcspn(buff, "\"");
if (buff[next] != '\"')
return false;
buff += next;
*buff = ' ';
*buffp = buff;
return true;
}
bool command_split(char *buff, char *argv[static COMMAND_WORD_COUNT],
size_t command_len)
{
size_t next;
size_t i = 1;
char *ptr = buff;
for (; *buff == ' '; buff++);
argv[0] = buff;
for (; i < COMMAND_WORD_COUNT - 1; i++) {
if (*buff == '"' && !eat_quoted_argument(&buff, argv, i))
return false;
next = strcspn(buff, " ");
buff += next;
*buff = '\0';
if ((size_t)(buff - ptr) == command_len)
return true;
for (buff++; *buff == ' '; buff++);
if (*buff == '\0' || *buff == '\n')
return true;
argv[i] = buff;
}
return false;
}