mirror of
https://github.com/AuxXxilium/eudev.git
synced 2024-12-24 10:52:50 +07:00
util: properly handle escaped quotes in words in split_quoted()
This commit is contained in:
parent
f3d4cc0148
commit
0bab36f250
48
src/util.c
48
src/util.c
@ -360,7 +360,8 @@ char *split(const char *c, size_t *l, const char *separator, char **state) {
|
||||
/* Split a string into words, but consider strings enclosed in '' and
|
||||
* "" as words even if they include spaces. */
|
||||
char *split_quoted(const char *c, size_t *l, char **state) {
|
||||
char *current;
|
||||
char *current, *e;
|
||||
bool escaped = false;
|
||||
|
||||
current = *state ? *state : (char*) c;
|
||||
|
||||
@ -371,26 +372,45 @@ char *split_quoted(const char *c, size_t *l, char **state) {
|
||||
|
||||
if (*current == '\'') {
|
||||
current ++;
|
||||
*l = strcspn(current, "'");
|
||||
*state = current+*l;
|
||||
|
||||
if (**state == '\'')
|
||||
(*state)++;
|
||||
for (e = current; *e; e++) {
|
||||
if (escaped)
|
||||
escaped = false;
|
||||
else if (*e == '\\')
|
||||
escaped = true;
|
||||
else if (*e == '\'')
|
||||
break;
|
||||
}
|
||||
|
||||
*l = e-current;
|
||||
*state = *e == 0 ? e : e+1;
|
||||
} else if (*current == '\"') {
|
||||
current ++;
|
||||
*l = strcspn(current, "\"");
|
||||
*state = current+*l;
|
||||
|
||||
if (**state == '\"')
|
||||
(*state)++;
|
||||
for (e = current; *e; e++) {
|
||||
if (escaped)
|
||||
escaped = false;
|
||||
else if (*e == '\\')
|
||||
escaped = true;
|
||||
else if (*e == '\"')
|
||||
break;
|
||||
}
|
||||
|
||||
*l = e-current;
|
||||
*state = *e == 0 ? e : e+1;
|
||||
} else {
|
||||
*l = strcspn(current, WHITESPACE);
|
||||
*state = current+*l;
|
||||
for (e = current; *e; e++) {
|
||||
if (escaped)
|
||||
escaped = false;
|
||||
else if (*e == '\\')
|
||||
escaped = true;
|
||||
else if (strchr(WHITESPACE, *e))
|
||||
break;
|
||||
}
|
||||
*l = e-current;
|
||||
*state = e;
|
||||
}
|
||||
|
||||
/* FIXME: Cannot deal with strings that have spaces AND ticks
|
||||
* in them */
|
||||
|
||||
return (char*) current;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user