BLI_string: extract quote utility into BLI_str_escape_find_quote

Duplicate logic for this exists in BLI_str_quoted_substrN,
which doesn't properly support escaping.
This commit is contained in:
Campbell Barton 2020-12-10 15:06:16 +11:00
parent aef9243ebb
commit 2814cdbd86
3 changed files with 24 additions and 13 deletions

View File

@ -89,6 +89,7 @@ size_t BLI_str_escape(char *__restrict dst, const char *__restrict src, const si
ATTR_NONNULL();
size_t BLI_str_unescape(char *__restrict dst, const char *__restrict src, const size_t src_maxncpy)
ATTR_NONNULL();
const char *BLI_str_escape_find_quote(const char *str) ATTR_NONNULL();
size_t BLI_str_format_int_grouped(char dst[16], int num) ATTR_NONNULL();
size_t BLI_str_format_uint64_grouped(char dst[16], uint64_t num) ATTR_NONNULL();

View File

@ -398,6 +398,21 @@ size_t BLI_str_unescape(char *__restrict dst, const char *__restrict src, const
return len;
}
/**
* Find the first un-escaped quote in the string (to find the end of the string).
*/
const char *BLI_str_escape_find_quote(const char *str)
{
bool escape = false;
while (*str && (*str != '"' || escape)) {
/* A pair of back-slashes represents a single back-slash,
* only use a single back-slash for escaping. */
escape = (escape == false) && (*str == '\\');
str++;
}
return (*str == '"') ? str : NULL;
}
/**
* Makes a copy of the text within the "" that appear after some text 'blahblah'
* i.e. for string 'pose["apples"]' with prefix 'pose[', it should grab "apples"

View File

@ -4978,21 +4978,16 @@ static char *rna_path_token(const char **path, char *fixedbuf, int fixedlen, int
}
}
else {
bool escape = false;
/* Skip the first quote. */
len++;
p++;
while (*p && (*p != '"' || escape)) {
/* A pair of back-slashes represents a single back-slash,
* only use a single back-slash for escaping. */
escape = (escape == false) && (*p == '\\');
len++;
p++;
const char *p_end = BLI_str_escape_find_quote(p + 1);
if (p_end == NULL) {
/* No Matching quote. */
return NULL;
}
/* Skip the last quoted char to get the `]`. */
len++;
p++;
p_end += 1;
len += (p_end - p);
p = p_end;
}
if (*p != ']') {