diff options
author | Matt Wilson <msw@redhat.com> | 2002-01-29 23:05:13 +0000 |
---|---|---|
committer | Matt Wilson <msw@redhat.com> | 2002-01-29 23:05:13 +0000 |
commit | d01a140c03718928e7d4ac33a2ba471d9d6fdb71 (patch) | |
tree | f535f27ae9b4bc580cee46758b5b97cb9df02084 /iconvmodule | |
parent | 6c3a88b317773f3f29a92e10b154d85c033e8a7a (diff) | |
download | anaconda-d01a140c03718928e7d4ac33a2ba471d9d6fdb71.tar.gz anaconda-d01a140c03718928e7d4ac33a2ba471d9d6fdb71.tar.xz anaconda-d01a140c03718928e7d4ac33a2ba471d9d6fdb71.zip |
i18n almost works again. Small tweaks left to do
Diffstat (limited to 'iconvmodule')
-rw-r--r-- | iconvmodule/iconvcodec.py | 2 | ||||
-rw-r--r-- | iconvmodule/iconvmodule.c | 264 | ||||
-rw-r--r-- | iconvmodule/test_iconv.py | 23 |
3 files changed, 148 insertions, 141 deletions
diff --git a/iconvmodule/iconvcodec.py b/iconvmodule/iconvcodec.py index a887b587e..3dbcf45ea 100644 --- a/iconvmodule/iconvcodec.py +++ b/iconvmodule/iconvcodec.py @@ -1,3 +1,5 @@ +raise RuntimeError, "Don't use me right now!" + import sys, iconv, codecs, errno # First we need to find out what the Unicode code set name is diff --git a/iconvmodule/iconvmodule.c b/iconvmodule/iconvmodule.c index 6841bc85b..31b4d20ed 100644 --- a/iconvmodule/iconvmodule.c +++ b/iconvmodule/iconvmodule.c @@ -2,8 +2,8 @@ #include <Python.h> typedef struct { - PyObject_HEAD - iconv_t handle; + PyObject_HEAD + iconv_t handle; } IconvObject; static PyObject *error; @@ -17,174 +17,162 @@ static char iconv_open__doc__[]= static PyObject* py_iconv_open(PyObject* unused, PyObject* args) { - char *tocode, *fromcode; - iconv_t result; - IconvObject *self; - if (!PyArg_ParseTuple(args, "ss", &tocode, &fromcode)) - return NULL; - result = iconv_open(tocode, fromcode); - if (result == (iconv_t)(-1)){ - PyErr_SetFromErrno(PyExc_ValueError); - return NULL; - } - self = PyObject_New(IconvObject, &Iconv_Type); - if (self == NULL){ - iconv_close(result); - return NULL; - } - self->handle = result; - return (PyObject*)self; + char *tocode, *fromcode; + iconv_t result; + IconvObject *self; + + if (!PyArg_ParseTuple(args, "ss", &tocode, &fromcode)) + return NULL; + + result = iconv_open(tocode, fromcode); + if (result == (iconv_t)(-1)) { + PyErr_SetFromErrno(PyExc_ValueError); + return NULL; + } + self = PyObject_New(IconvObject, &Iconv_Type); + if (self == NULL) { + iconv_close(result); + return NULL; + } + self->handle = result; + return (PyObject*) self; } static void Iconv_dealloc(IconvObject *self) { - iconv_close(self->handle); - PyObject_Del(self); + iconv_close(self->handle); + PyObject_Del(self); } -static char Iconv_iconv__doc__[]= -"iconv(in[, outlen[, return_unicode[, count_only]]]) -> out\n" -"Convert in to out. outlen is the size of the output buffer;\n" -"it defaults to len(in)."; - static PyObject* Iconv_iconv(IconvObject *self, PyObject *args, PyObject* kwargs) { - PyObject *inbuf_obj; - const char *inbuf; - char *outbuf; - size_t inbuf_size, outbuf_size, iresult; - int inbuf_size_int, outbuf_size_int = -1; - int return_unicode = 0, count_only = 0; - PyObject *result; - static char *kwarg_names[]={ - "s", - "outlen", - "return_unicode", - "count_only", - NULL - }; - if (!PyArg_ParseTupleAndKeywords(args, kwargs, - "O|iii:iconv", kwarg_names, - &inbuf_obj, &outbuf_size_int, - &return_unicode, &count_only)) - return NULL; - - if (inbuf_obj == Py_None){ - /* None means to clear the iconv object */ - inbuf = NULL; - inbuf_size_int = 0; - }else if (inbuf_obj->ob_type->tp_as_buffer){ - if (PyObject_AsReadBuffer(inbuf_obj, (const void**)&inbuf, - &inbuf_size_int) == -1) - return NULL; - }else{ - PyErr_SetString(PyExc_TypeError, - "iconv expects string as first argument"); + PyObject *inbuf_obj; + const char *inbuf, *inptr; + char *outbuf, *outptr; + size_t inleft, outleft, result; + PyObject *ret; + static char *kwarg_names[] = { "in", NULL }; + + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O:iconv", kwarg_names, + &inbuf_obj)) + return NULL; + + if (inbuf_obj->ob_type->tp_as_buffer) { + if (PyObject_AsReadBuffer(inbuf_obj, (const void**) &inbuf, + &inleft) == -1) + return NULL; + inptr = inbuf; + } else { + PyErr_SetString(PyExc_TypeError, + "iconv expects string as first argument"); + return NULL; + } + + /* begin with the same amount of space as the input */ + outptr = outbuf = malloc(inleft); + outleft = inleft; + + /* Perform the conversion. */ + do { + result = iconv(self->handle, (char **) &inptr, &inleft, &outptr, &outleft); + if (result == (size_t) -1) { + if (errno == E2BIG) { + /* we ran out of space in outbuf, it needs to be bigger */ + char *newbuf; + /* a guess at how much more we need */ + size_t curpos, extra = inleft * 2; + + curpos = outptr - outbuf; + newbuf = realloc(outbuf, outptr - outbuf + extra); + if (newbuf == NULL) { + free(outbuf); + /* XXX set exception */ + return NULL; + } + outbuf = newbuf; + outptr = outbuf + curpos; + + /* now we have more space to convert into */ + outleft += extra; + } else { + /* if we managed to convert everything up to the last byte, + it was probably a NULL terminated string (you can't convert + the NULL) */ + if (inleft == 0) + break; + PyErr_SetFromErrno(PyExc_SystemError); + free(outbuf); return NULL; + } } - /* If no result size estimate was given, estimate that the result - string is the same size as the input string. */ - if (outbuf_size_int == -1) - outbuf_size_int = inbuf_size_int; - inbuf_size = inbuf_size_int; - if (count_only){ - result = NULL; - outbuf = NULL; - outbuf_size = outbuf_size_int; - }else if(return_unicode){ - /* Allocate the result string. */ - result = PyUnicode_FromUnicode(NULL, outbuf_size_int); - outbuf = (char*)PyUnicode_AS_UNICODE(result); - outbuf_size = outbuf_size_int*2; - }else{ - /* Allocate the result string. */ - result = PyString_FromStringAndSize(NULL, outbuf_size_int); - if (!result) - return NULL; - outbuf = PyString_AS_STRING(result); - outbuf_size = outbuf_size_int; - } - /* Perform the conversion. */ - iresult = iconv(self->handle, &inbuf, &inbuf_size, &outbuf, &outbuf_size); - if (count_only){ - result = PyInt_FromLong(outbuf_size_int-outbuf_size); - }else if (return_unicode) { - /* If the conversion was successful, the result string may be - larger than necessary; outbuf_size will present the extra - bytes. */ - PyUnicode_Resize(&result, outbuf_size_int-outbuf_size/2); - }else{ - _PyString_Resize(&result, outbuf_size_int-outbuf_size); - } + } while (inleft > 0); - if (iresult == -1){ - PyObject *exc; - exc = PyObject_CallFunction(error,"siiO", - strerror(errno),errno, - inbuf_size_int - inbuf_size, - result); - Py_DECREF(result); - PyErr_SetObject(error,exc); - return NULL; - } - return result; + ret = PyString_FromStringAndSize(outbuf, outptr - outbuf); + free(outbuf); + + return ret; } +static char Iconv_iconv__doc__[] = +"iconv(in) -> out\n" +"Convert in to out."; + + static PyMethodDef Iconv_methods[] = { - {"iconv", (PyCFunction)Iconv_iconv, - METH_KEYWORDS|METH_VARARGS, Iconv_iconv__doc__}, - {NULL, NULL} /* sentinel */ + { "iconv", (PyCFunction)Iconv_iconv, + METH_KEYWORDS | METH_VARARGS, Iconv_iconv__doc__}, + { NULL, NULL } }; static PyObject * Iconv_getattr(PyObject *self, char *name) { - return Py_FindMethod(Iconv_methods, self, name); + return Py_FindMethod(Iconv_methods, self, name); } statichere PyTypeObject Iconv_Type = { - PyObject_HEAD_INIT(NULL) - 0, /*ob_size*/ - "Iconv", /*tp_name*/ - sizeof(IconvObject), /*tp_basicsize*/ - 0, /*tp_itemsize*/ - /* methods */ - (destructor)Iconv_dealloc, /*tp_dealloc*/ - 0, /*tp_print*/ - (getattrfunc)Iconv_getattr, /*tp_getattr*/ - 0, /*tp_setattr*/ - 0, /*tp_compare*/ - 0, /*tp_repr*/ - 0, /*tp_as_number*/ - 0, /*tp_as_sequence*/ - 0, /*tp_as_mapping*/ - 0, /*tp_hash*/ + PyObject_HEAD_INIT(NULL) + 0, /*ob_size*/ + "Iconv", /*tp_name*/ + sizeof(IconvObject), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + /* methods */ + (destructor)Iconv_dealloc, /*tp_dealloc*/ + 0, /*tp_print*/ + (getattrfunc)Iconv_getattr, /*tp_getattr*/ + 0, /*tp_setattr*/ + 0, /*tp_compare*/ + 0, /*tp_repr*/ + 0, /*tp_as_number*/ + 0, /*tp_as_sequence*/ + 0, /*tp_as_mapping*/ + 0, /*tp_hash*/ }; static PyMethodDef iconv_methods[] = { - {"open", py_iconv_open, - METH_VARARGS, iconv_open__doc__}, - {NULL, NULL} /* sentinel */ + { "open", py_iconv_open, + METH_VARARGS, iconv_open__doc__}, + { NULL, NULL} /* sentinel */ }; -static char __doc__[]= +static char __doc__[] = "The iconv module provides an interface to the iconv library."; DL_EXPORT(void) initiconv(void) { - PyObject *m, *d; - - Iconv_Type.ob_type = &PyType_Type; - - /* Create the module and add the functions */ - m = Py_InitModule4("iconv", iconv_methods, __doc__, - NULL, PYTHON_API_VERSION); - - /* Add some symbolic constants to the module */ - d = PyModule_GetDict(m); - error = PyErr_NewException("iconv.error", PyExc_ValueError, NULL); - PyDict_SetItemString(d, "error", error); + PyObject *m, *d; + + Iconv_Type.ob_type = &PyType_Type; + + /* Create the module and add the functions */ + m = Py_InitModule4("iconv", iconv_methods, __doc__, + NULL, PYTHON_API_VERSION); + + /* Add some symbolic constants to the module */ + d = PyModule_GetDict(m); + error = PyErr_NewException("iconv.error", PyExc_ValueError, NULL); + PyDict_SetItemString(d, "error", error); } diff --git a/iconvmodule/test_iconv.py b/iconvmodule/test_iconv.py index d8c6f8325..4180e2743 100644 --- a/iconvmodule/test_iconv.py +++ b/iconvmodule/test_iconv.py @@ -1,8 +1,25 @@ import iconv -s=iconv.open("unicodelittle","iso-8859-1") -r=s.iconv("Hallo",11,return_unicode=1) +s=iconv.open("unicodelittle", "iso-8859-1") +r=s.iconv("Hallo") print repr(r),len(r) +s=iconv.open("utf-8", "iso-8859-1") +r=s.iconv("Hallo") +print repr(r),len(r) +u = r.encode("utf-8") +print u + +s=iconv.open("utf-8", "euc-jp") +r=s.iconv("testビデオカードを検出中test") +print repr(r),len(r) +u = r.decode("utf-8") +print repr(u) + +s=iconv.open("euc-jp", "utf-8") +r=s.iconv(u) +print repr(r), len(r) +print r + s=iconv.open("iso-8859-1","unicodelittle") -r=s.iconv(u"Hallo",110) +r=s.iconv(u"Hallo") print r |