aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLibravatar lbonn <bonnans.l@gmail.com>2017-10-08 01:05:40 +0200
committerLibravatar lbonn <bonnans.l@gmail.com>2017-10-08 11:54:46 +0200
commit514eed7e4b256565d85c63014500d1252fec2928 (patch)
tree88c0cdfc09ac13100c8425ef72258cca71b64a91
parentcommands: implement 3 missing criteria from i3 (diff)
downloadsway-514eed7e4b256565d85c63014500d1252fec2928.tar.gz
sway-514eed7e4b256565d85c63014500d1252fec2928.tar.zst
sway-514eed7e4b256565d85c63014500d1252fec2928.zip
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
-rw-r--r--sway/criteria.c33
1 files changed, 26 insertions, 7 deletions
diff --git a/sway/criteria.c b/sway/criteria.c
index 9a04b48e..f5fe40cb 100644
--- a/sway/criteria.c
+++ b/sway/criteria.c
@@ -114,6 +114,7 @@ static char *crit_tokens(int *argc, char ***buf, const char * const criteria_str
114 114
115 char **argv = *buf = calloc(max_tokens, sizeof(char*)); 115 char **argv = *buf = calloc(max_tokens, sizeof(char*));
116 argv[0] = base; // this needs to be freed by caller 116 argv[0] = base; // this needs to be freed by caller
117 bool quoted = true;
117 118
118 *argc = 1; // uneven = name, even = value 119 *argc = 1; // uneven = name, even = value
119 while (*head && *argc < max_tokens) { 120 while (*head && *argc < max_tokens) {
@@ -134,7 +135,8 @@ static char *crit_tokens(int *argc, char ***buf, const char * const criteria_str
134 if (*(namep) == ' ') { 135 if (*(namep) == ' ') {
135 namep = strrchr(namep, ' ') + 1; 136 namep = strrchr(namep, ' ') + 1;
136 } 137 }
137 argv[(*argc)++] = namep; 138 argv[*argc] = namep;
139 *argc += 1;
138 } 140 }
139 } else if (*head == '"') { 141 } else if (*head == '"') {
140 if (*argc % 2 != 0) { 142 if (*argc % 2 != 0) {
@@ -143,21 +145,38 @@ static char *crit_tokens(int *argc, char ***buf, const char * const criteria_str
143 "Found quoted value where it was not expected"); 145 "Found quoted value where it was not expected");
144 } else if (!valp) { // value starts here 146 } else if (!valp) { // value starts here
145 valp = head + 1; 147 valp = head + 1;
148 quoted = true;
146 } else { 149 } else {
147 // value ends here 150 // value ends here
148 argv[(*argc)++] = valp; 151 argv[*argc] = valp;
152 *argc += 1;
149 *head = '\0'; 153 *head = '\0';
150 valp = NULL; 154 valp = NULL;
151 namep = head + 1; 155 namep = head + 1;
152 } 156 }
153 } else if (*argc % 2 == 0 && !valp && *head != ' ') { 157 } else if (*argc % 2 == 0 && *head != ' ') {
154 // We're expecting a quoted value, haven't found one yet, and this 158 // parse unquoted values
155 // is not an empty space. 159 if (!valp) {
156 return strdup("Unable to parse criteria: " 160 quoted = false;
157 "Names must be unquoted, values must be quoted"); 161 valp = head; // value starts here
162 }
163 } else if (valp && !quoted && *head == ' ') {
164 // value ends here
165 argv[*argc] = valp;
166 *argc += 1;
167 *head = '\0';
168 valp = NULL;
169 namep = head + 1;
158 } 170 }
159 head++; 171 head++;
160 } 172 }
173
174 // catch last unquoted value if needed
175 if (valp && !quoted && !*head) {
176 argv[*argc] = valp;
177 *argc += 1;
178 }
179
161 return NULL; 180 return NULL;
162} 181}
163 182