Patch #1436130: codecs.lookup() now returns a CodecInfo object (a subclass

of tuple) that provides incremental decoders and encoders (a way to use
stateful codecs without the stream API). Functions
codecs.getincrementaldecoder() and codecs.getincrementalencoder() have
been added.
This commit is contained in:
Walter Dörwald 2006-03-15 11:35:15 +00:00
parent e2ebb2d7f7
commit abb02e5994
98 changed files with 2212 additions and 420 deletions

View file

@ -260,6 +260,56 @@ PyObject *PyCodec_Decoder(const char *encoding)
return NULL;
}
PyObject *PyCodec_IncrementalEncoder(const char *encoding,
const char *errors)
{
PyObject *codecs, *ret, *encoder;
codecs = _PyCodec_Lookup(encoding);
if (codecs == NULL)
goto onError;
encoder = PyObject_GetAttrString(codecs, "incrementalencoder");
if (encoder == NULL) {
Py_DECREF(codecs);
return NULL;
}
if (errors)
ret = PyObject_CallFunction(encoder, "O", errors);
else
ret = PyObject_CallFunction(encoder, NULL);
Py_DECREF(encoder);
Py_DECREF(codecs);
return ret;
onError:
return NULL;
}
PyObject *PyCodec_IncrementalDecoder(const char *encoding,
const char *errors)
{
PyObject *codecs, *ret, *decoder;
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);
Py_DECREF(codecs);
return ret;
onError:
return NULL;
}
PyObject *PyCodec_StreamReader(const char *encoding,
PyObject *stream,
const char *errors)