59 lines
822 B
C
59 lines
822 B
C
|
|
||
|
|
||
|
/*
|
||
|
* splitline is a destructive argument parser, much like a very primitive
|
||
|
* form of a shell parser. it supports quotes for embedded spaces and
|
||
|
* literal quotes with the backslash escape.
|
||
|
*/
|
||
|
|
||
|
char *splitnext(char **pos)
|
||
|
{
|
||
|
char *a, *d, *s;
|
||
|
|
||
|
d = s = *pos;
|
||
|
while (*s == ' ' || *s == '\t') s++;
|
||
|
a = s;
|
||
|
while (*s && *s != ' ' && *s != '\t')
|
||
|
{
|
||
|
if (*s == '"')
|
||
|
{
|
||
|
s++;
|
||
|
while (*s && *s != '"')
|
||
|
{
|
||
|
if (*s == '\\')
|
||
|
s++;
|
||
|
if (*s)
|
||
|
*(d++) = *(s++);
|
||
|
}
|
||
|
if (*s == '"') s++;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
if (*s == '\\')
|
||
|
s++;
|
||
|
*(d++) = *(s++);
|
||
|
}
|
||
|
}
|
||
|
while (*s == ' ' || *s == '\t') s++;
|
||
|
*d = 0;
|
||
|
*pos = s;
|
||
|
return a;
|
||
|
}
|
||
|
|
||
|
int splitline(char **argv, int max, char *line)
|
||
|
{
|
||
|
char *s;
|
||
|
int i;
|
||
|
|
||
|
s = line;
|
||
|
for (i = 0; *s && i < max + 1; i++)
|
||
|
argv[i] = splitnext(&s);
|
||
|
argv[i] = 0;
|
||
|
return i;
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|