-
Notifications
You must be signed in to change notification settings - Fork 0
/
bed.c
69 lines (63 loc) · 1.78 KB
/
bed.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
struct BedReader {
FILE* file;
struct Interval* last;
char* lastChr;
};
static int open_bed_reader(char* file_name, struct BedReader* reader) {
reader->file = fopen(file_name, "r");
if(!reader->file)
return 1;
reader->last = 0;
reader->lastChr = 0;
return 0;
}
static void close_bed_reader(struct BedReader* reader) {
fclose(reader->file);
if(reader->last)
free(reader->last);
if(reader->lastChr)
free(reader->lastChr);
}
static int read_chr_bed(struct BedReader* reader, char* chr, struct SliceInterval* res) {
int32_t capacity = 4;
res->s = res->e = malloc(sizeof(struct Interval) * capacity);
if(!reader->last) {
char chr[32];
int32_t start, end;
int ret = fscanf(reader->file, "%31s %d %d", chr, &start, &end);
if(ret != 3 )
return 0;
reader->last = malloc(sizeof(struct Interval));
reader->last->start = start;
reader->last->end = end;
if(!reader->lastChr)
reader->lastChr = malloc(32);
strcpy(reader->lastChr, chr);
}
for(;;) {
if(strcmp(reader->lastChr, chr) != 0)
return 0;
int32_t size = res->e - res->s;
if(size == capacity) {
res->s = realloc(res->s, sizeof(struct Interval) * (capacity *= 2));
res->e = res->s + size;
}
res->e->start = reader->last->start;
res->e->end = reader->last->end;
res->e++;
int32_t start, end;
int ret = fscanf(reader->file, "%31s %d %d", reader->lastChr, &start, &end);
reader->last->start = start + 1;
reader->last->end = end + 1;
if(ret != 3) {
free(reader->last);
free(reader->lastChr);
reader->last = 0;
reader->lastChr = 0;
return 0;
}
}
}
static int bed_reader_has_more_sites(struct BedReader* reader) {
return reader->last != 0;
}