-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.c
146 lines (130 loc) · 4.28 KB
/
main.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/time.h>
#include <string.h>
#include "index.h"
#include "query.h"
int main(int argc, char *argv[]){
int i_flag = 0;
int q_flag = 0;
int k_flag = 0;
int o_flag = 0;
int h_flag = 0;
int err_flag = 0;
size_t k = 0;
char * i_dir = NULL; // index directory
char * o_dir = NULL; // output directory
char * qry_file = NULL;
char ** comp_files = NULL; // plasmid components
int num_comp = 0;
int c;
opterr = 0;
while ((c = getopt (argc, argv, "ik:q:o:h")) != -1)
switch (c)
{
case 'k':
if (q_flag || h_flag) err_flag ++;
k_flag = 1;
k = atoi(optarg);
break;
case 'i':
if (q_flag || h_flag) err_flag ++;
i_flag = 1;
break;
case 'q':
if (i_flag || k_flag || h_flag) err_flag ++;
q_flag = 1;
i_dir = optarg;
break;
case 'o':
o_flag = 1;
o_dir = optarg;
break;
case 'h':
if (i_flag || k_flag || q_flag) err_flag ++;
h_flag = 1;
break;
// case ':': /* -k, -q or -o without operand */
// fprintf(stderr, "[ERROR] Option -%c requires an operand\n", optopt);
// return 1;
case '?':
if (isprint (optopt))
fprintf(stderr, "[ERROR] Parsing error on option -%c, See `./plschain -h` for usage\n", optopt);
else
fprintf(stderr, "[ERROR] Unknown option character `\\x%x', See `./plschain -h` for usage\n", optopt);
return 1;
default:
abort();
}
if (h_flag & !err_flag) {
fprintf(stdout, "Usage: plschain -i -k INT -o DIRECTORY FILE1 FILE2 FILE3 ...\n");
fprintf(stdout, " plschain -q DIRECTORY -o DIRECTORY <query.fa>\n");
fprintf(stdout, "Options:\n");
fprintf(stdout, " -i Indexing mode\n");
fprintf(stdout, " -q DIRECTORY Query mode, index directory\n");
fprintf(stdout, " -k INT k-mer size [15,32]\n");
fprintf(stdout, " -o DIRECTORY output directory\n");
fprintf(stdout, " -h show this message\n");
return 0;
}
if (i_flag == 0 && q_flag == 0) {
fprintf(stderr, "[ERROR] No mode, See `./plschain -h` for usage\n");
return 1;
}
if (o_flag == 0) {
fprintf(stderr, "[ERROR] No output DIRECTORY specified\n");
return 1;
}
if (err_flag){
fprintf(stderr, "[ERROR] Parsing error, See `./plschain -h` for usage\n");
return 1;
}
if (o_dir[strlen(o_dir)-1] == '/'){
o_dir[strlen(o_dir)-1] = '\0';
}
if (mkdir(o_dir, S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH) == -1){
fprintf(stderr, "%s\n", strerror(errno));
return 1;
}
struct timeval start, end;
double elapsed;
gettimeofday(&start, NULL);
int ret = 0;
if (i_flag == 1){
if (k_flag == 0) {
fprintf(stderr, "[ERROR] No k-mer size specified for index (-i) mode\n");
return 1;
}
if (optind == argc) {
fprintf(stderr, "[ERROR] No Plasmid components are specified for index (-i) mode\n");
return 1;
}
comp_files = &argv[optind];
num_comp = argc - optind;
// run index
ret = indexing(k, num_comp, comp_files, o_dir);
} else {
/* q_flag == 1 */
if (optind == argc) {
fprintf(stderr, "[ERROR] No query file is specified for query (-q) mode\n");
return 1;
}
if (optind != argc - 1) {
// handle multiple query file later.
fprintf(stderr, "[ERROR] Multiple query files are supplied\n");
return 1;
}
if (i_dir[strlen(i_dir)-1] == '/'){
i_dir[strlen(i_dir)-1] = '\0';
}
qry_file = argv[optind];
ret = query_file(i_dir, o_dir, qry_file);
}
gettimeofday(&end, NULL);
elapsed = end.tv_sec + end.tv_usec / 1e6 -
start.tv_sec - start.tv_usec / 1e6; // in seconds
fprintf(stdout, "[%s] Time elapsed: %fsec\n", ret == 0 ? "SUCCESS" : "FAILURE", elapsed);
return ret;
}