]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Merged revisions 59056-59076 via svnmerge from
authorChristian Heimes <christian@cheimes.de>
Tue, 20 Nov 2007 23:38:09 +0000 (23:38 +0000)
committerChristian Heimes <christian@cheimes.de>
Tue, 20 Nov 2007 23:38:09 +0000 (23:38 +0000)
svn+ssh://pythondev@svn.python.org/python/trunk

........
  r59064 | christian.heimes | 2007-11-20 02:48:48 +0100 (Tue, 20 Nov 2007) | 1 line

  Fixed bug #1470
........
  r59066 | martin.v.loewis | 2007-11-20 03:46:02 +0100 (Tue, 20 Nov 2007) | 2 lines

  Patch #1468: Package Lib/test/*.pem.
........
  r59068 | christian.heimes | 2007-11-20 04:21:02 +0100 (Tue, 20 Nov 2007) | 1 line

  Another fix for test_shutil. Martin pointed out that it breaks some build bots
........
  r59073 | nick.coghlan | 2007-11-20 15:55:57 +0100 (Tue, 20 Nov 2007) | 1 line

  Backport some main.c cleanup from the py3k branch
........
  r59076 | amaury.forgeotdarc | 2007-11-21 00:31:27 +0100 (Wed, 21 Nov 2007) | 6 lines

  The incremental decoder for utf-7 must preserve its state between calls.
  Solves issue1460.

  Might not be a backport candidate: a new API function was added,
  and some code may rely on details in utf-7.py.
........

Include/unicodeobject.h
Lib/encodings/utf_7.py
Lib/test/test_codecs.py
Modules/_codecsmodule.c
Objects/unicodeobject.c
Tools/msi/msi.py

index 203dcef09fd9abf87d6ebd0cc562f9586920ba76..f3c37fe63b6fb9cd0377ffe26b7943385c98dc2d 100644 (file)
@@ -751,6 +751,13 @@ PyAPI_FUNC(PyObject*) PyUnicode_DecodeUTF7(
     const char *errors         /* error handling */
     );
 
+PyAPI_FUNC(PyObject*) PyUnicode_DecodeUTF7Stateful(
+    const char *string,        /* UTF-7 encoded string */
+    Py_ssize_t length,         /* size of string */
+    const char *errors,                /* error handling */
+    Py_ssize_t *consumed       /* bytes consumed */
+    );
+
 PyAPI_FUNC(PyObject*) PyUnicode_EncodeUTF7(
     const Py_UNICODE *data,    /* Unicode char buffer */
     Py_ssize_t length,         /* number of Py_UNICODE chars to encode */
index d78d1926b30da2f90c76b67ae2253f00d0f18a5a..8e0567f2087d65e33b3152b8240bcaf703d855fb 100644 (file)
@@ -6,34 +6,31 @@ import codecs
 
 ### Codec APIs
 
-class Codec(codecs.Codec):
+encode = codecs.utf_7_encode
 
-    # Note: Binding these as C functions will result in the class not
-    # converting them to methods. This is intended.
-    encode = codecs.utf_7_encode
-    decode = codecs.utf_7_decode
+def decode(input, errors='strict'):
+    return codecs.utf_7_decode(input, errors, True)
 
 class IncrementalEncoder(codecs.IncrementalEncoder):
     def encode(self, input, final=False):
         return codecs.utf_7_encode(input, self.errors)[0]
 
 class IncrementalDecoder(codecs.BufferedIncrementalDecoder):
-    def _buffer_decode(self, input, errors, final):
-        return codecs.utf_7_decode(input, self.errors)
+    _buffer_decode = codecs.utf_7_decode
 
-class StreamWriter(Codec,codecs.StreamWriter):
-    pass
+class StreamWriter(codecs.StreamWriter):
+    encode = codecs.utf_7_encode
 
-class StreamReader(Codec,codecs.StreamReader):
-    pass
+class StreamReader(codecs.StreamReader):
+    decode = codecs.utf_7_decode
 
 ### encodings module API
 
 def getregentry():
     return codecs.CodecInfo(
         name='utf-7',
-        encode=Codec.encode,
-        decode=Codec.decode,
+        encode=encode,
+        decode=decode,
         incrementalencoder=IncrementalEncoder,
         incrementaldecoder=IncrementalDecoder,
         streamreader=StreamReader,
index 413a5aa8d27997ebfb5d5ad83023221988413154..a828edfa6ef07dd5cff022ddb9efa61f29b8251a 100644 (file)
@@ -544,7 +544,17 @@ class UTF8Test(ReadTest):
 class UTF7Test(ReadTest):
     encoding = "utf-7"
 
-    # No test_partial() yet, because UTF-7 doesn't support it.
+    def test_partial(self):
+        self.check_partial(
+            "a+-b",
+            [
+                "a",
+                "a",
+                "a+",
+                "a+-",
+                "a+-b",
+            ]
+        )
 
 class UTF16ExTest(unittest.TestCase):
 
index caee3fd4117797e2af9e96fd474c998d227fce84..caaac5879b1e313bd2112f9571cb9b84b74633e3 100644 (file)
@@ -250,18 +250,25 @@ unicode_internal_decode(PyObject *self,
 
 static PyObject *
 utf_7_decode(PyObject *self,
-           PyObject *args)
+             PyObject *args)
 {
     const char *data;
     Py_ssize_t size;
     const char *errors = NULL;
+    int final = 0;
+    Py_ssize_t consumed;
+    PyObject *decoded = NULL;
 
-    if (!PyArg_ParseTuple(args, "t#|z:utf_7_decode",
-                         &data, &size, &errors))
-       return NULL;
+    if (!PyArg_ParseTuple(args, "t#|zi:utf_7_decode",
+                          &data, &size, &errors, &final))
+        return NULL;
+    consumed = size;
 
-    return codec_tuple(PyUnicode_DecodeUTF7(data, size, errors),
-                      size);
+    decoded = PyUnicode_DecodeUTF7Stateful(data, size, errors,
+                                           final ? NULL : &consumed);
+    if (decoded == NULL)
+        return NULL;
+    return codec_tuple(decoded, consumed);
 }
 
 static PyObject *
index 426dc079ca3df33417ea95a40de59397b74b41d2..65c2980bf24654cad7e0727b5ac57ed0ffcd7423 100644 (file)
@@ -1518,6 +1518,14 @@ char utf7_special[128] = {
 PyObject *PyUnicode_DecodeUTF7(const char *s,
                               Py_ssize_t size,
                               const char *errors)
+{
+    return PyUnicode_DecodeUTF7Stateful(s, size, errors, NULL);
+}
+
+PyObject *PyUnicode_DecodeUTF7Stateful(const char *s,
+                              Py_ssize_t size,
+                              const char *errors,
+                              Py_ssize_t *consumed)
 {
     const char *starts = s;
     Py_ssize_t startinpos;
@@ -1537,8 +1545,11 @@ PyObject *PyUnicode_DecodeUTF7(const char *s,
     unicode = _PyUnicode_New(size);
     if (!unicode)
         return NULL;
-    if (size == 0)
+    if (size == 0) {
+        if (consumed)
+            *consumed = 0;
         return (PyObject *)unicode;
+    }
 
     p = unicode->str;
     e = s + size;
@@ -1624,7 +1635,7 @@ PyObject *PyUnicode_DecodeUTF7(const char *s,
         goto onError;
     }
 
-    if (inShift) {
+    if (inShift && !consumed) {
         outpos = p-PyUnicode_AS_UNICODE(unicode);
         endinpos = size;
         if (unicode_decode_call_errorhandler(
@@ -1636,6 +1647,12 @@ PyObject *PyUnicode_DecodeUTF7(const char *s,
         if (s < e)
            goto restart;
     }
+    if (consumed) {
+        if(inShift)
+            *consumed = startinpos;
+        else
+            *consumed = s-starts;
+    }
 
     if (_PyUnicode_Resize(&unicode, p - PyUnicode_AS_UNICODE(unicode)) < 0)
         goto onError;
index dffd02e38364464331c4ff5d0cc66f319c6e99e1..45f5a2e2c7b404d063521c53fcd1cfde03ff7c83 100644 (file)
@@ -974,6 +974,7 @@ def add_files(db):
             lib.add_file("check_soundcard.vbs")
             lib.add_file("empty.vbs")
             lib.glob("*.uue")
+            lib.glob("*.pem")
             lib.add_file("readme.txt", src="README")
         if dir=='decimaltestdata':
             lib.glob("*.decTest")