Пример #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 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;

}
Пример #3
0
hefesto_int_t hvm_rqueue_run(hefesto_common_list_ctx *plist) {

#if HEFESTO_TGT_OS == HEFESTO_LINUX   ||\
    HEFESTO_TGT_OS == HEFESTO_FREEBSD ||\
    HEFESTO_TGT_OS == HEFESTO_SUNOS   ||\
    HEFESTO_TGT_OS == HEFESTO_NETBSD  ||\
    HEFESTO_TGT_OS == HEFESTO_OPENBSD

    hefesto_int_t exit_codes = 0, all_done = 0, sched_proc_nr;
    hefesto_common_list_ctx *pp;
    hefesto_rqueue_ctx *rqueue = NULL, *rqp;

    if (plist == NULL) return 1;

    if (plist->is_dummy_item) return 1;

    for (sched_proc_nr = 0;
         sched_proc_nr < hefesto_current_rqueue_size; sched_proc_nr++) {
        rqueue = add_task_to_hefesto_rqueue_ctx(rqueue,
                                                HEFESTO_MAX_BUFFER_SIZE);
    }

    pp = plist;

    while (!all_done) {
        all_done = 1;
        sched_proc_nr = 0;
        for (rqp = rqueue; rqp; rqp = rqp->next) {
            if (rqp->idle) {
                exit_codes += rqp->exit_code;
                rqp->exit_code = 0;
                if (pp) {
                    pthread_mutex_lock(&run_mutex);
                    rqp->idle = 0;
                    pthread_mutex_unlock(&run_mutex);
                    set_hefesto_rqueue_ctx_path_to_run(rqp, pp->data, pp->dsize);
                    if (hvm_thread_create(&rqp->id, hefesto_async_run,
                                          rqp) == 0) {
                        hlsc_info(HLSCM_MTYPE_RUNTIME,
                                  HLSCM_RUNTIME_ERROR_RQUEUE_THREAD_CREATION,
                                  rqp->path_to_run);
                    } else {
                        sched_proc_nr++;
                    }
                    pp = pp->next;
                    if (pp == NULL) break;
                }
            } else {
                sched_proc_nr++;
            }
        }
        all_done = (sched_proc_nr == 0);
    }

    del_hefesto_rqueue_ctx(rqueue);

    return exit_codes;

#elif HEFESTO_TGT_OS == HEFESTO_WINDOWS

    hefesto_int_t exit_codes = 0, all_done = 0, sched_proc_nr;
    hefesto_common_list_ctx *pp;
    hefesto_rqueue_ctx *rqueue = NULL, *rqp;

    if (plist == NULL) return 1;

    if (plist->is_dummy_item) return 1;

    for (sched_proc_nr = 0;
         sched_proc_nr < hefesto_current_rqueue_size; sched_proc_nr++) {
        rqueue = add_task_to_hefesto_rqueue_ctx(rqueue,
                                                HEFESTO_MAX_BUFFER_SIZE);
    }

    pp = plist;

    while (!all_done) {
        all_done = 1;
        sched_proc_nr = 0;
        for (rqp = rqueue; rqp; rqp = rqp->next) {
            if (rqp->idle) {
                exit_codes += rqp->exit_code;
                rqp->exit_code = 0;
                if (pp) {
                    WaitForSingleObject(run_mutex, INFINITE);
                    rqp->idle = 0;
                    ReleaseMutex(run_mutex);
                    set_hefesto_rqueue_ctx_path_to_run(rqp, pp->data, pp->dsize);
                    if (hvm_thread_create(&rqp->id, hefesto_async_run,
                                          rqp) == 0) {
                        hlsc_info(HLSCM_MTYPE_RUNTIME,
                                  HLSCM_RUNTIME_ERROR_RQUEUE_THREAD_CREATION,
                                  rqp->path_to_run);
                    } else {
                        sched_proc_nr++;
                    }
                    pp = pp->next;
                    if (pp == NULL) break;
                }
            } else {
                sched_proc_nr++;
            }
        }
        all_done = (sched_proc_nr == 0);
    }

    del_hefesto_rqueue_ctx(rqueue);

    return exit_codes;

#else  // HEFESTO_TGT_OS == X

    return 1;

#endif  // HEFESTO_TGT_OS == X

}