File samtools-0.1.19-faidx_fetch_seq2.patch of Package samtools-legacy

diff -up samtools-0.1.19/faidx.c.seq2 samtools-0.1.19/faidx.c
--- samtools-0.1.19/faidx.c.seq2	2014-06-09 14:23:14.178251752 -0400
+++ samtools-0.1.19/faidx.c	2014-06-09 14:23:48.022028908 -0400
@@ -432,6 +432,45 @@ char *faidx_fetch_seq(const faidx_t *fai
 	return seq;
 }
 
+/*
+ * HP: Like faidx_fetch_seq() but:
+ * HP:   1) writes the incoming sequence to user-supplied 'out' buffer,
+ * HP:   2) doesn't write the terminating null byte ('\0'),
+ * HP:   3) properly handles 0-length sequences,
+ * HP:   4) returns the number of bytes written; -1 on failure.
+ */
+int faidx_fetch_seq2(const faidx_t *fai,			/* HP */
+		     const char *c_name, int p_beg_i, int p_end_i, /* HP */
+		     char *out)					/* HP */
+{								/* HP */
+	int l;							/* HP */
+	char c;							/* HP */
+	khiter_t iter;						/* HP */
+	faidx1_t val;						/* HP */
+	int64_t offset;						/* HP */
+								/* HP */
+	// Adjust position					/* HP */
+	iter = kh_get(s, fai->hash, c_name);			/* HP */
+	if(iter == kh_end(fai->hash)) return -1;		/* HP */
+	val = kh_value(fai->hash, iter);			/* HP */
+	if(p_end_i < p_beg_i - 1) p_end_i = p_beg_i - 1;	/* HP */
+	if(p_beg_i < 0) p_beg_i = 0;				/* HP */
+	else if(val.len <= p_beg_i) p_beg_i = val.len - 1;	/* HP */
+	if(p_end_i < 0) p_end_i = 0;				/* HP */
+	else if(val.len <= p_end_i) p_end_i = val.len - 1;	/* HP */
+								/* HP */
+	// Now retrieve the sequence				/* HP */
+	l = 0;							/* HP */
+	offset = (int64_t) val.offset +				/* HP */
+		 p_beg_i / val.line_blen * val.line_len +	/* HP */
+		 p_beg_i % val.line_blen;			/* HP */
+	razf_seek(fai->rz, offset, SEEK_SET);			/* HP */
+	while (razf_read(fai->rz, &c, 1) == 1 &&		/* HP */
+	       l < p_end_i - p_beg_i + 1)			/* HP */
+		if (isgraph(c)) out[l++] = c;			/* HP */
+	return l;						/* HP */
+}								/* HP */
+
 #ifdef FAIDX_MAIN
 int main(int argc, char *argv[]) { return faidx_main(argc, argv); }
 #endif
openSUSE Build Service is sponsored by