Patch submitted by Brad Howes (with one bug fixed by me): allow
arbitrary nested parens in a %(...)X style format.
#Also folded two lines and added more detail to the error message for
#unsupported format character.
diff --git a/Objects/stringobject.c b/Objects/stringobject.c
index cb37038..5928128 100644
--- a/Objects/stringobject.c
+++ b/Objects/stringobject.c
@@ -464,7 +464,8 @@
 	const void **ptr;
 {
 	if ( index != 0 ) {
-		PyErr_SetString(PyExc_SystemError, "Accessing non-existent string segment");
+		PyErr_SetString(PyExc_SystemError,
+				"Accessing non-existent string segment");
 		return -1;
 	}
 	*ptr = (void *)self->ob_sval;
@@ -477,7 +478,8 @@
 	int index;
 	const void **ptr;
 {
-	PyErr_SetString(PyExc_TypeError, "Cannot use string as modifyable buffer");
+	PyErr_SetString(PyExc_TypeError,
+			"Cannot use string as modifyable buffer");
 	return -1;
 }
 
@@ -753,6 +755,7 @@
 				char *keystart;
 				int keylen;
 				PyObject *key;
+				int pcount = 1;
 
 				if (dict == NULL) {
 					PyErr_SetString(PyExc_TypeError,
@@ -762,11 +765,16 @@
 				++fmt;
 				--fmtcnt;
 				keystart = fmt;
-				while (--fmtcnt >= 0 && *fmt != ')')
+				/* Skip over balanced parentheses */
+				while (pcount > 0 && --fmtcnt >= 0) {
+					if (*fmt == ')')
+						--pcount;
+					else if (*fmt == '(')
+						++pcount;
 					fmt++;
-				keylen = fmt - keystart;
-				++fmt;
-				if (fmtcnt < 0) {
+				}
+				keylen = fmt - keystart - 1;
+				if (fmtcnt < 0 || pcount > 0) {
 					PyErr_SetString(PyExc_ValueError,
 						   "incomplete format key");
 					goto error;
@@ -945,8 +953,9 @@
 					goto error;
 				break;
 			default:
-				PyErr_SetString(PyExc_ValueError,
-					   "unsupported format character");
+				PyErr_Format(PyExc_ValueError,
+				"unsupported format character '%c' (0x%x)",
+					c, c);
 				goto error;
 			}
 			if (sign) {