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; }
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; }
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 }