[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [42506] branches/bmesh/blender/source/ blender/bmesh/intern/bmesh_operators.c: give a more useful error message when bmesh operators fail to pass, was also leaking memory in this case.

Campbell Barton ideasman42 at gmail.com
Thu Dec 8 03:08:18 CET 2011


Revision: 42506
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=42506
Author:   campbellbarton
Date:     2011-12-08 02:08:07 +0000 (Thu, 08 Dec 2011)
Log Message:
-----------
give a more useful error message when bmesh operators fail to pass, was also leaking memory in this case.

Modified Paths:
--------------
    branches/bmesh/blender/source/blender/bmesh/intern/bmesh_operators.c

Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_operators.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_operators.c	2011-12-08 00:28:42 UTC (rev 42505)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_operators.c	2011-12-08 02:08:07 UTC (rev 42506)
@@ -1165,13 +1165,19 @@
 int BMO_VInitOpf(BMesh *bm, BMOperator *op, const char *_fmt, va_list vlist)
 {
 	BMOpDefine *def;
-	char *opname, *ofmt, *fmt = (char*)_fmt;
+	char *opname, *ofmt, *fmt;
 	char slotname[64] = {0};
 	int i /*, n=strlen(fmt) */, stop /*, slotcode = -1 */, ret, type, state;
 	int noslot=0;
 
+
+	/* basic useful info to help find where bmop formatting strings fail */
+	int lineno= -1;
+#   define GOTO_ERROR { lineno= __LINE__; goto error; }
+
+
 	/*we muck around in here, so dup it*/
-	fmt = ofmt = BLI_strdup(fmt);
+	fmt = ofmt = BLI_strdup(_fmt);
 	
 	/*find operator name*/
 	i = strcspn(fmt, " \t");
@@ -1209,11 +1215,11 @@
 			  a little flexible, allowing "slot=%f", 
 			  "slot %f", "slot%f", and "slot\t%f". */
 			i = strcspn(fmt, "= \t%");
-			if (!fmt[i]) goto error;
+			if (!fmt[i]) GOTO_ERROR;
 
 			fmt[i] = 0;
 
-			if (bmesh_name_to_slotcode_check(def, fmt) < 0) goto error;
+			if (bmesh_name_to_slotcode_check(def, fmt) < 0) GOTO_ERROR;
 			
 			BLI_strncpy(slotname, fmt, sizeof(slotname));
 			
@@ -1234,7 +1240,7 @@
 
 				if (c == '3') size = 3;
 				else if (c == '4') size = 4;
-				else goto error;
+				else GOTO_ERROR;
 
 				BMO_Set_Mat(op, slotname, va_arg(vlist, void*), size);
 				state = 1;
@@ -1311,7 +1317,9 @@
 				state = 1;
 				break;
 			default:
-				printf("%s: unrecognized bmop format char: %c\n", __func__, *fmt);
+				fprintf(stderr,
+				        "%s: unrecognized bmop format char: %c, %d in '%s'\n",
+				        __func__, *fmt, (int)(fmt-ofmt), ofmt);
 				break;
 			}
 		}
@@ -1321,8 +1329,18 @@
 	MEM_freeN(ofmt);
 	return 1;
 error:
+
+	/* non urgent todo - explain exactly what is failing */
+	fprintf(stderr,
+	        "%s: error parsing formatting string, %d in '%s'\n    see - %s:%d\n",
+	        __func__, (int)(fmt-ofmt), _fmt, __FILE__, lineno);
+	MEM_freeN(ofmt);
+
 	BMO_Finish_Op(bm, op);
 	return 0;
+
+#undef GOTO_ERROR
+
 }
 
 




More information about the Bf-blender-cvs mailing list