static void extract_settings (SolverState *state) { GnmSolverParameters *param = state->sheet->solver_parameters; GtkTreeIter iter; GnmValue *target_range; GnmValue *input_range; GnmSolverFactory *factory = NULL; target_range = gnm_expr_entry_parse_as_value (state->target_entry, state->sheet); input_range = gnm_expr_entry_parse_as_value (state->change_cell_entry, state->sheet); gnm_solver_param_set_input (param, input_range); gnm_solver_param_set_target (param, target_range ? &target_range->v_range.cell.a : NULL); param->problem_type = gnm_gui_group_value (state->gui, problem_type_group); param->options.model_type = gnm_gui_group_value (state->gui, model_type_group); if (gtk_combo_box_get_active_iter (state->algorithm_combo, &iter)) { gtk_tree_model_get (gtk_combo_box_get_model (state->algorithm_combo), &iter, 1, &factory, -1); gnm_solver_param_set_algorithm (param, factory); } else gnm_solver_param_set_algorithm (param, NULL); param->options.max_iter = gtk_spin_button_get_value (GTK_SPIN_BUTTON (state->max_iter_entry)); param->options.max_time_sec = gtk_spin_button_get_value (GTK_SPIN_BUTTON (state->max_time_entry)); param->options.gradient_order = gtk_spin_button_get_value (GTK_SPIN_BUTTON (state->gradient_order_entry)); GET_BOOL_ENTRY ("autoscale_button", options.automatic_scaling); GET_BOOL_ENTRY ("non_neg_button", options.assume_non_negative); GET_BOOL_ENTRY ("all_int_button", options.assume_discrete); GET_BOOL_ENTRY ("program", options.program_report); GET_BOOL_ENTRY ("sensitivity", options.sensitivity_report); g_free (param->options.scenario_name); param->options.scenario_name = g_strdup (gtk_entry_get_text (GTK_ENTRY (state->scenario_name_entry))); GET_BOOL_ENTRY ("optimal_scenario", options.add_scenario); value_release (target_range); }
/************************************************************************************************************* ** @brief : Load all watch's in ini file ** #conf : ini file dictionary ** #watch : parser ini configure file data ** @return : how many item in conf file *************************************************************************************************************/ int conf_init(dictionary *conf, P_WATCH_INFO watch, const unsigned int size) { char entry[64]; char *cp = NULL; unsigned int i; #define GET_INT_ENTRY(v, d) do { v = iniparser_getint(conf, entry, (d)); } while(0) #define GET_BOOL_ENTRY(v, d) do { v = iniparser_getboolean(conf, entry, (d)); } while(0) #define GET_STR_ENTRY(s, d) do { cp = iniparser_getstring(conf, entry, (d)); bcopy(cp, s, strlen(cp)); } while (0) #define FORMAT_ENTRY(s, k) do { bzero(entry, sizeof(entry)); snprintf(entry, sizeof(entry), "%s:%s", (s), (k)); } while(0) /* Debug print all conf */ if (debug){ iniparser_dump(conf, stderr); } /* Get section name's */ for (i = 0; i < size; i++){ cp = iniparser_getsecname(conf, i); bcopy(cp, watch[i].name, strlen(cp)); } /* Get each of them data */ for (i = 0; i < size; i++){ /* Ignore ? */ FORMAT_ENTRY(watch[i].name, IGNORE_KEY); GET_BOOL_ENTRY(watch[i].ignore, 0); /* If ignore, do not read jump to next */ if (watch[i].ignore){ continue; } /* Path */ FORMAT_ENTRY(watch[i].name, PATH_KEY); GET_STR_ENTRY(watch[i].path, ""); /* Check if path is dir set is_dir mark */ watch[i].is_dir = conf_is_path_is_dir(watch[i].path); /* Comment */ FORMAT_ENTRY(watch[i].name, COMMENT_KEY); GET_STR_ENTRY(watch[i].comment, ""); /* Find if setting special file */ FORMAT_ENTRY(watch[i].name, SPECIAL_KEY); /* Only dir have this option */ if (watch[i].is_dir && iniparser_find_entry(conf, entry)){ /* Read form ini file */ if ((cp = iniparser_getstring(conf, entry, ""))){ /* Get special file name */ watch[i].spc_file_cnt = conf_get_words(cp, watch[i].spc_file, MAX_SPC_FILE); } } /* events */ FORMAT_ENTRY(watch[i].name, EVENTS_KEY); GET_STR_ENTRY(watch[i].events_str, ""); /* Parser events */ watch[i].events = conf_parser_events(watch[i].events_str, watch[i].is_dir); /* Debug */ if (debug){ conf_print_watch(&watch[i]); } } /* end for */ /* Arrange watching list */ return conf_arrange_watch(watch, (i == size) ? size : i); }