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