diff --git a/sway/stringop.c b/sway/stringop.c index b944a43d3..0f8577aed 100644 --- a/sway/stringop.c +++ b/sway/stringop.c @@ -53,8 +53,9 @@ char *strip_comments(char *str) { list_t *split_string(const char *str, const char *delims) { list_t *res = create_list(); int i, j; - for (i = 0, j = 0; i < strlen(str) + 1; ++i) { - if (strchr(delims, str[i]) || i == strlen(str)) { + int len = strlen(str); + for (i = 0, j = 0; i < len + 1; ++i) { + if (strchr(delims, str[i]) || i == len) { if (i - j == 0) { continue; } @@ -63,7 +64,7 @@ list_t *split_string(const char *str, const char *delims) { left[i - j] = 0; list_add(res, left); j = i + 1; - while (j <= strlen(str) && str[j] && strchr(delims, str[j])) { + while (j <= len && str[j] && strchr(delims, str[j])) { j++; i++; } @@ -111,40 +112,44 @@ int unescape_string(char *string) { for (i = 0; string[i]; ++i) { if (string[i] == '\\') { --len; + int shift = 0; switch (string[++i]) { case '0': string[i - 1] = '\0'; - memmove(string + i, string + i + 1, len - i); + shift = 1; break; case 'a': string[i - 1] = '\a'; - memmove(string + i, string + i + 1, len - i); + shift = 1; break; case 'b': string[i - 1] = '\b'; - memmove(string + i, string + i + 1, len - i); + shift = 1; break; case 't': string[i - 1] = '\t'; - memmove(string + i, string + i + 1, len - i); + shift = 1; break; case 'n': string[i - 1] = '\n'; - memmove(string + i, string + i + 1, len - i); + shift = 1; break; case 'v': string[i - 1] = '\v'; - memmove(string + i, string + i + 1, len - i); + shift = 1; break; case 'f': string[i - 1] = '\f'; - memmove(string + i, string + i + 1, len - i); + shift = 1; break; case 'r': string[i - 1] = '\r'; - memmove(string + i, string + i + 1, len - i); + shift = 1; break; } + if (shift) { + memmove(string + i, string + i + shift, len - i); + } } } return len;