summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--cython/plist.pyx13
1 files changed, 11 insertions, 2 deletions
diff --git a/cython/plist.pyx b/cython/plist.pyx
index 4eccdb1..95f9be7 100644
--- a/cython/plist.pyx
+++ b/cython/plist.pyx
@@ -2,6 +2,15 @@ cimport cpython
2cimport libc.stdlib 2cimport libc.stdlib
3from libc.stdint cimport * 3from libc.stdint cimport *
4 4
5cdef _from_string_and_size(char *s, size_t length):
6 if PY_MAJOR_VERSION < 3 or s == NULL:
7 return s[:length]
8
9 if s == NULL:
10 return s[:length]
11 else:
12 return s[:length].decode("ascii")
13
5cdef extern from *: 14cdef extern from *:
6 ctypedef enum plist_type: 15 ctypedef enum plist_type:
7 PLIST_BOOLEAN, 16 PLIST_BOOLEAN,
@@ -115,7 +124,7 @@ cdef class Node:
115 plist_to_bin(self._c_node, &out, &length) 124 plist_to_bin(self._c_node, &out, &length)
116 125
117 try: 126 try:
118 return cpython.PyString_FromStringAndSize(out, length) 127 return _from_string_and_size(out, length)
119 finally: 128 finally:
120 if out != NULL: 129 if out != NULL:
121 libc.stdlib.free(out) 130 libc.stdlib.free(out)
@@ -550,7 +559,7 @@ cdef class Data(Node):
550 plist_get_data_val(self._c_node, &val, &length) 559 plist_get_data_val(self._c_node, &val, &length)
551 560
552 try: 561 try:
553 return cpython.PyString_FromStringAndSize(val, length) 562 return _from_string_and_size(val, length)
554 finally: 563 finally:
555 libc.stdlib.free(val) 564 libc.stdlib.free(val)
556 565