-
Notifications
You must be signed in to change notification settings - Fork 2
/
datapt.c
64 lines (57 loc) · 1.3 KB
/
datapt.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
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "mol.h"
#include "datapt.h"
static int BUFSZ = 0;
static int BUFLEN = 0;
static char *BUF = NULL;
// return: 0 if file continues else -1
static int read_line(FILE *f) {
int r = 0;
int c;
while ((c = fgetc(f)) != EOF && c != '\n') {
if (r >= BUFSZ) {
BUFSZ += 1024;
BUF = realloc(BUF, BUFSZ + 1);
}
BUF[r++] = c;
BUF[r] = '\0';
}
BUFLEN = r;
if (c == EOF) {
return -1;
} else {
return 0;
}
}
// target: get nth label
struct datapt *parse_datapts(FILE *f, int target, int *N) {
int num = 0;
struct datapt *data = NULL;
struct mol *mol;
while (mol = parse_mol(f)) {
data = realloc(data, (num + 1) * sizeof(struct datapt));
// parse the molecule
data[num].mol = mol;
// find nth label
if (read_line(f)) {
free(data);
return NULL;
}
char *p = BUF;
for (int i = 0; i < target; i++) {
p = strchr(p, ',');
p++;
}
char *end;
data[num].label = strtof(p, &end);
if (end != p) {
num++;
} else {
free_mol(data[num].mol);
}
}
*N = num;
return data;
}