[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [17407] branches/blender2.5/blender/source /blender:
Brecht Van Lommel
brecht at blender.org
Tue Nov 11 16:03:26 CET 2008
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;
More information about the Bf-blender-cvs
mailing list