Мне было очень лениво делать это элегантным способом, поэтому я просто сделал это ленивым способом.Вот самая уродливая функция, которая работает:
char* foo (char* str)
{
static char* p;
int subcontainer = 0;
int escBackslash = 0;
int i = 0;
if(p == NULL)
{
p = str;
if(*p == '\\')
escBackslash = 1;
}
char* offset = NULL;
for(offset = p; *p != '\0'; p++)
{
if(*p == '\\')
{
escBackslash = 1;
i = 1;
continue;
}
if(*p == '"' && escBackslash == 0)
{
if(subcontainer < 1)
{
subcontainer = 1;
offset++;
} else subcontainer = -1;
}
if(isspace(*p) && subcontainer < 1)
{
if(i) *(p - 3) = '"';
if(i) *(p - 2) = '\0';
*(p-(-subcontainer)) = '\0';
p++;
return offset + i;
}
if(*(p+1) == '\0')
{
if(i) *(p - 2) = '"';
if(i) *(p - 1) = '\0';
if(subcontainer == -1) *p = '\0';
p++;
return offset + i;
}
escBackslash = 0;
}
return NULL;
}
Тестирование ..
int main()
{
char* str = strdup("\"\\\"test\\\"\" + \"Command 2\" \"Command2\" function \"\\\"nice\\\"\"");
printf("[%s]\n", str);
char* str1 = foo(str);
while(str1 != NULL)
{
printf("str[%s]\n", str1);
str1 = foo(NULL);
}
free(str);
return 0;
}