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