Exemplo n.º 1
0
/**
 * 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;
}
Exemplo n.º 2
0
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;
}