api refactoring
[m6w6/ext-psi] / src / types / num_exp.h
1 #ifndef _PSI_TYPES_NUM_EXP
2 #define _PSI_TYPES_NUM_EXP
3
4 typedef struct num_exp {
5 struct psi_token *token;
6 token_t t;
7 union {
8 char *numb;
9 constant *cnst;
10 decl_var *dvar;
11 struct decl_enum_item *enm;
12 } u;
13 token_t operator;
14 int (*calculator)(int t1, impl_val *v1, int t2, impl_val *v2, impl_val *res);
15 struct num_exp *operand;
16 } num_exp;
17
18 static inline num_exp *init_num_exp(token_t t, void *num) {
19 num_exp *exp = calloc(1, sizeof(*exp));
20 switch (exp->t = t) {
21 case PSI_T_NUMBER:
22 case PSI_T_NSNAME:
23 exp->u.numb = strdup(num);
24 break;
25 case PSI_T_NAME:
26 exp->u.dvar = num;
27 break;
28 EMPTY_SWITCH_DEFAULT_CASE();
29 }
30 return exp;
31 }
32
33 static inline num_exp *copy_num_exp(num_exp *exp) {
34 decl_var *dvar;
35 num_exp *num = calloc(1, sizeof(*num));
36
37 memcpy(num, exp, sizeof(*num));
38
39 if (num->token) {
40 num->token = psi_token_copy(num->token);
41 }
42 if (num->operand) {
43 num->operand = copy_num_exp(num->operand);
44 }
45 switch (num->t) {
46 case PSI_T_NUMBER:
47 case PSI_T_NSNAME:
48 num->u.numb = strdup(num->u.numb);
49 break;
50 case PSI_T_NAME:
51 dvar = init_decl_var(num->u.dvar->name, num->u.dvar->pointer_level, num->u.dvar->array_size);
52 dvar->arg = num->u.dvar->arg;
53 if (num->u.dvar->token) {
54 dvar->token = psi_token_copy(num->u.dvar->token);
55 }
56 num->u.dvar = dvar;
57 break;
58 }
59 return num;
60 }
61
62 static inline void free_num_exp(num_exp *exp) {
63 if (exp->token) {
64 free(exp->token);
65 }
66 switch (exp->t) {
67 case PSI_T_NUMBER:
68 free(exp->u.numb);
69 break;
70 case PSI_T_NSNAME:
71 break;
72 case PSI_T_NAME:
73 free_decl_var(exp->u.dvar);
74 break;
75 case PSI_T_ENUM:
76 break;
77 EMPTY_SWITCH_DEFAULT_CASE();
78 }
79 if (exp->operand) {
80 free_num_exp(exp->operand);
81 }
82 free(exp);
83 }
84
85 #endif