Revision: 17407
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=17407
Author:   blendix
Date:     2008-11-11 16:03:26 +0100 (Tue, 11 Nov 2008)

Log Message:
-----------

* RNA: utility function to retrieve strings. It will use a fixed
  size buffer if it's big enough, and otherwise allocate memory.
* Added BLI_dynstr_appendf() to construct strings easily in printf
  style, this should make it easier to construct menu strings for
  example.

Modified Paths:
--------------
    branches/blender2.5/blender/source/blender/blenlib/BLI_dynstr.h
    branches/blender2.5/blender/source/blender/blenlib/intern/BLI_dynstr.c
    branches/blender2.5/blender/source/blender/makesrna/RNA_access.h
    branches/blender2.5/blender/source/blender/makesrna/intern/rna_access.c
    branches/blender2.5/blender/source/blender/makesrna/intern/rna_dependency.c

Modified: branches/blender2.5/blender/source/blender/blenlib/BLI_dynstr.h
===================================================================
--- branches/blender2.5/blender/source/blender/blenlib/BLI_dynstr.h     
2008-11-11 14:14:22 UTC (rev 17406)
+++ branches/blender2.5/blender/source/blender/blenlib/BLI_dynstr.h     
2008-11-11 15:03:26 UTC (rev 17407)
@@ -56,9 +56,17 @@
         * @param ds The DynStr to append to.
         * @param cstr The c-string to append.
         */
-void   BLI_dynstr_append                               (DynStr *ds, char 
*cstr);
+void   BLI_dynstr_append                               (DynStr *ds, const char 
*cstr);
 
        /**
+        * Append a c-string to a DynStr, but with formatting like printf.
+        * 
+        * @param ds The DynStr to append to.
+        * @param format The printf format string to use.
+        */
+void   BLI_dynstr_appendf                              (DynStr *ds, const char 
*format, ...);
+
+       /**
         * Find the length of a DynStr.
         * 
         * @param ds The DynStr of interest.
@@ -69,7 +77,7 @@
        /**
         * Get a DynStr's contents as a c-string.
         * <i> The returned c-string should be free'd
-        * using BLI_freeN. </i>
+        * using MEM_freeN. </i>
         * 
         * @param ds The DynStr of interest.
         * @return The contents of @a ds as a c-string.

Modified: branches/blender2.5/blender/source/blender/blenlib/intern/BLI_dynstr.c
===================================================================
--- branches/blender2.5/blender/source/blender/blenlib/intern/BLI_dynstr.c      
2008-11-11 14:14:22 UTC (rev 17406)
+++ branches/blender2.5/blender/source/blender/blenlib/intern/BLI_dynstr.c      
2008-11-11 15:03:26 UTC (rev 17407)
@@ -28,6 +28,8 @@
  * Dynamically sized string ADT
  */
 
+#include <stdarg.h>
+#include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 
@@ -35,9 +37,11 @@
 #include "BLI_blenlib.h"
 #include "BLI_dynstr.h"
 
-#ifdef HAVE_CONFIG_H
-#include <config.h>
+#ifdef _WIN32
+#ifndef vsnprintf
+#define vsnprintf _vsnprintf
 #endif
+#endif
 
 /***/
 
@@ -63,7 +67,7 @@
        return ds;
 }
 
-void BLI_dynstr_append(DynStr *ds, char *cstr) {
+void BLI_dynstr_append(DynStr *ds, const char *cstr) {
        DynStrElem *dse= malloc(sizeof(*dse));
        int cstrlen= strlen(cstr);
        
@@ -79,6 +83,55 @@
        ds->curlen+= cstrlen;
 }
 
+void BLI_dynstr_appendf(DynStr *ds, const char *format, ...)
+{
+       va_list args;
+       char *message, fixedmessage[256];
+       int len= 256, maxlen= 65536, retval;
+
+       while(1) {
+               if(len == sizeof(fixedmessage))
+                       message= fixedmessage;
+               else
+                       message= MEM_callocN(sizeof(char)*len+1, 
"BLI_dynstr_appendf");
+
+               va_start(args, format);
+               retval= vsnprintf(message, len, format, args);
+               va_end(args);
+
+               if(retval == -1) {
+                       /* -1 means not enough space, but on windows it may 
also mean
+                        * there is a formatting error, so we impose a maximum 
length */
+                       if(message != fixedmessage)
+                               MEM_freeN(message);
+                       message= NULL;
+
+                       len *= 2;
+                       if(len > maxlen) {
+                               fprintf(stderr, "BLI_dynstr_append text too 
long or format error.\n");
+                               break;
+                       }
+               }
+               else if(retval > len) {
+                       /* in C99 the actual length required is returned */
+                       if(message != fixedmessage)
+                               MEM_freeN(message);
+                       message= NULL;
+
+                       len= retval;
+               }
+               else
+                       break;
+       }
+
+       if(message) {
+               BLI_dynstr_append(ds, message);
+
+               if(message != fixedmessage)
+                       MEM_freeN(message);
+       }
+}
+
 int BLI_dynstr_get_len(DynStr *ds) {
        return ds->curlen;
 }

Modified: branches/blender2.5/blender/source/blender/makesrna/RNA_access.h
===================================================================
--- branches/blender2.5/blender/source/blender/makesrna/RNA_access.h    
2008-11-11 14:14:22 UTC (rev 17406)
+++ branches/blender2.5/blender/source/blender/makesrna/RNA_access.h    
2008-11-11 15:03:26 UTC (rev 17407)
@@ -66,6 +66,7 @@
 void RNA_property_float_set_array(struct PropertyRNA *prop, struct PointerRNA 
*ptr, int index, float value);
 
 void RNA_property_string_get(struct PropertyRNA *prop, struct PointerRNA *ptr, 
char *value);
+char *RNA_property_string_get_alloc(struct PropertyRNA *prop, struct 
PointerRNA *ptr, char *fixedbuf, int fixedlen);
 int RNA_property_string_length(struct PropertyRNA *prop, struct PointerRNA 
*ptr);
 void RNA_property_string_set(struct PropertyRNA *prop, struct PointerRNA *ptr, 
const char *value);
 

Modified: 
branches/blender2.5/blender/source/blender/makesrna/intern/rna_access.c
===================================================================
--- branches/blender2.5/blender/source/blender/makesrna/intern/rna_access.c     
2008-11-11 14:14:22 UTC (rev 17406)
+++ branches/blender2.5/blender/source/blender/makesrna/intern/rna_access.c     
2008-11-11 15:03:26 UTC (rev 17407)
@@ -166,6 +166,23 @@
        sprop->get(ptr, value);
 }
 
+char *RNA_property_string_get_alloc(PropertyRNA *prop, PointerRNA *ptr, char 
*fixedbuf, int fixedlen)
+{
+       char *buf;
+       int length;
+
+       length= RNA_property_string_length(prop, ptr);
+
+       if(length+1 < fixedlen)
+               buf= fixedbuf;
+       else
+               buf= MEM_callocN(sizeof(char)*(length+1), 
"RNA_string_get_alloc");
+
+       RNA_property_string_get(prop, ptr, buf);
+
+       return buf;
+}
+
 int RNA_property_string_length(PropertyRNA *prop, PointerRNA *ptr)
 {
        StringPropertyRNA *sprop= (StringPropertyRNA*)prop;

Modified: 
branches/blender2.5/blender/source/blender/makesrna/intern/rna_dependency.c
===================================================================
--- branches/blender2.5/blender/source/blender/makesrna/intern/rna_dependency.c 
2008-11-11 14:14:22 UTC (rev 17406)
+++ branches/blender2.5/blender/source/blender/makesrna/intern/rna_dependency.c 
2008-11-11 15:03:26 UTC (rev 17407)
@@ -1,14 +1,13 @@
 
 #include <stdio.h>
 #include <stdlib.h>
+#include <string.h>
 
 #include "DNA_scene_types.h"
 
 #include "RNA_access.h"
 #include "RNA_types.h"
 
-#include "BKE_main.h"
-
 typedef struct RNAGenDeps {
        void *udata;
        PropDependencyCallback cb;


_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to