diff options
author | Campbell Barton <ideasman42@gmail.com> | 2011-08-23 19:08:54 +0400 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2011-08-23 19:08:54 +0400 |
commit | f6a2b8d724646ac357a0eafc2d29b345fdc1ba5f (patch) | |
tree | 2ef09a290f55ab9cd4ed642c3c050525b9d08292 /source | |
parent | abff0032c4dceabbd2cf5b9682f196dd4a283c76 (diff) |
BLI_strescape for a basic, python like string escaping, currently only use for drag and drop ID's into the console but should eventually be used for the animsys too.
Diffstat (limited to 'source')
-rw-r--r-- | source/blender/blenlib/BLI_string.h | 2 | ||||
-rw-r--r-- | source/blender/blenlib/intern/string.c | 43 | ||||
-rw-r--r-- | source/blender/editors/space_console/space_console.c | 5 |
3 files changed, 49 insertions, 1 deletions
diff --git a/source/blender/blenlib/BLI_string.h b/source/blender/blenlib/BLI_string.h index 408809661cf..4a0c2ab9482 100644 --- a/source/blender/blenlib/BLI_string.h +++ b/source/blender/blenlib/BLI_string.h @@ -122,6 +122,8 @@ __attribute__ ((format (printf, 1, 2))) #endif ; +size_t BLI_strescape(char *dst, const char *src, const size_t maxlen); + /** * Compare two strings without regard to case. * diff --git a/source/blender/blenlib/intern/string.c b/source/blender/blenlib/intern/string.c index 8e0314ec17f..2f1ddf294ce 100644 --- a/source/blender/blenlib/intern/string.c +++ b/source/blender/blenlib/intern/string.c @@ -117,6 +117,49 @@ char *BLI_sprintfN(const char *format, ...) return n; } + +/* match pythons string escaping, assume double quotes - (") + * TODO: should be used to create RNA animation paths. + * TODO: support more fancy string escaping. current code is primitive + * this basically is an ascii version of PyUnicode_EncodeUnicodeEscape() + * which is a useful reference. */ +size_t BLI_strescape(char *dst, const char *src, const size_t maxlen) +{ + size_t len= 0; + while(len < maxlen) { + switch(*src) { + case '\0': + *dst= '\0'; + break; + case '\\': + case '"': + + /* less common but should also be support */ + case '\t': + case '\n': + case '\r': + if(len + 1 < maxlen) { + *dst++ = '\\'; + len++; + } + else { + /* not enough space to escape */ + *dst= '\0'; + break; + } + /* intentionally pass through */ + default: + *dst = *src; + } + dst++; + src++; + len++; + } + + return len; +} + + /* 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/editors/space_console/space_console.c b/source/blender/editors/space_console/space_console.c index 890a6cf545a..52c5100900d 100644 --- a/source/blender/editors/space_console/space_console.c +++ b/source/blender/editors/space_console/space_console.c @@ -165,8 +165,11 @@ static void id_drop_copy(wmDrag *drag, wmDropBox *drop) { char text[64]; ID *id= drag->poin; + char id_esc[(sizeof(id->name) - 2) * 2]; - snprintf(text, sizeof(text), "bpy.data.%s['%s']", BKE_idcode_to_name_plural(GS(id->name)), id->name+2); + BLI_strescape(id_esc, id->name+2, sizeof(id_esc)); + + snprintf(text, sizeof(text), "bpy.data.%s[\"%s\"]", BKE_idcode_to_name_plural(GS(id->name)), id_esc); /* copy drag path to properties */ RNA_string_set(drop->ptr, "text", text); |