@@@ cython and python 3 wip
[mLib-python] / codec.pyx.in
index 3da1b83..4f57935 100644 (file)
@@ -40,59 +40,62 @@ cdef class %CLASS%Encode:
   Obsolete %CLASS% encoder.
   """
   cdef %PREFIX%_ctx ctx
-  def __cinit__(me, *hunoz, **hukairz):
+  def __cinit__(me):
     _%PREFIX%_init(&me.ctx)
     me.ctx.indent = NULL
+  def __dealloc__(me):
+    if me.ctx.indent:
+      xfree(<void *>me.ctx.indent)
   def __init__(me, indent = '\n', maxline = 72):
     if me.ctx.indent:
       xfree(<void *>me.ctx.indent)
-    me.ctx.indent = xstrdup(indent)
+    me.ctx.indent = xstrdup(TEXT_PTR(indent))
     me.ctx.maxline = maxline
-  def __dealloc__(me):
+  @property
+  def indent(me):
+    """E.indent -> INT: indent level for new lines"""
+    return me.ctx.indent
+  @indent.setter
+  def indent(me, indent):
     if me.ctx.indent:
       xfree(<void *>me.ctx.indent)
-  property indent:
-    """E.indent -> INT: indent level for new lines"""
-    def __get__(me):
-      return me.ctx.indent
-    def __set__(me, indent):
-      if me.ctx.indent:
-        xfree(<void *>me.ctx.indent)
-      me.ctx.indent = xstrdup(indent)
-  property maxline:
+    if indent is None:
+      me.ctx.indent = NULL
+    else:
+      me.ctx.indent = xstrdup(TEXT_PTR(indent))
+  @property
+  def maxline(me):
     """E.maxline -> INT: maximum length of line, or 0 to prevent splitting"""
-    def __get__(me):
-      return me.ctx.maxline
-    def __set__(me, maxline):
+    return me.ctx.maxline
+  @maxline.setter
+  def maxline(me, maxline):
       me.ctx.maxline = maxline
-  def encode(me, text):
+  def encode(me, input):
     """E.encode(IN) -> OUT: continue encoding"""
-    cdef void *p
-    cdef Py_ssize_t len
+    cdef const void *p
+    cdef Py_ssize_t sz
     cdef dstr d
     DCREATE(&d)
     try:
-      PyObject_AsReadBuffer(text, <cvp *>&p, &len)
-      _%PREFIX%_encode(&me.ctx, p, len, &d)
-      rc = PyString_FromStringAndSize(d.buf, d.len)
+      PyObject_AsReadBuffer(input, &p, &sz)
+      _%PREFIX%_encode(&me.ctx, p, sz, &d)
+      return TEXT_FROMSTRLEN(d.buf, d.len)
     finally:
       dstr_destroy(&d)
-    return rc
   def done(me):
     """E.done() -> OUT: finish encoding, returning final output"""
     cdef dstr d
     DCREATE(&d)
     try:
       _%PREFIX%_encode(&me.ctx, NULL, 0, &d)
-      rc = PyString_FromStringAndSize(d.buf, d.len)
+      return TEXT_FROMSTRLEN(d.buf, d.len)
     finally:
       dstr_destroy(&d)
-    return rc
 
-def %PREFIX%_encode(text, *arg, **kw):
+def %PREFIX%_encode(input, *arg, **kw):
   """%PREFIX%_encode(IN, [ARGS...]) -> OUT: %CLASS%-encode the string IN"""
   e = %CLASS%Encode(*arg, **kw)
-  return e.encode(text) + e.done()
+  return e.encode(input) + e.done()
 
 cdef class %CLASS%Decode:
   """
@@ -101,36 +104,34 @@ cdef class %CLASS%Decode:
   Obsolete %CLASS% decoder.
   """
   cdef %PREFIX%_ctx ctx
-  def __cinit__(me, *hunoz, **hukairz):
+  def __cinit__(me):
     _%PREFIX%_init(&me.ctx)
     me.ctx.indent = NULL
-  def decode(me, text):
+  def decode(me, input):
     """D.encode(IN) -> OUT: continue decoding"""
-    cdef void *p
-    cdef Py_ssize_t len
+    cdef const char *p
+    cdef Py_ssize_t sz
     cdef dstr d
     DCREATE(&d)
     try:
-      PyObject_AsReadBuffer(text, <cvp *>&p, &len)
-      _%PREFIX%_decode(&me.ctx, p, len, &d)
-      rc = PyString_FromStringAndSize(d.buf, d.len)
+      TEXT_PTRLEN(input, &p, &sz)
+      _%PREFIX%_decode(&me.ctx, p, sz, &d)
+      return BIN_FROMSTRLEN(d.buf, d.len)
     finally:
       dstr_destroy(&d)
-    return rc
   def done(me):
     """D.done() -> OUT: finish decoding, returning final output"""
     cdef dstr d
     DCREATE(&d)
     try:
       _%PREFIX%_decode(&me.ctx, NULL, 0, &d)
-      rc = PyString_FromStringAndSize(d.buf, d.len)
+      return BIN_FROMSTRLEN(d.buf, d.len)
     finally:
       dstr_destroy(&d)
-    return rc
 
-def %PREFIX%_decode(text, *arg, **kw):
+def %PREFIX%_decode(input, *arg, **kw):
   """%PREFIX%_decode(IN) -> OUT: %CLASS%-decode the string IN"""
   d = %CLASS%Decode(*arg, **kw)
-  return d.decode(text) + d.done()
+  return d.decode(input) + d.done()
 
 ###----- That's all, folks --------------------------------------------------