示例#1
0
static void *hvm_str_replace(const char *method,
                             hefesto_common_list_ctx **string_var,
                             hefesto_type_t *otype,
                             hefesto_var_list_ctx **lo_vars,
                             hefesto_var_list_ctx **gl_vars,
                             hefesto_func_list_ctx *functions) {

    size_t offset = 0, outsz;
    char *regex_arg, *pattern_arg;
    char *replaced_buffer = NULL;
    const char *m;
    char errors[HEFESTO_MAX_BUFFER_SIZE];
    void *usr_regex, *usr_pattern, *result;
    hefesto_type_t etype = HEFESTO_VAR_TYPE_STRING;
    here_search_program_ctx *search_program;

    *otype = HEFESTO_VAR_TYPE_INT;
    result = hefesto_mloc(sizeof(hefesto_int_t));
    *(hefesto_int_t *)result = 0;

    if (string_var == NULL || (*string_var) == NULL ||
        (*string_var)->data == NULL) return result;

    for (m = method; *m != '(' && *m != 0; m++);

    regex_arg = get_arg_from_call(m+1, &offset);

    pattern_arg = get_arg_from_call(m+1, &offset);

    usr_regex = expr_eval(regex_arg, lo_vars, gl_vars, functions,
                          &etype, &outsz);

    if ((search_program = here_compile(usr_regex, errors)) != NULL) {
        usr_pattern = expr_eval(pattern_arg, lo_vars, gl_vars, functions,
                                &etype, &outsz);

        *(hefesto_int_t *)result = here_replace_string((*string_var)->data,
                                             search_program,
                                             usr_pattern,
                                             &replaced_buffer,
                                             &outsz);
        free((*string_var)->data);
        (*string_var)->data = (char *) hefesto_mloc(outsz+1);
        (*string_var)->dsize = outsz;
        memset((*string_var)->data, 0, outsz+1);
        strncpy((*string_var)->data, replaced_buffer, outsz+1);
        free(replaced_buffer);
        free(usr_pattern);
        del_here_search_program_ctx(search_program);
    } else {
        hlsc_info(HLSCM_MTYPE_RUNTIME, HLSCM_SYN_ERROR_INVAL_REGEX, errors);
    }

    free(usr_regex);

    return result;

}
示例#2
0
static char *infix2postfix_function_args(const char *expr_args,
                                         const size_t esize) {

    char *e;
    char *iexpr, *pexpr;
    char *result = (char *) hefesto_mloc(HEFESTO_MAX_BUFFER_SIZE);
    char *r;
    size_t offset = 1;

    iexpr = get_arg_from_call(expr_args, &offset);

    r = result;
    *r = '(';
    r++;

    while (*iexpr) {
        pexpr = infix2postfix(iexpr, strlen(iexpr), 0);

        for (e = pexpr; *e != 0; e++, r++) *r = *e;

        free(iexpr);

        free(pexpr);

        iexpr = get_arg_from_call(expr_args, &offset);

        if (*iexpr) {
            *r = ',';
            r++;
        }
    }

    free(iexpr);

    *r = 0;

    return result;

}
示例#3
0
static void *hvm_str_match(const char *method,
                           hefesto_common_list_ctx **string_var,
                           hefesto_type_t *otype, hefesto_var_list_ctx **lo_vars,
                           hefesto_var_list_ctx **gl_vars,
                           hefesto_func_list_ctx *functions) {

    size_t offset = 0, outsz;
    char *arg;
    const char *m;
    char errors[HEFESTO_MAX_BUFFER_SIZE];
    void *usr_regex, *result;
    here_search_program_ctx *search_program;
    here_search_result_ctx *search_result;

    hefesto_type_t etype = HEFESTO_VAR_TYPE_STRING;
    *otype = HEFESTO_VAR_TYPE_INT;
    result = hefesto_mloc(sizeof(hefesto_int_t));
    *(hefesto_int_t *)result = 0;

    if (string_var == NULL || (*string_var) == NULL ||
        (*string_var)->data == NULL) return result;

    for (m = method; *m != '(' && *m != 0; m++);

    arg = get_arg_from_call(m+1, &offset);

    usr_regex = expr_eval(arg, lo_vars, gl_vars, functions,
                          &etype, &outsz);
    if ((search_program = here_compile(usr_regex, errors)) != NULL) {
        search_result = here_match_string((*string_var)->data,
                                          search_program);
        *(hefesto_int_t *)result = here_matches(search_result);
        del_here_search_program_ctx(search_program);
        del_here_search_result_ctx(search_result);
    } else {
        hlsc_info(HLSCM_MTYPE_RUNTIME, HLSCM_SYN_ERROR_INVAL_REGEX, errors);
    }

    free(usr_regex);

    return result;

}
示例#4
0
char *infix2postfix_args(const char *arg_list, const size_t arg_list_size) {
    char *e = NULL;
    const char *ap = NULL, *ap_end = NULL;
    char *arg_pf = NULL;
    size_t offset = 0;
    size_t real_arg_list_size = 0;
    char *retval = NULL;
    char arg_list_cpy[HEFESTO_MAX_BUFFER_SIZE];

    if (arg_list == NULL) {
        return NULL;
    }

    memset(arg_list_cpy, 0, sizeof(arg_list_cpy));
    strncpy(arg_list_cpy, arg_list, sizeof(arg_list_cpy) - 1);
    real_arg_list_size = strnlen(arg_list_cpy, sizeof(arg_list_cpy));

    ap_end = get_stmt_end(arg_list_cpy, real_arg_list_size);

    ap = &arg_list_cpy[0];

    if (ap_end != NULL) {
        memset((char *)ap_end, 0, real_arg_list_size - (ap_end - ap));
    }

    while (*ap != '(' && *ap != 0) {
        ap++;
    }

    if (*ap == 0) {
        return NULL;
    }

    ap++;

    retval = (char *) hefesto_mloc(arg_list_size * 2);

    memset(retval, 0, arg_list_size * 2);

    *retval = '(';

    e = get_arg_from_call(ap, &offset);

    while (*e) {

        arg_pf = infix2postfix(e, strlen(e), 1);
        strcat(retval, arg_pf);

        free(arg_pf);
        free(e);

        if (arg_list_cpy[offset] == ',') {
            offset++;
        }

        e = get_arg_from_call(arg_list_cpy, &offset);

        if (*e) {
            strcat(retval, ",");
        } else {
            strcat(retval, ")");
        }

    }

    free(e);

    return retval;
}
示例#5
0
void hvm_init_function_args(const char *args,
                            hefesto_var_list_ctx **lo_vars,
                            hefesto_var_list_ctx **gl_vars,
                            hefesto_func_list_ctx *functions,
                            hefesto_func_list_ctx **function) {

    char *expr;
    char *expr_pfix;
    void *expr_result;
    hefesto_type_t etype;
    size_t sz;
    hefesto_var_list_ctx *vp = (*function)->vars, *ap = (*function)->args, *vlp = NULL;
    size_t offset = 0;
    //hefesto_instruction_code_t c_intr = hvm_get_current_executed_instruction();
    char *temp = (char *) hefesto_mloc(HEFESTO_MAX_BUFFER_SIZE);
    strncpy(temp, args, HEFESTO_MAX_BUFFER_SIZE);
    strcat(temp, ";");
    //printf("FUNCTION: %s [%s]\n", (*function)->name, temp);
    for (expr = temp; *expr != 0 && *expr != '('; expr++);
    offset = expr - args + 1;
    expr = get_arg_from_call(args, &offset);
    while (vp != NULL && *expr != 0) {
        if (ap->contents != NULL) {
            del_hefesto_common_list_ctx(ap->contents);
            ap->contents = NULL;
        }
        ap->contents = add_data_to_hefesto_common_list_ctx(ap->contents, expr,
                                                           strlen(expr));
//        if (c_intr != HEFESTO_ATTRIB && c_intr != HEFESTO_RET &&
//            c_intr != HEFESTO_IF && c_intr != HEFESTO_WHILE) {
//            expr_pfix = infix2postfix(expr, strlen(expr), 1);
//            free(expr);
//        } else {
          expr_pfix = expr;
//        }
        etype = vp->type;
        //printf("\tF-ARG: %s\n", expr_pfix);
        // INFO(Santiago):
        // truque sujo, aqui gl_vars precisa ser varrida primeiro, lo_vars nem
        // precisa pois argumentos nao serao formados por variaveis ou
        // expressoes com variaveis definidas no corpo dessa mesma funcao
        // prestes a ser executada.
        //expr_result = expr_eval(expr_pfix, (*lo_vars == vp) ? gl_vars : lo_vars, gl_vars, functions, &etype, &sz); 
        /*if (hvm_get_last_executed_function() != NULL) {
            printf("last -> %s\n", hvm_get_last_executed_function()->name);
        }
        printf("current -> %s\n", (*function)->name);*/
        expr_result = expr_eval(expr_pfix,
                                (hvm_get_last_executed_function() == *function) ? 
                                           &(*function)->vars : lo_vars, gl_vars,
                                functions, &etype, &sz);

        if (*expr_pfix == '$') {
            vlp = get_hefesto_var_list_ctx_name(expr_pfix + 1, *lo_vars);
            if (vlp == NULL) {
                vlp = get_hefesto_var_list_ctx_name(expr_pfix + 1, *gl_vars);
            }
        }
        free(expr_pfix);

        if (vp->contents != NULL) {
            del_hefesto_common_list_ctx(vp->contents);
            vp->contents = NULL;
        }
        if (etype != HEFESTO_VAR_TYPE_LIST) {
            vp->contents = add_data_to_hefesto_common_list_ctx(vp->contents,
                                                               expr_result,
                                        (etype == HEFESTO_VAR_TYPE_STRING) ?
                                            strlen((char*)expr_result) : sizeof(hefesto_int_t));
            free(expr_result);
        } else {
            if (vlp != NULL) {
                vp->subtype = vlp->subtype;
            } else {
                vp->subtype = get_hsl_list_subtype((hefesto_common_list_ctx *)expr_result);
                /*if (((hefesto_common_list_ctx *)expr_result)->data &&
                     is_hefesto_numeric_constant(((hefesto_common_list_ctx *)
                                                    expr_result)->data)) {
                    vp->subtype = HEFESTO_VAR_TYPE_INT;
                } else {
                    vp->subtype = HEFESTO_VAR_TYPE_STRING;
                }*/
            }
            vp->contents =
              cp_hefesto_common_list_ctx((hefesto_common_list_ctx *)expr_result);
            del_hefesto_common_list_ctx((hefesto_common_list_ctx *)expr_result);
        }
        vp = vp->next;
        ap = ap->next;
        expr = get_arg_from_call(args, &offset);
    }

    free(expr);

    // we must to clear local stack initializing all with null or zero.
    for (; vp != NULL; vp = vp->next) {
        if (vp->type == HEFESTO_VAR_TYPE_FILE_DESCRIPTOR && vp->contents) {
            close_hefesto_file_handle((hefesto_file_handle *) vp->contents->data);
        }
        del_hefesto_common_list_ctx(vp->contents);
        new_hefesto_common_list_ctx(vp->contents);
        if (vp->type == HEFESTO_VAR_TYPE_LIST) {
            vp->subtype = HEFESTO_VAR_TYPE_NONE;
            vp->contents->is_dummy_item = 1;
        }
    }

}