diff options
author | lbonn <bonnans.l@gmail.com> | 2017-10-08 01:05:40 +0200 |
---|---|---|
committer | lbonn <bonnans.l@gmail.com> | 2017-10-08 11:54:46 +0200 |
commit | 514eed7e4b256565d85c63014500d1252fec2928 (patch) | |
tree | 88c0cdfc09ac13100c8425ef72258cca71b64a91 | |
parent | commands: implement 3 missing criteria from i3 (diff) | |
download | sway-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.c | 33 |
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 | ||