aboutsummaryrefslogtreecommitdiffstats
path: root/sway/stringop.c
diff options
context:
space:
mode:
authorLibravatar S. Christoffer Eliesen <christoffer@eliesen.no>2015-11-18 15:03:20 +0100
committerLibravatar S. Christoffer Eliesen <christoffer@eliesen.no>2015-11-24 16:12:37 +0100
commitb7e3d05ace895fce6be87592c9dfee3817436aae (patch)
tree305a2dd488a9b59cf3041daa81ad9890907af7fd /sway/stringop.c
parentMerge pull request #249 from sce/extra_view_metadata (diff)
downloadsway-b7e3d05ace895fce6be87592c9dfee3817436aae.tar.gz
sway-b7e3d05ace895fce6be87592c9dfee3817436aae.tar.zst
sway-b7e3d05ace895fce6be87592c9dfee3817436aae.zip
stringop: Properly handle criteria strings.
A criteria string (e.g. '[class="something" title="something"]') is now correctly treated as a single argument.
Diffstat (limited to 'sway/stringop.c')
-rw-r--r--sway/stringop.c9
1 files changed, 7 insertions, 2 deletions
diff --git a/sway/stringop.c b/sway/stringop.c
index fe5a97ca..efa3a207 100644
--- a/sway/stringop.c
+++ b/sway/stringop.c
@@ -117,6 +117,7 @@ char **split_args(const char *start, int *argc) {
117 bool in_token = false; 117 bool in_token = false;
118 bool in_string = false; 118 bool in_string = false;
119 bool in_char = false; 119 bool in_char = false;
120 bool in_brackets = false; // brackets are used for critera
120 bool escaped = false; 121 bool escaped = false;
121 const char *end = start; 122 const char *end = start;
122 if (start) { 123 if (start) {
@@ -129,10 +130,14 @@ char **split_args(const char *start, int *argc) {
129 in_string = !in_string; 130 in_string = !in_string;
130 } else if (*end == '\'' && !in_string && !escaped) { 131 } else if (*end == '\'' && !in_string && !escaped) {
131 in_char = !in_char; 132 in_char = !in_char;
133 } else if (*end == '[' && !in_string && !in_char && !in_brackets && !escaped) {
134 in_brackets = true;
135 } else if (*end == ']' && !in_string && !in_char && in_brackets && !escaped) {
136 in_brackets = false;
132 } else if (*end == '\\') { 137 } else if (*end == '\\') {
133 escaped = !escaped; 138 escaped = !escaped;
134 } else if (*end == '\0' || (!in_string && !in_char && !escaped 139 } else if (*end == '\0' || (!in_string && !in_char && !in_brackets
135 && strchr(whitespace, *end))) { 140 && !escaped && strchr(whitespace, *end))) {
136 goto add_token; 141 goto add_token;
137 } 142 }
138 if (*end != '\\') { 143 if (*end != '\\') {