#include <getopt.h>
#include <unistd.h>
#include <htslib/sam.h>
static void print_usage(FILE *fp)
{
fprintf(fp, "Usage: dump_aux infile\n\
Dump the aux tags from alignments\n");
}
int printauxdata(FILE *fp, char type, int32_t idx, const uint8_t *data)
{
uint32_t auxBcnt = 0;
int i = 0;
char auxBType = 'Z';
switch(type) {
case 'A':
fprintf(fp, "%c", bam_aux2A(data)); break;
case 'c':
fprintf(fp, "%d", (int8_t)(idx > -1 ? bam_auxB2i(data, idx) : bam_aux2i(data))); break;
case 'C':
fprintf(fp, "%u", (uint8_t)(idx > -1 ? bam_auxB2i(data, idx) : bam_aux2i(data))); break;
case 's':
fprintf(fp, "%d", (int16_t)(idx > -1 ? bam_auxB2i(data, idx) : bam_aux2i(data))); break;
case 'S':
fprintf(fp, "%u", (uint16_t)(idx > -1 ? bam_auxB2i(data, idx) : bam_aux2i(data))); break;
case 'i':
fprintf(fp, "%d", (int32_t)(idx > -1 ? bam_auxB2i(data, idx) : bam_aux2i(data))); break;
case 'I':
fprintf(fp, "%u", (uint32_t)(idx > -1 ? bam_auxB2i(data, idx) : bam_aux2i(data))); break;
case 'f':
case 'd':
fprintf(fp, "%g", (float)(idx > -1 ? bam_auxB2f(data, idx) : bam_aux2f(data))); break;
case 'H':
case 'Z':
fprintf(fp, "%s", bam_aux2Z(data)); break;
case 'B': auxBcnt = bam_auxB_len(data); auxBType = bam_aux_type(data + 1); fprintf(fp, "%c", auxBType);
for (i = 0; i < auxBcnt; ++i) { fprintf(fp, ",");
if (printauxdata(fp, auxBType, i, data) == EXIT_FAILURE) {
return EXIT_FAILURE;
}
}
break;
default:
printf("Invalid aux tag?\n");
return EXIT_FAILURE;
break;
}
return EXIT_SUCCESS;
}
int main(int argc, char *argv[])
{
const char *inname = NULL;
int ret = EXIT_FAILURE;
sam_hdr_t *in_samhdr = NULL;
samFile *infile = NULL;
int ret_r = 0;
bam1_t *bamdata = NULL;
uint8_t *data = NULL;
if (argc != 2) {
print_usage(stderr);
goto end;
}
inname = argv[1];
if (!(bamdata = bam_init1())) {
printf("Failed to allocate data memory!\n");
goto end;
}
if (!(infile = sam_open(inname, "r"))) {
printf("Could not open %s\n", inname);
goto end;
}
if (!(in_samhdr = sam_hdr_read(infile))) {
printf("Failed to read header from file!\n");
goto end;
}
while ((ret_r = sam_read1(infile, in_samhdr, bamdata)) >= 0) {
errno = 0;
data = NULL;
data = bam_aux_first(bamdata); while (data) {
printf("%.2s:%c:", bam_aux_tag(data), NULL != strchr("cCsSiI", bam_aux_type(data)) ? 'i' : bam_aux_type(data)); if (printauxdata(stdout, bam_aux_type(data), -1, data) == EXIT_FAILURE) {
printf("Failed to dump aux data\n");
goto end;
}
else {
printf(" ");
}
data = bam_aux_next(bamdata, data); }
if (ENOENT != errno) {
printf("\nFailed to get aux data\n");
goto end;
}
printf("\n");
}
if (ret_r < -1) {
printf("Failed to read data\n");
goto end;
}
ret = EXIT_SUCCESS;
end:
if (in_samhdr) {
sam_hdr_destroy(in_samhdr);
}
if (infile) {
sam_close(infile);
}
if (bamdata) {
bam_destroy1(bamdata);
}
return ret;
}