api refactoring
[m6w6/ext-psi] / src / types / impl_stmts.h
1 #ifndef _PSI_TYPES_IMPL_STMTS_H
2 #define _PSI_TYPES_IMPL_STMTS_H
3
4 typedef struct impl_stmts {
5 struct {
6 return_stmt **list;
7 size_t count;
8 } ret;
9 struct {
10 let_stmt **list;
11 size_t count;
12 } let;
13 struct {
14 set_stmt **list;
15 size_t count;
16 } set;
17 struct {
18 free_stmt **list;
19 size_t count;
20 } fre;
21 } impl_stmts;
22
23 static inline void *add_impl_stmt_ex(void *list, size_t count, void *stmt) {
24 list = realloc(list, count * sizeof(list));
25 ((void **)list)[count-1] = stmt;
26 return list;
27 }
28
29 static inline impl_stmts *add_impl_stmt(impl_stmts *stmts, impl_stmt *stmt) {
30 switch (stmt->type) {
31 case PSI_T_RETURN:
32 stmts->ret.list = add_impl_stmt_ex(stmts->ret.list, ++stmts->ret.count, stmt->s.ret);
33 break;
34 case PSI_T_LET:
35 stmts->let.list = add_impl_stmt_ex(stmts->let.list, ++stmts->let.count, stmt->s.let);
36 break;
37 case PSI_T_SET:
38 stmts->set.list = add_impl_stmt_ex(stmts->set.list, ++stmts->set.count, stmt->s.set);
39 break;
40 case PSI_T_FREE:
41 stmts->fre.list = add_impl_stmt_ex(stmts->fre.list, ++stmts->fre.count, stmt->s.fre);
42 break;
43 }
44 free(stmt);
45 return stmts;
46 }
47
48 static inline impl_stmts *init_impl_stmts(impl_stmt *stmt) {
49 impl_stmts *stmts = calloc(1, sizeof(*stmts));
50 return add_impl_stmt(stmts, stmt);
51 }
52
53 static inline void free_impl_stmts(impl_stmts *stmts) {
54 size_t i;
55
56 for (i = 0; i < stmts->let.count; ++i) {
57 free_let_stmt(stmts->let.list[i]);
58 }
59 free(stmts->let.list);
60 for (i = 0; i < stmts->ret.count; ++i) {
61 free_return_stmt(stmts->ret.list[i]);
62 }
63 free(stmts->ret.list);
64 for (i = 0; i < stmts->set.count; ++i) {
65 free_set_stmt(stmts->set.list[i]);
66 }
67 free(stmts->set.list);
68 for (i = 0; i < stmts->fre.count; ++i) {
69 free_free_stmt(stmts->fre.list[i]);
70 }
71 free(stmts->fre.list);
72 free(stmts);
73 }
74
75 #endif