]> granicus.if.org Git - python/commitdiff
Fix wrong argument format in PyCodec_IncrementalEncoder() and
authorWalter Dörwald <walter@livinglogic.de>
Thu, 16 Mar 2006 21:46:40 +0000 (21:46 +0000)
committerWalter Dörwald <walter@livinglogic.de>
Thu, 16 Mar 2006 21:46:40 +0000 (21:46 +0000)
PyCodec_IncrementalDecoder().

Factor out common code from PyCodec_Encoder()/PyCodec_Decoder(),
PyCodec_IncrementalEncoder()/PyCodec_IncrementalDecoder() and
PyCodec_StreamReader()/PyCodec_StreamWriter().

Python/codecs.c

index 0e8c37498077466c65fa183bd4a6d7958ef9085b..532f1a67723901f2db774d98a89231558462822a 100644 (file)
@@ -200,148 +200,109 @@ PyObject *args_tuple(PyObject *object,
     return args;
 }
 
-/* Build a codec by calling factory(stream[,errors]) or just
-   factory(errors) depending on whether the given parameters are
-   non-NULL. */
+/* Helper function to get a codec item */
 
 static
-PyObject *build_stream_codec(PyObject *factory,
-                            PyObject *stream,
-                            const char *errors)
-{
-    PyObject *args, *codec;
-
-    args = args_tuple(stream, errors);
-    if (args == NULL)
-       return NULL;
-    
-    codec = PyEval_CallObject(factory, args);
-    Py_DECREF(args);
-    return codec;
-}
-
-/* Convenience APIs to query the Codec registry. 
-   
-   All APIs return a codec object with incremented refcount.
-   
- */
-
-PyObject *PyCodec_Encoder(const char *encoding)
+PyObject *codec_getitem(const char *encoding, int index)
 {
     PyObject *codecs;
     PyObject *v;
 
     codecs = _PyCodec_Lookup(encoding);
     if (codecs == NULL)
-       goto onError;
-    v = PyTuple_GET_ITEM(codecs,0);
+       return NULL;
+    v = PyTuple_GET_ITEM(codecs, index);
     Py_DECREF(codecs);
     Py_INCREF(v);
     return v;
-
- onError:
-    return NULL;
 }
 
-PyObject *PyCodec_Decoder(const char *encoding)
-{
-    PyObject *codecs;
-    PyObject *v;
-
-    codecs = _PyCodec_Lookup(encoding);
-    if (codecs == NULL)
-       goto onError;
-    v = PyTuple_GET_ITEM(codecs,1);
-    Py_DECREF(codecs);
-    Py_INCREF(v);
-    return v;
+/* Helper function to create an incremental codec. */
 
- onError:
-    return NULL;
-}
-
-PyObject *PyCodec_IncrementalEncoder(const char *encoding,
-                                    const char *errors)
+static
+PyObject *codec_getincrementalcodec(const char *encoding,
+                                   const char *errors,
+                                   const char *attrname)
 {
-    PyObject *codecs, *ret, *encoder;
+    PyObject *codecs, *ret, *inccodec;
 
     codecs = _PyCodec_Lookup(encoding);
     if (codecs == NULL)
-       goto onError;
-    encoder = PyObject_GetAttrString(codecs, "incrementalencoder");
-    if (encoder == NULL) {
+       return NULL;
+    inccodec = PyObject_GetAttrString(codecs, attrname);
+    if (inccodec == NULL) {
        Py_DECREF(codecs);
        return NULL;
     }
     if (errors)
-       ret = PyObject_CallFunction(encoder, "O", errors);
+       ret = PyObject_CallFunction(inccodec, "s", errors);
     else
-       ret = PyObject_CallFunction(encoder, NULL);
-    Py_DECREF(encoder);
+       ret = PyObject_CallFunction(inccodec, NULL);
+    Py_DECREF(inccodec);
     Py_DECREF(codecs);
     return ret;
-
- onError:
-    return NULL;
 }
 
-PyObject *PyCodec_IncrementalDecoder(const char *encoding,
-                                    const char *errors)
+/* Helper function to create a stream codec. */
+
+static
+PyObject *codec_getstreamcodec(const char *encoding,
+                              PyObject *stream,
+                              const char *errors,
+                              const int index)
 {
-    PyObject *codecs, *ret, *decoder;
+    PyObject *codecs, *streamcodec;
 
     codecs = _PyCodec_Lookup(encoding);
     if (codecs == NULL)
-       goto onError;
-    decoder = PyObject_GetAttrString(codecs, "incrementaldecoder");
-    if (decoder == NULL) {
-       Py_DECREF(codecs);
        return NULL;
-    }
-    if (errors)
-       ret = PyObject_CallFunction(decoder, "O", errors);
-    else
-       ret = PyObject_CallFunction(decoder, NULL);
-    Py_DECREF(decoder);
+
+    streamcodec = PyEval_CallFunction(
+       PyTuple_GET_ITEM(codecs, index), "Os", stream, errors);
     Py_DECREF(codecs);
-    return ret;
+    return streamcodec;
+}
 
- onError:
-    return NULL;
+/* Convenience APIs to query the Codec registry. 
+   
+   All APIs return a codec object with incremented refcount.
+   
+ */
+
+PyObject *PyCodec_Encoder(const char *encoding)
+{
+    return codec_getitem(encoding, 0);
+}
+
+PyObject *PyCodec_Decoder(const char *encoding)
+{
+    return codec_getitem(encoding, 1);
+}
+
+PyObject *PyCodec_IncrementalEncoder(const char *encoding,
+                                    const char *errors)
+{
+    return codec_getincrementalcodec(encoding, errors, "incrementalencoder");
+}
+
+PyObject *PyCodec_IncrementalDecoder(const char *encoding,
+                                    const char *errors)
+{
+    return codec_getincrementalcodec(encoding, errors, "incrementaldecoder");
 }
 
 PyObject *PyCodec_StreamReader(const char *encoding,
                               PyObject *stream,
                               const char *errors)
 {
-    PyObject *codecs, *ret;
-
-    codecs = _PyCodec_Lookup(encoding);
-    if (codecs == NULL)
-       goto onError;
-    ret = build_stream_codec(PyTuple_GET_ITEM(codecs,2),stream,errors);
-    Py_DECREF(codecs);
-    return ret;
-
- onError:
-    return NULL;
+    return codec_getstreamcodec(encoding, stream, errors, 2);
 }
 
 PyObject *PyCodec_StreamWriter(const char *encoding,
                               PyObject *stream,
                               const char *errors)
 {
-    PyObject *codecs, *ret;
-
-    codecs = _PyCodec_Lookup(encoding);
-    if (codecs == NULL)
-       goto onError;
-    ret = build_stream_codec(PyTuple_GET_ITEM(codecs,3),stream,errors);
-    Py_DECREF(codecs);
-    return ret;
-
- onError:
-    return NULL;
+    return codec_getstreamcodec(encoding, stream, errors, 3);
 }
 
 /* Encode an object (e.g. an Unicode object) using the given encoding