-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathstate.c
72 lines (63 loc) · 1.48 KB
/
state.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
// state.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <math.h>
#include "btmha.h"
#ifdef WIN32
#include <io.h>
#else
#include <unistd.h>
#endif
#define free_null(x) if(x){free(x);x=NULL;}
//===========================================================
static void
state_make(STA *state, int32_t *cpsiz, void **cp, int ptsiz, int arsiz)
{
char *data;
double *dvar;
int32_t *ivar;
int i;
void *mkdata;
void **mkcp;
// allocate memory
mkcp = (void **)calloc(ptsiz, sizeof(void *));
mkdata = calloc(arsiz, 1);
// copy data
data = (char *)mkdata;
for (i = 0; i < ptsiz; i++) {
if (cp[i]) {
memcpy(data, cp[i], cpsiz[i]);
mkcp[i] = data;
data += cpsiz[i];
}
}
// return state variables
ivar = (int32_t *) cp[_ivar];
dvar = (double *) cp[_dvar];
state->ptsiz = ptsiz;
state->arsiz = arsiz;
state->cp = mkcp;
state->data = mkdata;
state->sr = dvar[_sr] * 1000;
state->cs = ivar[_cs];
}
void
state_copy(STA *new_state, STA *old_state)
{
int ptsiz, arsiz;
int32_t *cpsiz;
void **cp;
cp = old_state->cp;
cpsiz = (int32_t *)cp[_size];
ptsiz = old_state->ptsiz;
arsiz = old_state->arsiz;
state_make(new_state, cpsiz, cp, ptsiz, arsiz);
}
void
state_free(STA *state)
{
free_null(state->cp);
free_null(state->data);
}