#include "stdio.h"
FILE * pysamerr = NULL;
-FILE * pysam_set_stderr( FILE * f )
+FILE * pysam_set_stderr(int fd)
{
- pysamerr = f;
- return f;
+ if (pysamerr != NULL)
+ fclose(pysamerr);
+ pysamerr = fdopen(fd, "w");
+ return pysamerr;
+}
+
+void pysam_unset_stderr()
+{
+ if (pysamerr != NULL)
+ fclose(pysamerr);
+ pysamerr = fopen("/dev/null", "w");
}
// #######################################################
knet_win32_init();
#endif
#endif
-
+
// reset getopt
optind = 1;
if (argc < 2) return 1;
-
- if (strcmp(argv[1], "view") == 0) return main_samview(argc-1, argv+1);
- else if (strcmp(argv[1], "import") == 0) return main_import(argc-1, argv+1);
- else if (strcmp(argv[1], "mpileup") == 0) return bam_mpileup(argc-1, argv+1);
- else if (strcmp(argv[1], "merge") == 0) return bam_merge(argc-1, argv+1);
- else if (strcmp(argv[1], "sort") == 0) return bam_sort(argc-1, argv+1);
- else if (strcmp(argv[1], "index") == 0) return bam_index(argc-1, argv+1);
- else if (strcmp(argv[1], "faidx") == 0) return faidx_main(argc-1, argv+1);
- else if (strcmp(argv[1], "idxstats") == 0) return bam_idxstats(argc-1, argv+1);
- else if (strcmp(argv[1], "fixmate") == 0) return bam_mating(argc-1, argv+1);
- else if (strcmp(argv[1], "rmdup") == 0) return bam_rmdup(argc-1, argv+1);
- else if (strcmp(argv[1], "flagstat") == 0) return bam_flagstat(argc-1, argv+1);
- else if (strcmp(argv[1], "calmd") == 0) return bam_fillmd(argc-1, argv+1);
- else if (strcmp(argv[1], "fillmd") == 0) return bam_fillmd(argc-1, argv+1);
- else if (strcmp(argv[1], "reheader") == 0) return main_reheader(argc-1, argv+1);
- else if (strcmp(argv[1], "cat") == 0) return main_cat(argc-1, argv+1);
- else if (strcmp(argv[1], "targetcut") == 0) return main_cut_target(argc-1, argv+1);
- else if (strcmp(argv[1], "phase") == 0) return main_phase(argc-1, argv+1);
- else if (strcmp(argv[1], "depth") == 0) return main_depth(argc-1, argv+1);
- else if (strcmp(argv[1], "bam2fq") == 0) return main_bam2fq(argc-1, argv+1);
+ int retval = 0;
+
+ if (strcmp(argv[1], "view") == 0) retval = main_samview(argc-1, argv+1);
+ else if (strcmp(argv[1], "import") == 0) retval = main_import(argc-1, argv+1);
+ else if (strcmp(argv[1], "mpileup") == 0) retval = bam_mpileup(argc-1, argv+1);
+ else if (strcmp(argv[1], "merge") == 0) retval = bam_merge(argc-1, argv+1);
+ else if (strcmp(argv[1], "sort") == 0) retval = bam_sort(argc-1, argv+1);
+ else if (strcmp(argv[1], "index") == 0) retval = bam_index(argc-1, argv+1);
+ else if (strcmp(argv[1], "faidx") == 0) retval = faidx_main(argc-1, argv+1);
+ else if (strcmp(argv[1], "idxstats") == 0) retval = bam_idxstats(argc-1, argv+1);
+ else if (strcmp(argv[1], "fixmate") == 0) retval = bam_mating(argc-1, argv+1);
+ else if (strcmp(argv[1], "rmdup") == 0) retval = bam_rmdup(argc-1, argv+1);
+ else if (strcmp(argv[1], "flagstat") == 0) retval = bam_flagstat(argc-1, argv+1);
+ else if (strcmp(argv[1], "calmd") == 0) retval = bam_fillmd(argc-1, argv+1);
+ else if (strcmp(argv[1], "fillmd") == 0) retval = bam_fillmd(argc-1, argv+1);
+ else if (strcmp(argv[1], "reheader") == 0) retval = main_reheader(argc-1, argv+1);
+ else if (strcmp(argv[1], "cat") == 0) retval = main_cat(argc-1, argv+1);
+ else if (strcmp(argv[1], "targetcut") == 0) retval = main_cut_target(argc-1, argv+1);
+ else if (strcmp(argv[1], "phase") == 0) retval = main_phase(argc-1, argv+1);
+ else if (strcmp(argv[1], "depth") == 0)
+ {
+ retval = main_depth(argc-1, argv+1);
+ }
+
+ else if (strcmp(argv[1], "bam2fq") == 0) retval = main_bam2fq(argc-1, argv+1);
#if _CURSES_LIB != 0
- else if (strcmp(argv[1], "tview") == 0) return bam_tview_main(argc-1, argv+1);
+ else if (strcmp(argv[1], "tview") == 0) retval = bam_tview_main(argc-1, argv+1);
#endif
else
{
fprintf(stderr, "[main] unrecognized command '%s'\n", argv[1]);
return 1;
}
- return 0;
+ fflush( stdout );
+
+ return retval;
}
// taken from samtools/bam_import.c
return kh_value(h, iter);
}
+// Auxiliary functions for B support
+void bam_aux_appendB(bam1_t *b, const char tag[2], char type, char subtype, int len, uint8_t *data)
+{
+
+ int ori_len;
-
+ int data_len;
+
+ // check that type is 'B'
+ if('B' != type) return;
+
+ ori_len = b->data_len;
+
+ data_len = len * bam_aux_type2size(subtype);
+ // infer the data length from the sub-type
+ b->data_len += 8 + data_len;
+
+ b->l_aux += 8 + data_len;
+
+ if (b->m_data < b->data_len)
+ {
+
+ b->m_data = b->data_len;
+
+ kroundup32(b->m_data);
+
+ b->data = (uint8_t*)realloc(b->data, b->m_data);
+
+ }
+
+ b->data[ori_len] = tag[0];
+ b->data[ori_len + 1] = tag[1];
+ // tag
+ b->data[ori_len + 2] = type;
+ // type
+ b->data[ori_len + 3] = subtype;
+ // subtype
+ (*(int32_t*)(b->data + ori_len + 4)) = len;
+ // size
+ memcpy(b->data + ori_len + 8, data, data_len);
+ // data
+}
+
+/*
+// return size of auxiliary type
+int bam_aux_type2size(int x)
+{
+ if (x == 'C' || x == 'c' || x == 'A') return 1;
+ else if (x == 'S' || x == 's') return 2;
+ else if (x == 'I' || x == 'i' || x == 'f') return 4;
+ else return 0;
+}
+*/