]> granicus.if.org Git - python/commitdiff
Bug #2388: Fix gcc warnings when compiling with --enable-unicode=ucs4.
authorMartin v. Löwis <martin@v.loewis.de>
Mon, 7 Apr 2008 03:08:28 +0000 (03:08 +0000)
committerMartin v. Löwis <martin@v.loewis.de>
Mon, 7 Apr 2008 03:08:28 +0000 (03:08 +0000)
Objects/stringlib/formatter.h
Objects/stringlib/string_format.h
Objects/unicodeobject.c

index 3ca14fac816436114d321ecf2df5b1ad42ef055a..531bc223ff3241e7f969b2b2b4d68931e80fa92f 100644 (file)
@@ -785,8 +785,19 @@ FORMAT_STRING(PyObject* value, PyObject* args)
         break;
     default:
         /* unknown */
-        PyErr_Format(PyExc_ValueError, "Unknown conversion type %c",
-                     format.type);
+       #if STRINGLIB_IS_UNICODE
+       /* If STRINGLIB_CHAR is Py_UNICODE, %c might be out-of-range,
+          hence the two cases. If it is char, gcc complains that the
+          condition below is always true, hence the ifdef. */
+        if (format.type > 32 && format.type <128)
+       #endif
+            PyErr_Format(PyExc_ValueError, "Unknown conversion type %c",
+                         (char)format.type);
+       #if STRINGLIB_IS_UNICODE
+       else
+            PyErr_Format(PyExc_ValueError, "Unknown conversion type '\\x%x'",
+                         (unsigned int)format.type);
+       #endif
         goto done;
     }
 
index 214b7b33ab7335a449750a6ebeab6143a8318cf5..be8e8080851697ebf8259e72593f592992ebef15 100644 (file)
@@ -740,9 +740,17 @@ do_conversion(PyObject *obj, STRINGLIB_CHAR conversion)
     case 's':
         return STRINGLIB_TOSTR(obj);
     default:
-        PyErr_Format(PyExc_ValueError,
-                     "Unknown converion specifier %c",
-                     conversion);
+       if (conversion > 32 && conversion < 127) {
+               /* It's the ASCII subrange; casting to char is safe
+                  (assuming the execution character set is an ASCII
+                  superset). */
+               PyErr_Format(PyExc_ValueError,
+                     "Unknown conversion specifier %c",
+                     (char)conversion);
+       } else
+               PyErr_Format(PyExc_ValueError,
+                    "Unknown conversion specifier \\x%x",
+                    (unsigned int)conversion);
         return NULL;
     }
 }
index c5acd1b43ca54bbc7fa18b57e3de4f63e0487129..75ad9f0832ae393018cbed9537392facefc3c72e 100644 (file)
@@ -8644,7 +8644,7 @@ PyObject *PyUnicode_Format(PyObject *format,
                if (!isnumok) {
                        PyErr_Format(PyExc_TypeError, 
                            "%%%c format: a number is required, "
-                           "not %.200s", c, Py_TYPE(v)->tp_name);
+                                     "not %.200s", (char)c, Py_TYPE(v)->tp_name);
                        goto onError;
                }
                if (flags & F_ZERO)