# -*-pyrex-*- # # $Id$ # # Generic encoder/decoder # # (c) 2005 Straylight/Edgeware # #----- Licensing notice ----------------------------------------------------- # # This file is part of the Python interface to mLib. # # mLib/Python is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # mLib/Python is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with mLib/Python; if not, write to the Free Software Foundation, # Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #----- External dependencies ------------------------------------------------ cdef extern from 'stddef.h': ctypedef int size_t cdef extern from 'mLib/dstr.h': ctypedef struct dstr: char *buf int len void DCREATE(dstr *d) void dstr_destroy(dstr *d) cdef extern from 'mLib/alloc.h': char *xstrdup(char *p) void xfree(void *p) cdef extern from 'mLib/%PREFIX%.h': ctypedef struct %PREFIX%_ctx: char *indent int maxline void %PREFIX%_init(%PREFIX%_ctx *b) void %PREFIX%_encode(%PREFIX%_ctx *b, void *p, size_t sz, dstr *d) void %PREFIX%_decode(%PREFIX%_ctx *b, void *p, size_t sz, dstr *d) cdef extern from 'Python.h': int PyObject_AsReadBuffer(obj, void **buf, int *len) except -1 object PyString_FromStringAndSize(char *p, int len) cdef class Encode: cdef %PREFIX%_ctx ctx def __new__(me, *hunoz, **hukairz): %PREFIX%_init(&me.ctx) me.ctx.indent = NULL def __init__(me, indent = '\n', maxline = 72): if me.ctx.indent: xfree(me.ctx.indent) me.ctx.indent = xstrdup(indent) me.ctx.maxline = maxline def __dealloc__(me): if me.ctx.indent: xfree(me.ctx.indent) property indent: def __get__(me): return me.ctx.indent def __set__(me, indent): if me.ctx.indent: xfree(me.ctx.indent) me.ctx.indent = xstrdup(indent) property maxline: def __get__(me): return me.ctx.maxline def __set__(me, maxline): me.ctx.maxline = maxline def encode(me, text): cdef void *p cdef int len cdef dstr d DCREATE(&d) try: PyObject_AsReadBuffer(text, &p, &len) %PREFIX%_encode(&me.ctx, p, len, &d) rc = PyString_FromStringAndSize(d.buf, d.len) finally: dstr_destroy(&d) return rc def done(me): cdef dstr d DCREATE(&d) try: %PREFIX%_encode(&me.ctx, NULL, 0, &d) rc = PyString_FromStringAndSize(d.buf, d.len) finally: dstr_destroy(&d) return rc def encode(text, *arg, **kw): e = Encode(*arg, **kw) return e.encode(text) + e.done() cdef class Decode: cdef %PREFIX%_ctx ctx def __new__(me, *hunoz, **hukairz): %PREFIX%_init(&me.ctx) me.ctx.indent = NULL def decode(me, text): cdef void *p cdef int len cdef dstr d DCREATE(&d) try: PyObject_AsReadBuffer(text, &p, &len) %PREFIX%_decode(&me.ctx, p, len, &d) rc = PyString_FromStringAndSize(d.buf, d.len) finally: dstr_destroy(&d) return rc def done(me): cdef dstr d DCREATE(&d) try: %PREFIX%_decode(&me.ctx, NULL, 0, &d) rc = PyString_FromStringAndSize(d.buf, d.len) finally: dstr_destroy(&d) return rc def decode(text, *arg, **kw): d = Decode(*arg, **kw) return e.decode(text) + d.done() #----- That's all, folks ----------------------------------------------------