diff options
Diffstat (limited to 'cython')
| -rw-r--r-- | cython/plist.pxd | 2 | ||||
| -rw-r--r-- | cython/plist.pyx | 75 | 
2 files changed, 76 insertions, 1 deletions
diff --git a/cython/plist.pxd b/cython/plist.pxd index 05f3e16..d7c70bd 100644 --- a/cython/plist.pxd +++ b/cython/plist.pxd @@ -21,7 +21,7 @@ cdef class Integer(Node):  cdef class Key(Node):      cpdef set_value(self, object value) -    cpdef int get_value(self) +    cpdef unicode get_value(self)  cdef class Real(Node):      cpdef set_value(self, object value) diff --git a/cython/plist.pyx b/cython/plist.pyx index 9b7eec9..746db4f 100644 --- a/cython/plist.pyx +++ b/cython/plist.pyx @@ -41,6 +41,10 @@ cdef extern from *:      void plist_get_date_val(plist_t node, int32_t * sec, int32_t * usec)      void plist_set_date_val(plist_t node, int32_t sec, int32_t usec) +    plist_t plist_new_key(char *val) +    void plist_get_key_val(plist_t node, char **val) +    void plist_set_key_val(plist_t node, char *val) +      plist_t plist_new_string(char *val)      void plist_get_string_val(plist_t node, char **val)      void plist_set_string_val(plist_t node, char *val) @@ -272,6 +276,77 @@ cdef Real Real_factory(plist_t c_node, bint managed=True):  from cpython cimport PY_MAJOR_VERSION +cdef class Key(Node): +    def __cinit__(self, object value=None, *args, **kwargs): +        cdef: +            char* c_utf8_data = NULL +            bytes utf8_data +        if value is None: +            raise ValueError("Requires a value") +        else: +            if isinstance(value, unicode): +                utf8_data = value.encode('utf-8') +            elif (PY_MAJOR_VERSION < 3) and isinstance(value, str): +                value.encode('ascii') # trial decode +                utf8_data = value.encode('ascii') +            else: +                raise ValueError("Requires unicode input, got %s" % type(value)) +            c_utf8_data = utf8_data +            self._c_node = plist_new_string("") +            plist_set_type(self._c_node, PLIST_KEY) +            #plist_set_key_val(self._c_node, c_utf8_data) + +    def __repr__(self): +        s = self.get_value() +        return '<Key: %s>' % s.encode('utf-8') + +    def __richcmp__(self, other, op): +        cdef unicode s = self.get_value() +        if op == 0: +            return s < other +        if op == 1: +            return s <= other +        if op == 2: +            return s == other +        if op == 3: +            return s != other +        if op == 4: +            return s > other +        if op == 5: +            return s >= other + +    cpdef set_value(self, object value): +        cdef: +            char* c_utf8_data = NULL +            bytes utf8_data +        if value is None: +            plist_set_key_val(self._c_node, c_utf8_data) +        else: +            if isinstance(value, unicode): +                utf8_data = value.encode('utf-8') +            elif (PY_MAJOR_VERSION < 3) and isinstance(value, str): +                value.encode('ascii') # trial decode +                utf8_data = value.encode('ascii') +            else: +                raise ValueError("Requires unicode input, got %s" % type(value)) +            c_utf8_data = utf8_data +            plist_set_key_val(self._c_node, c_utf8_data) + +    cpdef unicode get_value(self): +        cdef: +            char* c_value = NULL +        plist_get_key_val(self._c_node, &c_value) +        try: +            return cpython.PyUnicode_DecodeUTF8(c_value, len(c_value), 'strict') +        finally: +            libc.stdlib.free(c_value) + +cdef Key Key_factory(plist_t c_node, bint managed=True): +    cdef Key instance = Key.__new__(Key) +    instance._c_managed = managed +    instance._c_node = c_node +    return instance +  cdef class String(Node):      def __cinit__(self, object value=None, *args, **kwargs):          cdef:  | 
