validation and marshaling of structs/unions
[m6w6/ext-psi] / src / types / let_val.h
1 #ifndef _PSI_TYPES_LET_VAL_H
2 #define _PSI_TYPES_LET_VAL_H
3
4
5 enum let_val_kind {
6 PSI_LET_NULL,
7 PSI_LET_NUMEXP,
8 PSI_LET_CALLOC,
9 PSI_LET_CALLBACK,
10 PSI_LET_FUNC,
11 PSI_LET_TMP,
12 };
13 #define PSI_LET_REFERENCE 0x1;
14 typedef struct let_val {
15 enum let_val_kind kind;
16 decl_var *var;
17 union {
18 num_exp *num;
19 let_calloc *alloc;
20 let_callback *callback;
21 let_func *func;
22 decl_var *var;
23 } data;
24 union {
25 struct {
26 unsigned is_reference:1;
27 } one;
28 unsigned all;
29 } flags;
30 } let_val;
31
32 static inline let_val *init_let_val(enum let_val_kind kind, void *data) {
33 let_val *let = calloc(1, sizeof(*let));
34 switch (let->kind = kind) {
35 case PSI_LET_NULL:
36 break;
37 case PSI_LET_NUMEXP:
38 let->data.num = data;
39 break;
40 case PSI_LET_CALLOC:
41 let->data.alloc = data;
42 break;
43 case PSI_LET_CALLBACK:
44 let->data.callback = data;
45 break;
46 case PSI_LET_FUNC:
47 let->data.func = data;
48 break;
49 case PSI_LET_TMP:
50 let->data.var = data;
51 break;
52 EMPTY_SWITCH_DEFAULT_CASE();
53 }
54 return let;
55 }
56
57 static inline void free_let_val(let_val *let) {
58 switch (let->kind) {
59 case PSI_LET_NULL:
60 break;
61 case PSI_LET_NUMEXP:
62 free_num_exp(let->data.num);
63 break;
64 case PSI_LET_CALLOC:
65 free_let_calloc(let->data.alloc);
66 break;
67 case PSI_LET_CALLBACK:
68 free_let_callback(let->data.callback);
69 break;
70 case PSI_LET_FUNC:
71 free_let_func(let->data.func);
72 break;
73 case PSI_LET_TMP:
74 free_decl_var(let->data.var);
75 break;
76 EMPTY_SWITCH_DEFAULT_CASE();
77 }
78 free(let);
79 }
80
81 #endif