# Install bcftools, its manpage, bcf-fix.pl, vcfutils.pl, and new examples.
[samtools.git] / bcftools / main.c
1 #include <string.h>
2 #include <stdlib.h>
3 #include <sys/stat.h>
4 #include "bcf.h"
5
6 int bcfview(int argc, char *argv[]);
7 int bcf_main_index(int argc, char *argv[]);
8
9 #define BUF_SIZE 0x10000
10
11 int bcf_cat(int n, char * const *fn)
12 {
13         int i;
14         bcf_t *out;
15         uint8_t *buf;
16         buf = malloc(BUF_SIZE);
17         out = bcf_open("-", "w");
18         for (i = 0; i < n; ++i) {
19                 bcf_t *in;
20                 bcf_hdr_t *h;
21                 off_t end;
22                 struct stat s;
23                 in = bcf_open(fn[i], "r");
24                 h = bcf_hdr_read(in);
25                 if (i == 0) bcf_hdr_write(out, h);
26                 bcf_hdr_destroy(h);
27 #ifdef _USE_KNETFILE
28                 fstat(knet_fileno(in->fp->x.fpr), &s);
29                 end = s.st_size - 28;
30                 while (knet_tell(in->fp->x.fpr) < end) {
31                         int size = knet_tell(in->fp->x.fpr) + BUF_SIZE < end? BUF_SIZE : end - knet_tell(in->fp->x.fpr);
32                         knet_read(in->fp->x.fpr, buf, size);
33                         fwrite(buf, 1, size, out->fp->x.fpw);
34                 }
35 #else
36                 abort(); // FIXME: not implemented
37 #endif
38                 bcf_close(in);
39         }
40         bcf_close(out);
41         free(buf);
42         return 0;
43 }
44
45 int main(int argc, char *argv[])
46 {
47         if (argc == 1) {
48                 fprintf(stderr, "\n");
49                 fprintf(stderr, "Usage:   bcftools <command> <arguments>\n\n");
50                 fprintf(stderr, "Command: view      print, extract, convert and call SNPs from BCF\n");
51                 fprintf(stderr, "         index     index BCF\n");
52                 fprintf(stderr, "         cat       concatenate BCFs\n");
53                 fprintf(stderr, "\n");
54                 return 1;
55         }
56         if (strcmp(argv[1], "view") == 0) return bcfview(argc-1, argv+1);
57         else if (strcmp(argv[1], "index") == 0) return bcf_main_index(argc-1, argv+1);
58         else if (strcmp(argv[1], "cat") == 0) return bcf_cat(argc-2, argv+2);
59         else {
60                 fprintf(stderr, "[main] Unrecognized command.\n");
61                 return 1;
62         }
63         return 0;
64 }