#include <getopt.h>
#include <unistd.h>
#include <htslib/sam.h>
static void print_usage(FILE *fp)
{
fprintf(fp, "Usage: split infile outdir\n\
Splits the input file alignments to read1 and read2 and saves as 1.sam and 2.bam in given directory\n\
Shows file type selection through name and format api\n");
return;
}
int main(int argc, char *argv[])
{
const char *inname = NULL, *outdir = NULL;
char *file1 = NULL, *file2 = NULL, mode1[5] = "w", mode2[5] = "w";
int c = 0, ret = EXIT_FAILURE, size = 0;
samFile *infile = NULL, *outfile1 = NULL, *outfile2 = NULL;
sam_hdr_t *in_samhdr = NULL;
bam1_t *bamdata = NULL;
if (argc != 3) {
print_usage(stdout);
goto end;
}
inname = argv[1];
outdir = argv[2];
size = sizeof(char) * (strlen(outdir) + sizeof("/1.sam.gz") + 1); file1 = malloc(size);
file2 = malloc(size);
if (!file1 || !file2) {
printf("Failed to set output path\n");
goto end;
}
snprintf(file1, size, "%s/1.sam.gz", outdir); snprintf(file2, size, "%s/2.sam", outdir); if (!(bamdata = bam_init1())) {
printf("Failed to initialize bamdata\n");
goto end;
}
if ((sam_open_mode(mode1+1, file1, NULL) == -1) || (sam_open_mode(mode2+1, file2, "sam.gz") == -1)) {
printf("Failed to set open mode\n");
goto end;
}
if (!(infile = sam_open(inname, "r"))) {
printf("Could not open %s\n", inname);
goto end;
}
outfile1 = sam_open(file1, mode1); outfile2 = sam_open_format(file2, mode2, NULL); if (!outfile1 || !outfile2) {
printf("Could not open output file\n");
goto end;
}
if (!(in_samhdr = sam_hdr_read(infile))) {
printf("Failed to read header from file!\n");
goto end;
}
if ((sam_hdr_write(outfile1, in_samhdr) == -1) || (sam_hdr_write(outfile2, in_samhdr) == -1)) {
printf("Failed to write header\n");
goto end;
}
while ((c = sam_read1(infile, in_samhdr, bamdata)) >= 0) {
if (bamdata->core.flag & BAM_FREAD1) {
if (sam_write1(outfile1, in_samhdr, bamdata) < 0) {
printf("Failed to write output data\n");
goto end;
}
}
else if (bamdata->core.flag & BAM_FREAD2) {
if (sam_write1(outfile2, in_samhdr, bamdata) < 0) {
printf("Failed to write output data\n");
goto end;
}
}
}
if (-1 == c) {
ret = EXIT_SUCCESS;
}
else {
printf("Error in reading data\n");
}
end:
if (in_samhdr) {
sam_hdr_destroy(in_samhdr);
}
if (infile) {
sam_close(infile);
}
if (bamdata) {
bam_destroy1(bamdata);
}
if (file1) {
free(file1);
}
if (file2) {
free(file2);
}
if (outfile1) {
sam_close(outfile1);
}
if (outfile2) {
sam_close(outfile2);
}
return ret;
}