from cffi import FFI ffibuilder = FFI() ffibuilder.cdef(""" // @abstract Structure representing an unique alignment and virtual file pointer // @field tid chromosome ID // @field pos 0-based leftmost coordinate // @field vptr virtual pointer typedef struct { uint32_t tid; uint32_t pos; uint64_t vptr; } aln_spec_t; // @abstract Structure representing all alignments by queryname // @field qname queryname (name for the given read) // @field n_alns number of alignments // @field alns array with alignments structures typedef struct { char * qname; uint16_t n_alns; aln_spec_t * alns; } qidx_record_t; typedef enum { QIDX_OK = 0, QIDX_ITER_DONE, QIDX_NO_MEM, QIDX_NO_BAM_HDR, QIDX_BAM_READ_FAILURE, QIDX_REC_ITER_FAILURE, QIDX_NOT_SORTED, QIDX_BUCKET_MAX_SIZE_EXCEEDED, QIDX_MAP_FAIL, QIDX_IO_FAIL, QIDX_FAILED_TO_OPEN_BAMFILE, QIDX_FAILED_TO_OPEN_INDEX_FILE, QIDX_INVALID_VERSION, QIDX_INVALID_MAGIC, } qidx_err_t; bool qidx_errno(qidx_err_t err); char const * qidx_strerr(qidx_err_t err); struct qidx_fp; typedef struct qidx_fp qidx_fp_t; qidx_err_t qidx_open(qidx_fp_t ** fp, int fd); qidx_err_t qidx_create(qidx_fp_t ** fp, int fd, uint32_t _n_buckets, uint32_t max_bucket_size); qidx_err_t qidx_lookup_alnrec(qidx_fp_t * fp, char const * qname, qidx_record_t ** rec); void qidx_free_alnrec(qidx_record_t * rec); qidx_err_t qidx_close(qidx_fp_t * fp); """) ffibuilder.set_source( "pyqidx._qidx", """ #include // the C header of the library """, libraries=['qidx'], extra_link_args=['-Wl,-rpath=/usr/local/lib'], ) # library name, for the linker if __name__ == "__main__": ffibuilder.compile(verbose=True)