[Python-checkins] r43089 - python/trunk/Python/codecs.c

walter.doerwald python-checkins at python.org
Thu Mar 16 22:46:42 CET 2006


Author: walter.doerwald
Date: Thu Mar 16 22:46:40 2006
New Revision: 43089
Modified:
 python/trunk/Python/codecs.c
Log:
Fix wrong argument format in PyCodec_IncrementalEncoder() and
PyCodec_IncrementalDecoder().
Factor out common code from PyCodec_Encoder()/PyCodec_Decoder(),
PyCodec_IncrementalEncoder()/PyCodec_IncrementalDecoder() and
PyCodec_StreamReader()/PyCodec_StreamWriter().
Modified: python/trunk/Python/codecs.c
==============================================================================
--- python/trunk/Python/codecs.c	(original)
+++ python/trunk/Python/codecs.c	Thu Mar 16 22:46:40 2006
@@ -200,148 +200,109 @@
 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


More information about the Python-checkins mailing list

AltStyle によって変換されたページ (->オリジナル) /