# -*- Mode: Python -*- cdef extern from "Python.h": # need to be careful, we can only use functions with # simple/standard refcount behaviors. [e.g., no borrowed refs] object PyString_FromStringAndSize (char * s, int len) int PyList_Size (object) except -1 int PyTuple_Size (object) except -1 object PySequence_GetItem (object, int index) int PySequence_Size (object) except -1 int PyList_Append (object, object) except -1 int PyList_Reverse (object) except -1 int PyString_Size (object) except -1 object PyNumber_Long (object) char * PyString_AsString (object) void * memcpy (void *, void *, int len) cdef object _concat (object l): # concat a sequence of strings # 1: compute length of result cdef int llen, rlen, i, ilen rlen = 0 llen = PySequence_Size (l) for i from 0 <= i < llen: s = PySequence_GetItem (l, i) rlen = rlen + PyString_Size (s) # 2: create result result = PyString_FromStringAndSize (NULL, rlen) cdef char * rbuf rbuf = PyString_AsString (result) # 3: fill result for i from 0 <= i < llen: s = PySequence_GetItem (l, i) ilen = PyString_Size (s) memcpy (rbuf, PyString_AsString (s), ilen) rbuf = rbuf + ilen # 4: return result return result