RPA Toolkit
work on RVM based parser - RPA2
[rpatk.git] / rpa2 / rpastat.c
1 #include "rmem.h"
2 #include "rarray.h"
3 #include "rpastat.h"
4
5
6 rpastat_t *rpa_stat_create(rulong stacksize)
7 {
8         rpastat_t *stat = (rpastat_t *) r_zmalloc(sizeof(*stat));
9         stat->cpu = rpavm_cpu_create(stacksize);
10         if (!stat->cpu) {
11                 r_free(stat);
12                 return NULL;
13         }
14         stat->records = r_array_create(sizeof(rparecord_t));
15         stat->cpu->userdata1 = stat;
16         return stat;
17 }
18
19
20 void rpa_stat_destroy(rpastat_t *stat)
21 {
22         if (stat->instack)
23                 r_free(stat->instack);
24         r_object_destroy((robject_t*)stat->records);
25         rpavm_cpu_destroy(stat->cpu);
26         r_free(stat);
27 }
28
29
30 rint rpa_stat_init(rpastat_t *stat, const rchar *input, const rchar *start, const rchar *end)
31 {
32         rulong size;
33
34         if (start > end) {
35
36                 return -1;
37         }
38         if (input < start || input > end) {
39
40                 return -1;
41         }
42         size = end - start;
43         stat->start = start;
44         stat->end = end;
45         stat->input = input;
46         stat->error = 0;
47         stat->cursize = 0;
48         if (stat->instacksize < size) {
49                 stat->instack = r_realloc(stat->instack, (size + 1) * sizeof(rpainput_t));
50                 stat->instacksize = size + 1;
51         }
52         stat->ip.input = input;
53         stat->ip.serial = 0;
54         r_array_setlength(stat->records, 0);
55         return 0;
56 }
57
58
59 rint rpa_stat_parse(rpastat_t *stat, const rchar *input, const rchar *start, const rchar *end)
60 {
61         if (rpa_stat_parse(stat, input, start, end) < 0)
62                 return -1;
63
64
65         return 0;
66 }