]> granicus.if.org Git - python/commitdiff
Brian Hooper <brian_takashi@hotmail.com>:
authorFred Drake <fdrake@acm.org>
Fri, 28 Apr 2000 14:42:37 +0000 (14:42 +0000)
committerFred Drake <fdrake@acm.org>
Fri, 28 Apr 2000 14:42:37 +0000 (14:42 +0000)
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

index f86ca912d732fbd1553ee069e4f3c2b9fc7731f6..7b402865e2762b2a7625c3c6647db5108ecb046c 100644 (file)
@@ -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(