Merge branch 'slimconfigure'
[m6w6/ext-psi] / src / types / decl_enum_item.c
index 5f664b01b2e388615872fba03e538efde924c76a..7410e01d7621b3b319b15a6582d59bb895db9bef 100644 (file)
@@ -44,8 +44,22 @@ void psi_decl_enum_item_free(struct psi_decl_enum_item **i_ptr)
                if (i->token) {
                        free(i->token);
                }
-               if (i->num && i->num != &i->inc) {
-                       psi_num_exp_free(&i->num);
+               if (i->num) {
+                       if (i->num == &i->inc) {
+                               switch (i->inc.op) {
+                               case PSI_T_NUMBER:
+                                       psi_number_free(&i->inc.data.n);
+                                       break;
+                               case PSI_T_PLUS:
+                                       psi_num_exp_free(&i->inc.data.b.lhs);
+                                       psi_num_exp_free(&i->inc.data.b.rhs);
+                                       break;
+                               default:
+                                       assert(0);
+                               }
+                       } else {
+                               psi_num_exp_free(&i->num);
+                       }
                }
                free(i->name);
                free(i);
@@ -64,25 +78,33 @@ void psi_decl_enum_item_dump(int fd, struct psi_decl_enum_item *item)
 bool psi_decl_enum_item_validate(struct psi_data *data,
                struct psi_decl_enum *enm, struct psi_decl_enum_item *item, size_t seq)
 {
+       struct psi_validate_scope scope = {0};
+
        if (!item->num) {
                if (seq) {
-                       item->inc.type = PSI_T_INT64;
-                       item->inc.data.ival.i64 = 1;
+                       int64_t one = 1;
+
                        item->inc.op = PSI_T_PLUS;
-                       item->inc.operand = item->prev->num ? : &item->prev->inc;
+                       item->inc.data.b.lhs = psi_num_exp_init_unary(PSI_T_LPAREN,
+                                       psi_num_exp_copy(item->prev->num));
+                       item->inc.data.b.rhs = psi_num_exp_init_num(
+                                                       psi_number_init(PSI_T_INT64, &one, 0));
                        item->num = &item->inc;
                } else {
-                       item->inc.type = PSI_T_INT64;
-                       item->inc.data.ival.i64 = 0;
+                       int64_t nil = 0;
+
+                       item->inc.op = PSI_T_NUMBER;
+                       item->inc.data.n = psi_number_init(PSI_T_INT64, &nil, 0);
                        item->num = &item->inc;
                }
        }
 
-       if (!psi_num_exp_validate(data, item->num, NULL, NULL, NULL, NULL, enm)) {
+       scope.current_enum = enm;
+       if (!psi_num_exp_validate(data, item->num, &scope)) {
                return false;
        }
 
-       item->val = psi_long_num_exp(item->num, NULL);
+       item->val = psi_num_exp_get_long(item->num, NULL, NULL);
 
        return true;
 }