From 25d34473c3c2429f0bf5c27e147fe57c6a718e99 Mon Sep 17 00:00:00 2001 From: Fred Drake Date: Fri, 28 Apr 2000 14:42:37 +0000 Subject: [PATCH] Brian Hooper : Here's a patch which changes modsupport to add 'u' and 'u#', to support building Unicode objects from a null-terminated Py_UNICODE *, and a Py_UNICODE * with length, respectively. [Conversion from 'U' to 'u' by Fred, based on python-dev comments.] Note that the use of None for NULL values of the Py_UNICODE* value is still in; I'm not sure of the conclusion on that issue. --- Python/modsupport.c | 32 +++++++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/Python/modsupport.c b/Python/modsupport.c index f86ca912d73..7b402865e27 100644 --- a/Python/modsupport.c +++ b/Python/modsupport.c @@ -232,6 +232,15 @@ do_mklist(p_format, p_va, endchar, n) return v; } +static int +_ustrlen(Py_UNICODE *u) +{ + int i = 0; + Py_UNICODE *v = u; + while (*v != 0) { i++; v++; } + return i; +} + static PyObject * do_mktuple(p_format, p_va, endchar, n) char **p_format; @@ -295,7 +304,28 @@ do_mkvalue(p_format, p_va) case 'L': return PyLong_FromLongLong((LONG_LONG)va_arg(*p_va, LONG_LONG)); #endif - + case 'u': + { + PyObject *v; + Py_UNICODE *u = va_arg(*p_va, Py_UNICODE *); + int n; + if (**p_format == '#') { + ++*p_format; + n = va_arg(*p_va, int); + } + else + n = -1; + if (u == NULL) { + v = Py_None; + Py_INCREF(v); + } + else { + if (n < 0) + n = _ustrlen(u); + v = PyUnicode_FromUnicode(u, n); + } + return v; + } case 'f': case 'd': return PyFloat_FromDouble(