]> granicus.if.org Git - python/commitdiff
Patch submitted by Brad Howes (with one bug fixed by me): allow
authorGuido van Rossum <guido@python.org>
Mon, 8 Sep 1997 18:30:11 +0000 (18:30 +0000)
committerGuido van Rossum <guido@python.org>
Mon, 8 Sep 1997 18:30:11 +0000 (18:30 +0000)
arbitrary nested parens in a %(...)X style format.
#Also folded two lines and added more detail to the error message for
#unsupported format character.

Objects/stringobject.c

index cb370386ef08f48886560a6cb3e003ec98002f77..5928128ce147fc3f122694e688a20cf4d3ee12b9 100644 (file)
@@ -464,7 +464,8 @@ string_buffer_getreadbuf(self, index, ptr)
        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 @@ string_buffer_getwritebuf(self, index, ptr)
        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 @@ PyString_Format(format, args)
                                char *keystart;
                                int keylen;
                                PyObject *key;
+                               int pcount = 1;
 
                                if (dict == NULL) {
                                        PyErr_SetString(PyExc_TypeError,
@@ -762,11 +765,16 @@ PyString_Format(format, args)
                                ++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 @@ PyString_Format(format, args)
                                        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) {