BLI_strescape for a basic, python like string escaping, currently only use for drag...
authorCampbell Barton <ideasman42@gmail.com>
Tue, 23 Aug 2011 15:08:54 +0000 (15:08 +0000)
committerCampbell Barton <ideasman42@gmail.com>
Tue, 23 Aug 2011 15:08:54 +0000 (15:08 +0000)
source/blender/blenlib/BLI_string.h
source/blender/blenlib/intern/string.c
source/blender/editors/space_console/space_console.c

index 408809661cfbaa91a38d1449f0ebee63f3a3d602..4a0c2ab9482850dd77691b329627d9232a002814 100644 (file)
@@ -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.
         * 
index 8e0314ec17f52f6be388cef87f7bdecd0fa0746f..2f1ddf294ce30abe2197f41e5ffa3ee0e142edf9 100644 (file)
@@ -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"
  * 
index 890a6cf545ae4941d185b9a1d1e339699ce62337..52c5100900db0eb599d36dd138f46dc6dd86cf16 100644 (file)
@@ -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);