]> granicus.if.org Git - python/commitdiff
make 'c' only accept bytes and 'C' only unicode #5499
authorBenjamin Peterson <benjamin@python.org>
Thu, 2 Apr 2009 00:33:55 +0000 (00:33 +0000)
committerBenjamin Peterson <benjamin@python.org>
Thu, 2 Apr 2009 00:33:55 +0000 (00:33 +0000)
Doc/c-api/arg.rst
Lib/test/buffer_tests.py
Misc/NEWS
Python/getargs.c

index dfedf972feb79f5cf9a011fe9e84d921e71d55c6..a554bc9300d8c684e6cc32e90210b64562333d4c 100644 (file)
@@ -208,9 +208,13 @@ variable(s) whose address should be passed.
    Convert a Python integer to a C :ctype:`Py_ssize_t`.
 
 ``c`` (string of length 1) [char]
-   Convert a Python character, represented as a string of length 1, to a C
+   Convert a Python character, represented as a byte string of length 1, to a C
    :ctype:`char`.
 
+``C`` (string of length 1) [int]
+   Covert a Python character, represented as a unicode string of length 1, to a
+   C :ctype:`int`.
+
 ``f`` (float) [float]
    Convert a Python floating point number to a C :ctype:`float`.
 
index 8696eab61da0a0b4156a3f8659c01b073c96f845..58689cdb34554ddcedab045f40cb73ecd54222ac 100644 (file)
@@ -112,7 +112,7 @@ class MixinBytesBufferCommonTests(object):
         self.assertEqual(b'abc   ', self.marshal(b'abc').ljust(6))
         self.assertEqual(b'abc', self.marshal(b'abc').ljust(3))
         self.assertEqual(b'abc', self.marshal(b'abc').ljust(2))
-        self.assertEqual(b'abc*******', self.marshal(b'abc').ljust(10, '*'))
+        self.assertEqual(b'abc*******', self.marshal(b'abc').ljust(10, b'*'))
         self.assertRaises(TypeError, self.marshal(b'abc').ljust)
 
     def test_rjust(self):
@@ -120,7 +120,7 @@ class MixinBytesBufferCommonTests(object):
         self.assertEqual(b'   abc', self.marshal(b'abc').rjust(6))
         self.assertEqual(b'abc', self.marshal(b'abc').rjust(3))
         self.assertEqual(b'abc', self.marshal(b'abc').rjust(2))
-        self.assertEqual(b'*******abc', self.marshal(b'abc').rjust(10, '*'))
+        self.assertEqual(b'*******abc', self.marshal(b'abc').rjust(10, b'*'))
         self.assertRaises(TypeError, self.marshal(b'abc').rjust)
 
     def test_center(self):
@@ -128,7 +128,7 @@ class MixinBytesBufferCommonTests(object):
         self.assertEqual(b' abc  ', self.marshal(b'abc').center(6))
         self.assertEqual(b'abc', self.marshal(b'abc').center(3))
         self.assertEqual(b'abc', self.marshal(b'abc').center(2))
-        self.assertEqual(b'***abc****', self.marshal(b'abc').center(10, '*'))
+        self.assertEqual(b'***abc****', self.marshal(b'abc').center(10, b'*'))
         self.assertRaises(TypeError, self.marshal(b'abc').center)
 
     def test_swapcase(self):
index b02e7856841a19c39ae3e332c42c6e708b1de77d..8e9fbf455b7c47356a86dc3ca4a97a8a86ba2139 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -12,6 +12,9 @@ What's New in Python 3.1 alpha 2?
 Core and Builtins
 -----------------
 
+- Issue #5499: The 'c' code for argument parsing functions now only accepts a
+  byte, and the 'C' code only accepts a unicode character.
+
 - Issue #1665206: Remove the last eager import in _warnings.c and make it lazy.
 
 - Fix a segfault when running test_exceptions with coverage, caused by
index 3ab59b3e42d87ed1af3b38d8811de1cdae109cbf..a89ee6f858967b66e147cf730e96582a491f7859 100644 (file)
@@ -776,24 +776,18 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags,
                char *p = va_arg(*p_va, char *);
                if (PyBytes_Check(arg) && PyBytes_Size(arg) == 1)
                        *p = PyBytes_AS_STRING(arg)[0];
-               else if (PyUnicode_Check(arg) &&
-                        PyUnicode_GET_SIZE(arg) == 1 &&
-                        PyUnicode_AS_UNICODE(arg)[0] < 256)
-                       *p = (char)PyUnicode_AS_UNICODE(arg)[0];
                else
-                       return converterr("char < 256", arg, msgbuf, bufsize);
+                       return converterr("a byte string of length 1", arg, msgbuf, bufsize);
                break;
        }
 
        case 'C': {/* unicode char */
                int *p = va_arg(*p_va, int *);
-               if (PyBytes_Check(arg) && PyBytes_Size(arg) == 1)
-                       *p = PyBytes_AS_STRING(arg)[0];
-               else if (PyUnicode_Check(arg) &&
-                        PyUnicode_GET_SIZE(arg) == 1)
+               if (PyUnicode_Check(arg) &&
+                    PyUnicode_GET_SIZE(arg) == 1)
                        *p = PyUnicode_AS_UNICODE(arg)[0];
                else
-                       return converterr("char", arg, msgbuf, bufsize);
+                       return converterr("a unicode character", arg, msgbuf, bufsize);
                break;
        }