Allow escaping backslashes

Fixes #1577.
This commit is contained in:
shdown 2015-03-25 21:30:38 +03:00
parent e8704bb33b
commit 6d8891894e
2 changed files with 9 additions and 8 deletions

View File

@ -489,7 +489,7 @@ void handle_button(xcb_button_press_event_t *event) {
size_t namelen = 0; size_t namelen = 0;
const char *utf8_name = cur_ws->canonical_name; const char *utf8_name = cur_ws->canonical_name;
for (const char *walk = utf8_name; *walk != '\0'; walk++) { for (const char *walk = utf8_name; *walk != '\0'; walk++) {
if (*walk == '"') if (*walk == '"' || *walk == '\\')
num_quotes++; num_quotes++;
/* While were looping through the name anyway, we can save one /* While were looping through the name anyway, we can save one
* strlen(). */ * strlen(). */
@ -503,7 +503,7 @@ void handle_button(xcb_button_press_event_t *event) {
for (inpos = 0, outpos = strlen("workspace \""); for (inpos = 0, outpos = strlen("workspace \"");
inpos < namelen; inpos < namelen;
inpos++, outpos++) { inpos++, outpos++) {
if (utf8_name[inpos] == '"') { if (utf8_name[inpos] == '"' || utf8_name[inpos] == '\\') {
buffer[outpos] = '\\'; buffer[outpos] = '\\';
outpos++; outpos++;
} }

View File

@ -216,8 +216,9 @@ char *parse_string(const char **walk, bool as_word) {
if (**walk == '"') { if (**walk == '"') {
beginning++; beginning++;
(*walk)++; (*walk)++;
while (**walk != '\0' && (**walk != '"' || *(*walk - 1) == '\\')) for (; **walk != '\0' && **walk != '"'; (*walk)++)
(*walk)++; if (**walk == '\\' && *(*walk + 1) != '\0')
(*walk)++;
} else { } else {
if (!as_word) { if (!as_word) {
/* For a string (starting with 's'), the delimiters are /* For a string (starting with 's'), the delimiters are
@ -248,10 +249,10 @@ char *parse_string(const char **walk, bool as_word) {
for (inpos = 0, outpos = 0; for (inpos = 0, outpos = 0;
inpos < (*walk - beginning); inpos < (*walk - beginning);
inpos++, outpos++) { inpos++, outpos++) {
/* We only handle escaped double quotes to not break /* We only handle escaped double quotes and backslashes to not break
* backwards compatibility with people using \w in * backwards compatibility with people using \w in regular expressions
* regular expressions etc. */ * etc. */
if (beginning[inpos] == '\\' && beginning[inpos + 1] == '"') if (beginning[inpos] == '\\' && (beginning[inpos + 1] == '"' || beginning[inpos + 1] == '\\'))
inpos++; inpos++;
str[outpos] = beginning[inpos]; str[outpos] = beginning[inpos];
} }