/** * Clones a regex object into a new object */ static t_object *obj_clone(t_object *obj) { t_regex_object *re_obj = (t_regex_object *)obj; // Create new object and copy all info t_regex_object *new_obj = smm_malloc(sizeof(t_regex_object)); memcpy(new_obj, re_obj, sizeof(t_regex_object)); // Newly separated object, so refcount is 1 again new_obj->ref_count = 1; // Copy / set internal data new_obj->regex_string = smm_strdup(re_obj->regex_string); return (t_object *)new_obj; }
svar *saffire_interpreter(t_ast_element *p) { svar *var, *var1, *var2, *tmp; long i; if (!p) return svar_temp_alloc(SV_NULL, NULL, 0); printf ("interpreting(%d)\n", p->type); if (p->type == 1) { p->type = 1; } switch (p->type) { case typeString : printf ("string: %s\n", p->string.value); return svar_temp_alloc(SV_STRING, p->string.value, 0); case typeNumerical : printf ("numerical: %d\n", p->numerical.value); return svar_temp_alloc(SV_LONG, NULL, p->numerical.value); case typeIdentifier : printf ("var: %s\n", p->identifier.name); return svar_temp_alloc(SV_STRING, p->identifier.name, 0); case typeNull : /* nop */ break; case typeClass : case typeInterface : case typeMethod : break; case typeOpr : printf ("opr.oper(%d)\n", p->opr.oper); switch (p->opr.oper) { case T_WHILE : while (svar_true(SI0(p))) { SI1(p); } return svar_temp_alloc(SV_NULL, NULL, 0); case T_IF: if (svar_true(SI0(p))) { SI1(p); } else if (p->opr.nops > 2) { SI2(p); } return svar_temp_alloc(SV_NULL, NULL, 0); case '=' : // Since we are assigning, we know the first operand is the name (string) tmp = SI0(p); var = svar_find(tmp->val.s); if (var == NULL) { // Assign value, since it doesn't exist yet or anymore printf ("Primary allocation for '%s'\n", tmp->val.s); var = svar_alloc(SV_NULL, tmp->val.s, NULL, 0); }; var1 = SI1(p); if (var1->type == SV_LONG) { printf("setting long: %ld\n", var1->val.l); var->type = SV_LONG; var->val.l = var1->val.l; } else { printf("setting string: %s\n", var1->val.s); var->type = SV_STRING; var->val.s = smm_strdup(var1->val.s); } svar_print(var); return var; case ';' : SI0(p); return SI1(p); case '+' : var1 = SI0(p); var2 = SI1(p); svar_print(var1); svar_print(var2); i = (var1->val.l + var2->val.l); printf("ADD: %ld + %ld = %ld\n", var1->val.l, var2->val.l, i); return svar_temp_alloc(SV_LONG, NULL, i); case '-' : var1 = SI0(p); var2 = SI1(p); return svar_temp_alloc(SV_LONG, NULL, (var1->val.l - var2->val.l)); case '*' : var1 = SI0(p); var2 = SI1(p); return svar_temp_alloc(SV_LONG, NULL, (var1->val.l * var2->val.l)); case '/' : var1 = SI0(p); var2 = SI1(p); i = floor(var1->val.l / var2->val.l); return svar_temp_alloc(SV_LONG, NULL, i); case '<' : var1 = SI0(p); var2 = SI0(p); i = (var1->val.l < var2->val.l); return svar_temp_alloc(SV_LONG, NULL, i); case '>' : var1 = SI0(p); var2 = SI1(p); i = (var1->val.l > var2->val.l); return svar_temp_alloc(SV_LONG, NULL, i); case T_GE : var1 = SI0(p); var2 = SI1(p); i = (var1->val.l >= var2->val.l); return svar_temp_alloc(SV_LONG, NULL, i); case T_LE : var1 = SI0(p); var2 = SI1(p); i = (var1->val.l <= var2->val.l); return svar_temp_alloc(SV_LONG, NULL, i); case T_NE : var1 = SI0(p); var2 = SI1(p); i = (var1->val.l != var2->val.l); return svar_temp_alloc(SV_LONG, NULL, i); case T_EQ : var1 = SI0(p); var2 = SI1(p); i = (var1->val.l == var2->val.l); return svar_temp_alloc(SV_LONG, NULL, i); default: printf("Unhandled opcode: %d\n", p->opr.oper); exit(1); break; } break; } return 0; }