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:
parent
aef9243ebb
commit
2814cdbd86
|
@ -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();
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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 != ']') {
|
||||
|
|
Loading…
Reference in New Issue