summaryrefslogtreecommitdiff
path: root/pyqidx_build.py
blob: 1bf8e5833737355232c0876a49df08f1b707c458 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
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 <qidx.h>   // 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)