Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/source
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2020-12-10 07:06:16 +0300
committerCampbell Barton <ideasman42@gmail.com>2020-12-10 07:06:16 +0300
commit2814cdbd86389516eeea570ae12f7c2c7338d81b (patch)
tree6e8ec57790ba650c92a2212ebd3189d800e2230e /source
parentaef9243ebb4f3d97d4d9f0eb731250a8c6c1db28 (diff)
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.
Diffstat (limited to 'source')
-rw-r--r--source/blender/blenlib/BLI_string.h1
-rw-r--r--source/blender/blenlib/intern/string.c15
-rw-r--r--source/blender/makesrna/intern/rna_access.c21
3 files changed, 24 insertions, 13 deletions
diff --git a/source/blender/blenlib/BLI_string.h b/source/blender/blenlib/BLI_string.h
index 2d1f8ac9c5e..096e7818013 100644
--- a/source/blender/blenlib/BLI_string.h
+++ b/source/blender/blenlib/BLI_string.h
@@ -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();
diff --git a/source/blender/blenlib/intern/string.c b/source/blender/blenlib/intern/string.c
index c4b51338360..d02241230de 100644
--- a/source/blender/blenlib/intern/string.c
+++ b/source/blender/blenlib/intern/string.c
@@ -399,6 +399,21 @@ size_t BLI_str_unescape(char *__restrict dst, const char *__restrict src, const
}
/**
+ * 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"
*
diff --git a/source/blender/makesrna/intern/rna_access.c b/source/blender/makesrna/intern/rna_access.c
index 70b4d4204df..deedf72600a 100644
--- a/source/blender/makesrna/intern/rna_access.c
+++ b/source/blender/makesrna/intern/rna_access.c
@@ -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 != ']') {