mirror of
https://github.com/swaywm/sway
synced 2024-11-18 04:33:59 +01:00
commands: allow criterion values to be unquoted
Sometimes it doesn't really make sense to quote them (numeric values for example) In that case, the value is parsed until the next space or the end of the whole criteria expression
This commit is contained in:
parent
d879e5b15d
commit
514eed7e4b
@ -114,6 +114,7 @@ static char *crit_tokens(int *argc, char ***buf, const char * const criteria_str
|
||||
|
||||
char **argv = *buf = calloc(max_tokens, sizeof(char*));
|
||||
argv[0] = base; // this needs to be freed by caller
|
||||
bool quoted = true;
|
||||
|
||||
*argc = 1; // uneven = name, even = value
|
||||
while (*head && *argc < max_tokens) {
|
||||
@ -134,7 +135,8 @@ static char *crit_tokens(int *argc, char ***buf, const char * const criteria_str
|
||||
if (*(namep) == ' ') {
|
||||
namep = strrchr(namep, ' ') + 1;
|
||||
}
|
||||
argv[(*argc)++] = namep;
|
||||
argv[*argc] = namep;
|
||||
*argc += 1;
|
||||
}
|
||||
} else if (*head == '"') {
|
||||
if (*argc % 2 != 0) {
|
||||
@ -143,21 +145,38 @@ static char *crit_tokens(int *argc, char ***buf, const char * const criteria_str
|
||||
"Found quoted value where it was not expected");
|
||||
} else if (!valp) { // value starts here
|
||||
valp = head + 1;
|
||||
quoted = true;
|
||||
} else {
|
||||
// value ends here
|
||||
argv[(*argc)++] = valp;
|
||||
argv[*argc] = valp;
|
||||
*argc += 1;
|
||||
*head = '\0';
|
||||
valp = NULL;
|
||||
namep = head + 1;
|
||||
}
|
||||
} else if (*argc % 2 == 0 && !valp && *head != ' ') {
|
||||
// We're expecting a quoted value, haven't found one yet, and this
|
||||
// is not an empty space.
|
||||
return strdup("Unable to parse criteria: "
|
||||
"Names must be unquoted, values must be quoted");
|
||||
} else if (*argc % 2 == 0 && *head != ' ') {
|
||||
// parse unquoted values
|
||||
if (!valp) {
|
||||
quoted = false;
|
||||
valp = head; // value starts here
|
||||
}
|
||||
} else if (valp && !quoted && *head == ' ') {
|
||||
// value ends here
|
||||
argv[*argc] = valp;
|
||||
*argc += 1;
|
||||
*head = '\0';
|
||||
valp = NULL;
|
||||
namep = head + 1;
|
||||
}
|
||||
head++;
|
||||
}
|
||||
|
||||
// catch last unquoted value if needed
|
||||
if (valp && !quoted && !*head) {
|
||||
argv[*argc] = valp;
|
||||
*argc += 1;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user