#include <getopt.h>
#include <unistd.h>
#include <htslib/sam.h>
static void print_usage(FILE *fp)
{
fprintf(fp, "Usage: rem_header infile header [id]\n\
Removes header line of given type and id\n");
return;
}
int main(int argc, char *argv[])
{
const char *inname = NULL, *header = NULL, *idval = NULL;
char *id = NULL;
int ret = EXIT_FAILURE;
samFile *infile = NULL, *outfile = NULL;
sam_hdr_t *in_samhdr = NULL;
if (argc <3 || argc > 4) {
print_usage(stderr);
goto end;
}
inname = argv[1];
header = argv[2];
if (argc == 4) {
idval = argv[3];
}
if (header[0] == 'H' && header[1] == 'D') {
id = NULL;
}
else if (header[0] == 'S' && header[1] == 'Q') {
id = "SN";
}
else if (header[0] == 'R' && header[1] == 'G') {
id = "ID";
}
else if (header[0] == 'P' && header[1] == 'G') {
id = "ID";
}
else if (header[0] == 'C' && header[1] == 'O') {
id = "";
}
else {
printf("Invalid header type\n");
goto end;
}
if (!(infile = sam_open(inname, "r"))) {
printf("Could not open %s\n", inname);
goto end;
}
if (!(outfile = sam_open("-", "w"))) { printf("Could not open stdout\n");
goto end;
}
if (!(in_samhdr = sam_hdr_read(infile))) {
printf("Failed to read header from file!\n");
goto end;
}
if (idval) {
if (sam_hdr_remove_line_id(in_samhdr, header, id, idval)) {
printf("Failed to remove header line\n");
goto end;
}
}
else {
if (sam_hdr_remove_lines(in_samhdr, header, id, NULL)) {
printf("Failed to remove header line\n");
goto end;
}
}
if (sam_hdr_write(outfile, in_samhdr) < 0) {
printf("Failed to write output\n");
goto end;
}
ret = EXIT_SUCCESS;
end:
if (in_samhdr) {
sam_hdr_destroy(in_samhdr);
}
if (infile) {
sam_close(infile);
}
if (outfile) {
sam_close(outfile);
}
return ret;
}