[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [44980] trunk/blender/source/blender/bmesh /intern/bmesh_operators.c: better error reporting when a bmesh operator fails.

Campbell Barton ideasman42 at gmail.com
Mon Mar 19 00:38:38 CET 2012


Revision: 44980
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=44980
Author:   campbellbarton
Date:     2012-03-18 23:38:31 +0000 (Sun, 18 Mar 2012)
Log Message:
-----------
better error reporting when a bmesh operator fails. (give reason and show char number that fails)

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

Modified: trunk/blender/source/blender/bmesh/intern/bmesh_operators.c
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_operators.c	2012-03-18 22:21:29 UTC (rev 44979)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_operators.c	2012-03-18 23:38:31 UTC (rev 44980)
@@ -1250,9 +1250,15 @@
 
 
 	/* basic useful info to help find where bmop formatting strings fail */
+	const char *err_reason = "Unknown";
 	int lineno = -1;
-#   define GOTO_ERROR { lineno = __LINE__; goto error; }
 
+#define GOTO_ERROR(reason)   \
+	{                        \
+		err_reason = reason; \
+		lineno = __LINE__;   \
+		goto error;          \
+	} (void)0
 
 	/* we muck around in here, so dup i */
 	fmt = ofmt = BLI_strdup(_fmt);
@@ -1293,11 +1299,15 @@
 			 * 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("could not match end of slot name");
+			}
 
 			fmt[i] = 0;
 
-			if (bmo_name_to_slotcode_check(def, fmt) < 0) GOTO_ERROR;
+			if (bmo_name_to_slotcode_check(def, fmt) < 0) {
+				GOTO_ERROR("name to slot code check failed");
+			}
 			
 			BLI_strncpy(slotname, fmt, sizeof(slotname));
 			
@@ -1317,9 +1327,9 @@
 					c = NEXT_CHAR(fmt);
 					fmt++;
 
-					if (c == '3') size = 3;
+					if      (c == '3') size = 3;
 					else if (c == '4') size = 4;
-					else GOTO_ERROR;
+					else GOTO_ERROR("matrix size was not 3 or 4");
 
 					BMO_slot_mat_set(op, slotname, va_arg(vlist, void *), size);
 					state = 1;
@@ -1416,9 +1426,24 @@
 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);
+	fprintf(stderr, "%s: error parsing formatting string\n", __func__);
+
+	fprintf(stderr, "string: '%s', position %d\n", _fmt, (int)(fmt - ofmt));
+	fprintf(stderr, "         ");
+	{
+		int pos = (int)(fmt - ofmt);
+		int i;
+		for (i = 0; i < pos; i++) {
+			fprintf(stderr, " ");
+		}
+		fprintf(stderr, "^\n");
+	}
+
+	fprintf(stderr, "source code:  %s:%d\n", __FILE__, lineno);
+
+	fprintf(stderr, "reason: %s\n", err_reason);
+
+
 	MEM_freeN(ofmt);
 
 	BMO_op_finish(bm, op);




More information about the Bf-blender-cvs mailing list