diff options
-rw-r--r-- | Lib/encodings/__init__.py | 5 | ||||
-rw-r--r-- | Lib/encodings/iconv_codec.py | 34 | ||||
-rwxr-xr-x | Lib/test/regrtest.py | 4 | ||||
-rw-r--r-- | Lib/test/test_iconv_codecs.py | 99 | ||||
-rw-r--r-- | Misc/NEWS | 7 | ||||
-rw-r--r-- | Modules/Setup.dist | 4 | ||||
-rw-r--r-- | Modules/_iconv_codec.c | 723 | ||||
-rw-r--r-- | setup.py | 18 |
8 files changed, 2 insertions, 892 deletions
diff --git a/Lib/encodings/__init__.py b/Lib/encodings/__init__.py index e312fb8..a214190 100644 --- a/Lib/encodings/__init__.py +++ b/Lib/encodings/__init__.py @@ -121,8 +121,3 @@ def search_function(encoding): # Register the search_function in the Python codec registry codecs.register(search_function) -# Register iconv_codec lookup function if available -try: - import iconv_codec -except (ImportError, RuntimeError): - pass diff --git a/Lib/encodings/iconv_codec.py b/Lib/encodings/iconv_codec.py deleted file mode 100644 index 8bd0c3f..0000000 --- a/Lib/encodings/iconv_codec.py +++ /dev/null @@ -1,34 +0,0 @@ -""" Python 'iconv' Codec - - -Written by Hye-Shik Chang (perky@FreeBSD.org). - -Copyright(c) Python Software Foundation, All Rights Reserved. NO WARRANTY. - -""" - -import _iconv_codec -import codecs - -def lookup(enc): - class IconvCodec(_iconv_codec.iconvcodec, codecs.Codec): - encoding = enc - - try: - c = IconvCodec() - - class IconvStreamReader(IconvCodec, codecs.StreamReader): - __init__ = codecs.StreamReader.__init__ - class IconvStreamWriter(IconvCodec, codecs.StreamWriter): - __init__ = codecs.StreamWriter.__init__ - - return ( - c.encode, c.decode, - IconvStreamReader, IconvStreamWriter - ) - except ValueError: - return None - -codecs.register(lookup) - -# ex: ts=8 sts=4 et diff --git a/Lib/test/regrtest.py b/Lib/test/regrtest.py index 818b4aa..4ec2855 100755 --- a/Lib/test/regrtest.py +++ b/Lib/test/regrtest.py @@ -569,7 +569,6 @@ _expectations = { test_gdbm test_gl test_grp - test_iconv_codecs test_imgfile test_ioctl test_largefile @@ -626,7 +625,6 @@ _expectations = { test_fork1 test_gl test_grp - test_iconv_codecs test_ioctl test_imgfile test_largefile @@ -774,7 +772,6 @@ _expectations = { test_email_codecs test_gdbm test_gl - test_iconv_codecs test_imgfile test_largefile test_linuxaudiodev @@ -890,7 +887,6 @@ _expectations = { test_dl test_email_codecs test_gl - test_iconv_codecs test_imgfile test_largefile test_linuxaudiodev diff --git a/Lib/test/test_iconv_codecs.py b/Lib/test/test_iconv_codecs.py deleted file mode 100644 index 9d27faa..0000000 --- a/Lib/test/test_iconv_codecs.py +++ /dev/null @@ -1,99 +0,0 @@ -from test import test_support -import unittest, sys -import codecs, _iconv_codec -from encodings import iconv_codec -from StringIO import StringIO - -class IconvCodecTest(unittest.TestCase): - - if sys.byteorder == 'big': - spam = '\x00s\x00p\x00a\x00m' * 2 - else: - spam = 's\x00p\x00a\x00m\x00' * 2 - - def test_sane(self): - # FIXME: Commented out, because it's not clear whether - # the internal encoding choosen requires byte swapping - # for this iconv() implementation. - if False: - self.encoder, self.decoder, self.reader, self.writer = \ - codecs.lookup(_iconv_codec.internal_encoding) - self.assertEqual(self.decoder(self.spam), (u'spamspam', 16)) - self.assertEqual(self.encoder(u'spamspam'), (self.spam, 8)) - self.assertEqual(self.reader(StringIO(self.spam)).read(), u'spamspam') - f = StringIO() - self.writer(f).write(u'spamspam') - self.assertEqual(f.getvalue(), self.spam) - - def test_basic_errors(self): - self.encoder, self.decoder, self.reader, self.writer = \ - iconv_codec.lookup("ascii") - def testencerror(errors): - return self.encoder(u'sp\ufffdam', errors) - def testdecerror(errors): - return self.decoder('sp\xffam', errors) - - self.assertRaises(UnicodeEncodeError, testencerror, 'strict') - self.assertRaises(UnicodeDecodeError, testdecerror, 'strict') - self.assertEqual(testencerror('replace'), ('sp?am', 5)) - self.assertEqual(testdecerror('replace'), (u'sp\ufffdam', 5)) - self.assertEqual(testencerror('ignore'), ('spam', 5)) - self.assertEqual(testdecerror('ignore'), (u'spam', 5)) - - def test_pep293_errors(self): - self.encoder, self.decoder, self.reader, self.writer = \ - iconv_codec.lookup("ascii") - def testencerror(errors): - return self.encoder(u'sp\ufffdam', errors) - def testdecerror(errors): - return self.decoder('sp\xffam', errors) - - self.assertEqual(testencerror('xmlcharrefreplace'), - ('sp�am', 5)) - self.assertEqual(testencerror('backslashreplace'), - ('sp\\ufffdam', 5)) - - def error_bomb(exc): - return (u'*'*40, len(exc.object)) - def error_mock(exc): - error_mock.lastexc = exc - return (unicode(exc.object[exc.start - 1]), exc.end) - - codecs.register_error('test_iconv_codec.bomb', error_bomb) - codecs.register_error('test_iconv_codec.mock', error_mock) - - self.assertEqual(testencerror('test_iconv_codec.bomb'), - ('sp' + ('*'*40), 5)) - self.assertEqual(testdecerror('test_iconv_codec.bomb'), - (u'sp' + (u'*'*40), 5)) - - self.assertEqual(testencerror('test_iconv_codec.mock'), ('sppam', 5)) - exc = error_mock.lastexc - self.assertEqual(exc.object, u'sp\ufffdam') - self.assertEqual(exc.start, 2) - self.assertEqual(exc.end, 3) - self.assert_(isinstance(exc, UnicodeEncodeError)) - - self.assertEqual(testdecerror('test_iconv_codec.mock'), (u'sppam', 5)) - exc = error_mock.lastexc - self.assertEqual(exc.object, 'sp\xffam') - self.assertEqual(exc.start, 2) - self.assertEqual(exc.end, 3) - self.assert_(isinstance(exc, UnicodeDecodeError)) - - def test_empty_escape_decode(self): - self.encoder, self.decoder, self.reader, self.writer = \ - iconv_codec.lookup("ascii") - self.assertEquals(self.decoder(u""), ("", 0)) - self.assertEquals(self.encoder(""), (u"", 0)) - -def test_main(): - suite = unittest.TestSuite() - suite.addTest(unittest.makeSuite(IconvCodecTest)) - test_support.run_suite(suite) - - -if __name__ == "__main__": - test_main() - -# ex: ts=8 sts=4 et @@ -41,6 +41,8 @@ Core and builtins Extension modules ----------------- +- The iconv module has been removed from this release. + - The platform-independent routines for packing floats in IEEE formats (struct.pack's <f, >f, <d, and >d codes; pickle and cPickle's protocol 1 pickling of floats) ignored that rounding can cause a carry to @@ -105,8 +107,6 @@ TBD Build ----- -- Fix build problems when _iconv_codec failed. (SF bug #690012.) - - Fix problem building on OSF1 because the compiler only accepted preprocessor directives that start in column 1. (SF bug #691793.) @@ -276,9 +276,6 @@ Extension modules - The SSL module now handles sockets with a timeout set correctly (SF patch #675750, fixing SF bug #675552). -- A new module _iconv_codec has been added, to expose the iconv(3) - library. - - os/posixmodule has grown the sysexits.h constants (EX_OK and friends). - Fixed broken threadstate swap in readline that could cause fatal diff --git a/Modules/Setup.dist b/Modules/Setup.dist index efb783e..503be2a 100644 --- a/Modules/Setup.dist +++ b/Modules/Setup.dist @@ -478,10 +478,6 @@ GLHACK=-Dclear=__GLclear #EXPAT_DIR=/usr/local/src/expat-1.95.2 #pyexpat pyexpat.c -DHAVE_EXPAT_H -I$(EXPAT_DIR)/lib -L$(EXPAT_DIR) -lexpat -# Wrapper for iconv(3). This requires either GNU iconv, or a native -# iconv implementation (only Linux, Solaris, and BSD are known to work) -#_iconv_codec _iconv_codec -I$(prefix)/include -L$(exec_prefix)/lib -liconv - # Example -- included for reference only: # xx xxmodule.c diff --git a/Modules/_iconv_codec.c b/Modules/_iconv_codec.c deleted file mode 100644 index 3570f46..0000000 --- a/Modules/_iconv_codec.c +++ /dev/null @@ -1,723 +0,0 @@ -/* - * _iconv_codec.c - * - * libiconv adaptor for Python iconvcodec - * - * Author : Hye-Shik Chang <perky@FreeBSD.org> - * Created : 17 January 2003 - */ - -#include "Python.h" -#include <string.h> -#include <iconv.h> - -static const char *__version__ = "$Revision$"; - -#if Py_USING_UNICODE -# if Py_UNICODE_SIZE == 2 -# ifdef __GNU_LIBRARY__ -# define UNICODE_ENCODING "ucs-2" -# else -# define UNICODE_ENCODING "ucs-2-internal" -# endif -# define MBENCODED_LENGTH_MAX 4 -# elif Py_UNICODE_SIZE == 4 -# ifdef __GNU_LIBRARY__ -# define UNICODE_ENCODING "ucs-4" -# else -# define UNICODE_ENCODING "ucs-4-internal" -# endif -# define MBENCODED_LENGTH_MAX 6 -# endif -#else -# error "Unicode is not available" -#endif - -typedef struct { - PyObject_HEAD - iconv_t enchdl, dechdl; - char *encoding; -} iconvcodecObject; -PyDoc_STRVAR(iconvcodec_doc, "iconvcodec object"); - -/* does the chosen internal encoding require - * byteswapping to get native endianness? - * 0=no, 1=yes, -1=unknown */ -static int byteswap = -1; - -#define ERROR_STRICT (PyObject *)(1) -#define ERROR_IGNORE (PyObject *)(2) -#define ERROR_REPLACE (PyObject *)(3) -#define ERROR_MAX ERROR_REPLACE - -#define REPLACEMENT_CHAR_DECODE 0xFFFD -#define REPLACEMENT_CHAR_ENCODE '?' - -#define DEFAULT_ENCODING "utf-8" - - -static PyObject * -get_errorcallback(const char *errors) -{ - if (errors == NULL || strcmp(errors, "strict") == 0) - return ERROR_STRICT; - else if (strcmp(errors, "ignore") == 0) - return ERROR_IGNORE; - else if (strcmp(errors, "replace") == 0) - return ERROR_REPLACE; - else - return PyCodec_LookupError(errors); -} - - -PyDoc_STRVAR(iconvcodec_encode__doc__, -"I.encode(unicode, [,errors]) -> (string, length consumed)\n\ -\n\ -Return an encoded string version of `unicode'. errors may be given to\n\ -set a different error handling scheme. Default is 'strict' meaning that\n\ -encoding errors raise a UnicodeEncodeError. Other possible values are\n\ -'ignore', 'replace' and 'xmlcharrefreplace' as well as any other name\n\ -registered with codecs.register_error that can handle UnicodeEncodeErrors."); - -static PyObject * -iconvcodec_encode(iconvcodecObject *self, PyObject *args, PyObject *kwargs) -{ - static char *kwlist[] = { "input", "errors", NULL }; - Py_UNICODE *input; - int inputlen; - char *errors = NULL/*strict*/, *out, *out_top; - const char *inp, *inp_top; - size_t inplen, inplen_total, outlen, outlen_total, estep; - PyObject *outputobj = NULL, *errorcb = NULL, - *exceptionobj = NULL; - Py_UNICODE *swappedinput = NULL; - int swapi; - - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "u#|s:encode", - kwlist, &input, &inputlen, &errors)) - return NULL; /* TypeError */ - - errorcb = get_errorcallback(errors); - if (errorcb == NULL) - return NULL; /* LookupError or something else from error handler */ - - inp = inp_top = (char *)input; - inplen = inplen_total = (size_t)(inputlen * Py_UNICODE_SIZE); - - outlen = inputlen * MBENCODED_LENGTH_MAX; - if (outlen < 16) - outlen = 16; /* for iso-2022 codecs */ - - outputobj = PyString_FromStringAndSize(NULL, outlen); - if (outputobj == NULL) - return NULL; - out = out_top = PyString_AS_STRING(outputobj); - outlen_total = outlen; - - estep = inputlen * Py_UNICODE_SIZE / 2; - -#define RESIZE_OUTBUFFER(size) { \ - size_t toadd = (size); \ - outlen_total += toadd; \ - outlen += toadd; \ - if (_PyString_Resize(&outputobj, outlen_total) == -1) \ - goto errorexit; \ - out = PyString_AS_STRING(outputobj) + (out - out_top); \ - out_top = PyString_AS_STRING(outputobj); \ -} - if (byteswap) { - swappedinput = PyMem_Malloc(inplen); - if (swappedinput == NULL) - return NULL; - for (swapi = 0; swapi<inputlen; ++swapi) - { - Py_UNICODE c = input[swapi]; -#if Py_UNICODE_SIZE == 2 - c = ((char *)&c)[0]<<8 | ((char *)&c)[1]; -#else - c = ((char *)&c)[0]<<24 | ((char *)&c)[1]<<16 | - ((char *)&c)[2]<<8 | ((char *)&c)[3]; -#endif - swappedinput[swapi] = c; - } - inp = inp_top = (char *)swappedinput; - } - - while (inplen > 0) { - if (iconv(self->enchdl, (char**)&inp, &inplen, &out, &outlen) - == (size_t)-1) - { - char reason[128]; - int errpos; - - if (errno == E2BIG) { - RESIZE_OUTBUFFER(estep); - continue; - } - - if (errorcb == ERROR_IGNORE || errorcb == ERROR_REPLACE) { - inplen -= Py_UNICODE_SIZE; - inp += Py_UNICODE_SIZE; - if (errorcb == ERROR_REPLACE) { - if (outlen < 1) - RESIZE_OUTBUFFER(errno == EINVAL ? 1 : estep); - outlen--; - *out++ = REPLACEMENT_CHAR_ENCODE; - } - if (errno == EINVAL) break; - else continue; - } - - errpos = (int)(inp - inp_top) / Py_UNICODE_SIZE; - sprintf(reason, "Undefined character map from " -#if Py_UNICODE_SIZE == 2 - "\\u%04x" -#elif Py_UNICODE_SIZE == 4 - "\\u%08x" -#endif - , *(Py_UNICODE *)inp); - - if (exceptionobj == NULL) { - if ((exceptionobj = PyUnicodeEncodeError_Create( - self->encoding, input, inputlen, - errpos, errpos + 1, reason)) == NULL) - goto errorexit; - } else { - if (PyUnicodeEncodeError_SetStart(exceptionobj, errpos) != 0) - goto errorexit; - if (PyUnicodeEncodeError_SetEnd(exceptionobj, errpos + 1) != 0) - goto errorexit; - if (PyUnicodeEncodeError_SetReason(exceptionobj, reason) != 0) - goto errorexit; - } - - if (errorcb == ERROR_STRICT) { - PyCodec_StrictErrors(exceptionobj); - goto errorexit; - } else { - PyObject *argsobj, *retobj, *retuni; - long newpos; - - argsobj = PyTuple_New(1); - if (argsobj == NULL) - goto errorexit; - PyTuple_SET_ITEM(argsobj, 0, exceptionobj); - Py_INCREF(exceptionobj); - retobj = PyObject_CallObject(errorcb, argsobj); - Py_DECREF(argsobj); - if (retobj == NULL) - goto errorexit; - - if (!PyTuple_Check(retobj) || PyTuple_GET_SIZE(retobj) != 2 || - !PyUnicode_Check((retuni = PyTuple_GET_ITEM(retobj, 0))) || - !PyInt_Check(PyTuple_GET_ITEM(retobj, 1))) { - Py_DECREF(retobj); - PyErr_SetString(PyExc_ValueError, "encoding error handler " - "must return (unicode, int) tuple"); - goto errorexit; - } - if (PyUnicode_GET_SIZE(retuni) > 0) { -#define errorexit errorexit_cbpad - PyObject *retstr = NULL; - int retstrsize; - - retstr = PyUnicode_AsEncodedString( - retuni, self->encoding, NULL); - if (retstr == NULL || !PyString_Check(retstr)) - goto errorexit; - - retstrsize = PyString_GET_SIZE(retstr); - if (outlen < retstrsize) - RESIZE_OUTBUFFER(errno == EINVAL || retstrsize > estep - ? retstrsize - outlen : estep); - - memcpy(out, PyString_AS_STRING(retstr), retstrsize); - out += retstrsize; - outlen -= retstrsize; -#undef errorexit - if (0) { -errorexit_cbpad: Py_XDECREF(retobj); - Py_XDECREF(retstr); - goto errorexit; - } - Py_DECREF(retstr); - } - - newpos = PyInt_AS_LONG(PyTuple_GET_ITEM(retobj, 1)); - Py_DECREF(retobj); - - if (newpos < 0) - newpos = inputlen + newpos; - if (newpos < 0 || newpos > inputlen) { - PyErr_Format(PyExc_IndexError, - "position %ld from error handler out of bounds", - newpos); - goto errorexit; - } - if (newpos == inputlen) - break; - inp = inp_top + Py_UNICODE_SIZE * newpos; - inplen = inplen_total - Py_UNICODE_SIZE * newpos; - } - } else - break; - } -#undef RESIZE_OUTBUFFER - - { - PyObject *rettup; - int finalsize; - - finalsize = (int)(out - out_top); - - if (finalsize != outlen_total) { - if (_PyString_Resize(&outputobj, finalsize) == -1) - goto errorexit; - } - - if (errorcb > ERROR_MAX) { - Py_DECREF(errorcb); - } - Py_XDECREF(exceptionobj); - - rettup = PyTuple_New(2); - if (rettup == NULL) { - Py_DECREF(outputobj); - if (byteswap) - PyMem_Free(swappedinput); - return NULL; - } - PyTuple_SET_ITEM(rettup, 0, outputobj); - PyTuple_SET_ITEM(rettup, 1, PyInt_FromLong(inputlen)); - return rettup; - } - -errorexit: - Py_XDECREF(outputobj); - if (errorcb > ERROR_MAX) { - Py_DECREF(errorcb); - } - Py_XDECREF(exceptionobj); - if (byteswap) - PyMem_Free(swappedinput); - - return NULL; -} - -PyDoc_STRVAR(iconvcodec_decode__doc__, -"I.decode(string, [,errors]) -> (unicodeobject, length consumed)\n\ -\n\ -Decodes `string' using I, an iconvcodec instance. errors may be given\n\ -to set a different error handling scheme. Default is 'strict' meaning\n\ -that encoding errors raise a UnicodeDecodeError. Other possible values\n\ -are 'ignore' and 'replace' as well as any other name registerd with\n\ -codecs.register_error that is able to handle UnicodeDecodeErrors."); - -static PyObject * -iconvcodec_decode(iconvcodecObject *self, PyObject *args, PyObject *kwargs) -{ - static char *kwlist[] = { "input", "errors", NULL }; - char *errors = NULL/*strict*/, *out, *out_top; - const char *inp, *inp_top; - int inplen_int; - size_t inplen, inplen_total, outlen, outlen_total, estep; - PyObject *outputobj = NULL, *errorcb = NULL, - *exceptionobj = NULL; - - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "s#|s:decode", - kwlist, &inp, &inplen_int, &errors)) - return NULL; /* TypeError */ - - errorcb = get_errorcallback(errors); - if (errorcb == NULL) - return NULL; /* LookupError or something else from error handler */ - - inp_top = inp; - inplen_total = inplen = (size_t)inplen_int; - - outputobj = PyUnicode_FromUnicode(NULL, inplen); - if (outputobj == NULL) - return NULL; - outlen_total = outlen = PyUnicode_GET_DATA_SIZE(outputobj); - out = out_top = (char *)PyUnicode_AS_UNICODE(outputobj); - - estep = outlen / 2; - -#define RESIZE_OUTBUFFER(size) { \ - size_t toadd = (size); \ - outlen_total += toadd; \ - outlen += toadd; \ - if (PyUnicode_Resize(&outputobj, outlen_total/Py_UNICODE_SIZE) == -1) \ - goto errorexit; \ - out = (char *)PyUnicode_AS_UNICODE(outputobj) + (out - out_top); \ - out_top = (char *)PyUnicode_AS_UNICODE(outputobj); \ -} - while (inplen > 0) { - char *oldout = out; - size_t res = iconv(self->dechdl, (char**)&inp, &inplen, &out, &outlen); - - if (byteswap) { - while (oldout < out) - { - char c0 = oldout[0]; -#if Py_UNICODE_SIZE == 2 - oldout[0] = oldout[1]; - oldout[1] = c0; -#else - char c1 = oldout[1]; - oldout[0] = oldout[3]; - oldout[1] = oldout[2]; - oldout[2] = c1; - oldout[3] = c0; -#endif - oldout += sizeof(Py_UNICODE); - } - } - if (res == (size_t)-1) { - char reason[128], *reasonpos = (char *)reason; - int errpos; - - if (errno == E2BIG) { - RESIZE_OUTBUFFER(estep); - continue; - } - - if (errorcb == ERROR_IGNORE || errorcb == ERROR_REPLACE) { - inplen--; inp++; - if (errorcb == ERROR_REPLACE) { - Py_UNICODE *replp; - - if (outlen < Py_UNICODE_SIZE) - RESIZE_OUTBUFFER( - errno == EINVAL || Py_UNICODE_SIZE > estep - ? Py_UNICODE_SIZE : estep); - - /* some compilers hate casted lvalue */ - replp = (Py_UNICODE *)out; - assert((long)replp % Py_UNICODE_SIZE == 0);/* aligned? */ - *replp = REPLACEMENT_CHAR_DECODE; - - out += Py_UNICODE_SIZE; - outlen -= Py_UNICODE_SIZE; - } - if (errno == EINVAL) break; - else continue; - } - - errpos = (int)(inp - inp_top); - reasonpos += sprintf(reason, "Invalid multibyte sequence \\x%02x", - (unsigned char)*inp); - if (inplen > 1) { - reasonpos += sprintf(reasonpos, - "\\x%02x", (unsigned char)*(inp+1)); - if (inplen > 2) - sprintf(reasonpos, "\\x%02x", (unsigned char)*(inp+2)); - } - - if (exceptionobj == NULL) { - exceptionobj = PyUnicodeDecodeError_Create( - self->encoding, inp_top, inplen_total, - errpos, errpos + 1, reason); - if (exceptionobj == NULL) - goto errorexit; - } else { - if (PyUnicodeDecodeError_SetStart(exceptionobj, errpos) != 0) - goto errorexit; - if (PyUnicodeDecodeError_SetEnd(exceptionobj, errpos + 1) != 0) - goto errorexit; - if (PyUnicodeDecodeError_SetReason(exceptionobj, reason) != 0) - goto errorexit; - } - - if (errorcb == ERROR_STRICT) { - PyCodec_StrictErrors(exceptionobj); - goto errorexit; - } else { - PyObject *argsobj, *retobj, *retuni; - long newpos; - - argsobj = PyTuple_New(1); - if (argsobj == NULL) - goto errorexit; - PyTuple_SET_ITEM(argsobj, 0, exceptionobj); - Py_INCREF(exceptionobj); - retobj = PyObject_CallObject(errorcb, argsobj); - Py_DECREF(argsobj); - if (retobj == NULL) - goto errorexit; - - if (!PyTuple_Check(retobj) || PyTuple_GET_SIZE(retobj) != 2 || - !PyUnicode_Check((retuni = PyTuple_GET_ITEM(retobj, 0))) || - !PyInt_Check(PyTuple_GET_ITEM(retobj, 1))) { - Py_DECREF(retobj); - PyErr_SetString(PyExc_ValueError, "decoding error handler " - "must return (unicode, int) tuple"); - goto errorexit; - } - if (PyUnicode_GET_SIZE(retuni) > 0) { -#define errorexit errorexit_cbpad - size_t retunisize; - - retunisize = PyUnicode_GET_DATA_SIZE(retuni); - if (outlen < retunisize) - RESIZE_OUTBUFFER(errno == EINVAL || retunisize > estep - ? retunisize - outlen : estep); - - memcpy(out, PyUnicode_AS_DATA(retuni), retunisize); - out += retunisize; - outlen -= retunisize; -#undef errorexit - if (0) { -errorexit_cbpad: Py_DECREF(retobj); - goto errorexit; - } - } - - newpos = PyInt_AS_LONG(PyTuple_GET_ITEM(retobj, 1)); - Py_DECREF(retobj); - - if (newpos < 0) - newpos = inplen_total + newpos; - if (newpos < 0 || newpos > inplen_total) { - PyErr_Format(PyExc_IndexError, - "position %ld from error handler out of bounds", - newpos); - goto errorexit; - } - if (newpos == inplen_total) - break; - inp = inp_top + newpos; - inplen = inplen_total - newpos; - } - } else - break; - } -#undef RESIZE_OUTBUFFER - - { - PyObject *rettup; - int finalsize; - - finalsize = (int)(out - out_top); - if (finalsize != outlen_total) { - if (PyUnicode_Resize(&outputobj, finalsize / Py_UNICODE_SIZE) - == -1) - goto errorexit; - } - - if (errorcb > ERROR_MAX) { - Py_DECREF(errorcb); - } - Py_XDECREF(exceptionobj); - - rettup = PyTuple_New(2); - if (rettup == NULL) { - Py_DECREF(outputobj); - return NULL; - } - PyTuple_SET_ITEM(rettup, 0, outputobj); - PyTuple_SET_ITEM(rettup, 1, PyInt_FromLong(inplen_total)); - return rettup; - } - -errorexit: - Py_XDECREF(outputobj); - if (errorcb > ERROR_MAX) { - Py_DECREF(errorcb); - } - Py_XDECREF(exceptionobj); - - return NULL; -} - -static struct PyMethodDef iconvcodec_methods[] = { - {"encode", (PyCFunction)iconvcodec_encode, - METH_VARARGS | METH_KEYWORDS, - iconvcodec_encode__doc__}, - {"decode", (PyCFunction)iconvcodec_decode, - METH_VARARGS | METH_KEYWORDS, - iconvcodec_decode__doc__}, - {NULL, NULL}, -}; - -static PyObject * -iconvcodec_new(PyTypeObject *type, PyObject *args, PyObject *kwargs) -{ - PyObject *encobj = NULL; - iconvcodecObject *new = NULL; - - new = (iconvcodecObject *)type->tp_alloc(type, 0); - if (new == NULL) - return NULL; - - new->encoding = NULL; - new->enchdl = new->dechdl = (iconv_t)(-1); - - encobj = PyObject_GetAttrString((PyObject *)new, "encoding"); - if (encobj == NULL) { - PyErr_Clear(); - new->encoding = PyMem_Malloc(sizeof(DEFAULT_ENCODING)); - strcpy(new->encoding, DEFAULT_ENCODING); - } else if (!PyString_Check(encobj)) { - Py_DECREF(encobj); - PyErr_SetString(PyExc_TypeError, - "`encoding' attribute must be a string."); - goto errorexit; - } else { - new->encoding = PyMem_Malloc(PyString_GET_SIZE(encobj) + 1); - strcpy(new->encoding, PyString_AS_STRING(encobj)); - Py_DECREF(encobj); - } - - new->dechdl = iconv_open(UNICODE_ENCODING, new->encoding); - if (new->dechdl == (iconv_t)(-1)) { - PyErr_SetString(PyExc_ValueError, "unsupported decoding"); - goto errorexit; - } - - new->enchdl = iconv_open(new->encoding, UNICODE_ENCODING); - if (new->enchdl == (iconv_t)(-1)) { - PyErr_SetString(PyExc_ValueError, "unsupported encoding"); - iconv_close(new->dechdl); - new->dechdl = (iconv_t)(-1); - goto errorexit; - } - - return (PyObject *)new; - -errorexit: - Py_XDECREF(new); - - return NULL; -} - -static void -iconvcodec_dealloc(iconvcodecObject *self) -{ - if (self->enchdl != (iconv_t)-1) - iconv_close(self->enchdl); - if (self->dechdl != (iconv_t)-1) - iconv_close(self->dechdl); - if (self->encoding != NULL) - PyMem_Free(self->encoding); - - self->ob_type->tp_free((PyObject *)self); -} - -static PyObject * -iconvcodec_repr(PyObject *self) -{ - return PyString_FromFormat("<iconvcodec encoding='%s'>", - ((iconvcodecObject *)self)->encoding); -} - -static PyTypeObject iconvcodec_Type = { - PyObject_HEAD_INIT(NULL) - 0, /* Number of items for varobject */ - "iconvcodec", /* Name of this type */ - sizeof(iconvcodecObject), /* Basic object size */ - 0, /* Item size for varobject */ - (destructor)iconvcodec_dealloc, /* tp_dealloc */ - 0, /* tp_print */ - 0, /* tp_getattr */ - 0, /* tp_setattr */ - 0, /* tp_compare */ - iconvcodec_repr, /* tp_repr */ - 0, /* tp_as_number */ - 0, /* tp_as_sequence */ - 0, /* tp_as_mapping */ - 0, /* tp_hash */ - 0, /* tp_call */ - 0, /* tp_str */ - PyObject_GenericGetAttr, /* tp_getattro */ - 0, /* tp_setattro */ - 0, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - iconvcodec_doc, /* tp_doc */ - 0, /* tp_traverse */ - 0, /* tp_clear */ - 0, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - 0, /* tp_iter */ - 0, /* tp_iterext */ - iconvcodec_methods, /* tp_methods */ - 0, /* tp_members */ - 0, /* tp_getset */ - 0, /* tp_base */ - 0, /* tp_dict */ - 0, /* tp_descr_get */ - 0, /* tp_descr_set */ - 0, /* tp_dictoffset */ - 0, /* tp_init */ - PyType_GenericAlloc, /* tp_alloc */ - iconvcodec_new, /* tp_new */ - PyObject_Del, /* tp_free */ -}; - -static struct PyMethodDef _iconv_codec_methods[] = { - {NULL, NULL}, -}; - -void -init_iconv_codec(void) -{ - PyObject *m; - - char in = '0'; - char *inptr = ∈ - size_t insize = 1; - Py_UNICODE out = 0; - char *outptr = (char *)&out; - size_t outsize = sizeof(out); - size_t res; - - iconv_t hdl = iconv_open(UNICODE_ENCODING, "ISO-8859-1"); - - if (hdl == (iconv_t)-1) { - PyErr_SetString(PyExc_RuntimeError, - "can't initialize the _iconv_codec module: iconv_open() failed"); - return; - } - - res = iconv(hdl, &inptr, &insize, &outptr, &outsize); - if (res == (size_t)-1) { - PyErr_SetString(PyExc_RuntimeError, - "can't initialize the _iconv_codec module: iconv() failed"); - return; - } - - /* Check whether conv() returned native endianess or not for the chosen - encoding */ - if (out == 0x30) - byteswap = 0; -#if Py_UNICODE_SIZE == 2 - else if (out == 0x3000) -#else - else if (out == 0x30000000) -#endif - byteswap = 1; - else { - iconv_close(hdl); - PyErr_SetString(PyExc_RuntimeError, - "can't initialize the _iconv_codec module: mixed endianess"); - return; - } - iconv_close(hdl); - - iconvcodec_Type.ob_type = &PyType_Type; - m = Py_InitModule("_iconv_codec", _iconv_codec_methods); - - PyModule_AddStringConstant(m, "__version__", (char*)__version__); - Py_INCREF(&iconvcodec_Type); - PyModule_AddObject(m, "iconvcodec", (PyObject *)(&iconvcodec_Type)); - PyModule_AddStringConstant(m, "internal_encoding", UNICODE_ENCODING); - - if (PyErr_Occurred()) - PyErr_SetString(PyExc_RuntimeError, - "can't initialize the _iconv_codec module"); -} - -/* - * ex: ts=8 sts=4 et - * $Id$ - */ @@ -622,24 +622,6 @@ class PyBuildExt(build_ext): exts.append( Extension('nis', ['nismodule.c'], libraries = libs) ) - # Hye-Shik Chang's iconv_codec C interface - iconv_incs = find_file('iconv.h', inc_dirs, - ['/usr/local/include', '/usr/pkg/include']) - iconv_libs = find_library_file(self.compiler, 'iconv', lib_dirs, - ['/usr/local/lib', '/usr/pkg/lib']) - - if platform not in ['darwin'] and iconv_incs is not None: - if iconv_libs is not None: - iconv_libraries = ['iconv'] - else: - iconv_libraries = [] # in libc - - exts.append( Extension('_iconv_codec', - ['_iconv_codec.c'], - include_dirs = iconv_incs, - library_dirs = iconv_libs, - libraries = iconv_libraries), ) - # Curses support, requring the System V version of curses, often # provided by the ncurses library. if platform == 'sunos4': |