-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsfs.cpp
93 lines (89 loc) · 1.94 KB
/
sfs.cpp
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
#include "sfs.h"
sfs_t *init_sfs() {
sfs_t *s = (sfs_t *)malloc(sizeof(sfs_t));
s->rname = (char *)malloc(128 * sizeof(char));
s->seq = NULL;
return s;
}
void destroy_sfs(sfs_t *s) {
free(s->rname);
if (s->seq != NULL)
free(s->seq);
free(s);
}
anchor_t parse_anchor(char *line) {
anchor_t a;
int i;
char *p, *q;
for (i = 0, p = q = line;; ++p) {
if (*p == 0 || *p == ':') {
int c = *p;
*p = 0;
/* 0: vertex (as in GFA)
1: offset
2: kmer
*/
if (i == 0) {
a.v = atoi(q);
} else if (i == 1) {
a.offset = atoi(q);
} else if (i == 2) {
// char *pEnd;
a.seq = strtoull(q, NULL /*&pEnd*/, 10);
}
++i;
q = p + 1;
if (c == 0)
break;
}
}
return a;
}
void parse_sfs_line(char *line, sfs_t *s) {
int i;
char *p, *q;
for (i = 0, p = q = line;; ++p) {
if (*p == 0 || *p == ' ') {
int c = *p;
*p = 0;
/* 0: read idx in .fq
1: read name
2: start on read
3: length
4: strand
5: if we kept it
6: sequence
7: left anchor
8: right anchor
*/
if (i == 0) {
s->qidx = atoi(q);
} else if (i == 1) {
strncpy(s->rname, q, p - q);
s->rname[p - q] = '\0';
} else if (i == 2) {
s->s = atoi(q);
} else if (i == 3) {
s->l = atoi(q);
} else if (i == 4) {
s->strand = atoi(q);
} else if (i == 6) {
// s.seq = (uint8_t *)malloc(s.l + 1);
// memcpy(s.seq, q, s.l);
// s.seq[s.l] = '\0';
// for (int _i = 0; _i < s.l; ++_i)
// s.seq[_i] = s.seq[_i] < 128 ? to_int[s.seq[_i]] : 5;
} else if (i == 7) {
s->a = parse_anchor(q);
s->a.p = s->s;
} else if (i == 8) {
s->b = parse_anchor(q);
s->b.p = s->s;
}
++i;
q = p + 1;
if (c == 0)
break;
}
}
}