[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