/** De-allocates the interface/variables memory allocated using module_alloc * */ int module_free(module_t *module) { int i; mdebug("module_id=%d\n",module->id); if (!module) return -1; if (module->inputs) { if (pool_free(module->inputs)) return -1; module->inputs = NULL; } if (module->outputs) { if (pool_free(module->outputs)) return -1; module->outputs = NULL; } if (module->variables) { for (i=0;i<module->nof_variables;i++) { if (variable_free(&module->variables[i])) { return -1; } } if (pool_free(module->variables)) return -1; module->variables = NULL; } module->nof_inputs = 0; module->nof_outputs = 0; module->nof_variables = 0; return 0; }
/* * remove watch */ void remove_watch(gchar* internal) { GList *iter = watches; while (iter) { variable *var = (variable*)iter->data; if (!strcmp(var->internal->str, internal)) { gchar command[1000]; sprintf(command, "-var-delete %s", internal); exec_sync_command(command, TRUE, NULL); variable_free(var); watches = g_list_delete_link(watches, iter); } iter = iter->next; } }
/** * \fn int variable_open_xml (Variable * variable, xmlNode * node, \ * unsigned int algorithm, unsigned int nsteps) * \brief Function to open the variable file. * \param variable * \brief Variable struct. * \param node * \brief XML node. * \param algorithm * \brief Algorithm type. * \param nsteps * \brief Number of steps to do the direction search method. * \return 1 on success, 0 on error. */ int variable_open_xml (Variable * variable, xmlNode * node, unsigned int algorithm, unsigned int nsteps) { int error_code; #if DEBUG_VARIABLE fprintf (stderr, "variable_open_xml: start\n"); #endif variable->name = (char *) xmlGetProp (node, (const xmlChar *) LABEL_NAME); if (!variable->name) { variable_error (variable, gettext ("no name")); goto exit_on_error; } if (xmlHasProp (node, (const xmlChar *) LABEL_MINIMUM)) { variable->rangemin = xml_node_get_float (node, (const xmlChar *) LABEL_MINIMUM, &error_code); if (error_code) { variable_error (variable, gettext ("bad minimum")); goto exit_on_error; } variable->rangeminabs = xml_node_get_float_with_default (node, (const xmlChar *) LABEL_ABSOLUTE_MINIMUM, -G_MAXDOUBLE, &error_code); if (error_code) { variable_error (variable, gettext ("bad absolute minimum")); goto exit_on_error; } if (variable->rangemin < variable->rangeminabs) { variable_error (variable, gettext ("minimum range not allowed")); goto exit_on_error; } } else { variable_error (variable, gettext ("no minimum range")); goto exit_on_error; } if (xmlHasProp (node, (const xmlChar *) LABEL_MAXIMUM)) { variable->rangemax = xml_node_get_float (node, (const xmlChar *) LABEL_MAXIMUM, &error_code); if (error_code) { variable_error (variable, gettext ("bad maximum")); goto exit_on_error; } variable->rangemaxabs = xml_node_get_float_with_default (node, (const xmlChar *) LABEL_ABSOLUTE_MAXIMUM, G_MAXDOUBLE, &error_code); if (error_code) { variable_error (variable, gettext ("bad absolute maximum")); goto exit_on_error; } if (variable->rangemax > variable->rangemaxabs) { variable_error (variable, gettext ("maximum range not allowed")); goto exit_on_error; } if (variable->rangemax < variable->rangemin) { variable_error (variable, gettext ("bad range")); goto exit_on_error; } } else { variable_error (variable, gettext ("no maximum range")); goto exit_on_error; } variable->precision = xml_node_get_uint_with_default (node, (const xmlChar *) LABEL_PRECISION, DEFAULT_PRECISION, &error_code); if (error_code || variable->precision >= NPRECISIONS) { variable_error (variable, gettext ("bad precision")); goto exit_on_error; } if (algorithm == ALGORITHM_SWEEP) { if (xmlHasProp (node, (const xmlChar *) LABEL_NSWEEPS)) { variable->nsweeps = xml_node_get_uint (node, (const xmlChar *) LABEL_NSWEEPS, &error_code); if (error_code || !variable->nsweeps) { variable_error (variable, gettext ("bad sweeps")); goto exit_on_error; } } else { variable_error (variable, gettext ("no sweeps number")); goto exit_on_error; } #if DEBUG_VARIABLE fprintf (stderr, "variable_open_xml: nsweeps=%u\n", variable->nsweeps); #endif } if (algorithm == ALGORITHM_GENETIC) { // Obtaining bits representing each variable if (xmlHasProp (node, (const xmlChar *) LABEL_NBITS)) { variable->nbits = xml_node_get_uint (node, (const xmlChar *) LABEL_NBITS, &error_code); if (error_code || !variable->nbits) { variable_error (variable, gettext ("invalid bits number")); goto exit_on_error; } } else { variable_error (variable, gettext ("no bits number")); goto exit_on_error; } } else if (nsteps) { variable->step = xml_node_get_float (node, (const xmlChar *) LABEL_STEP, &error_code); if (error_code || variable->step < 0.) { variable_error (variable, gettext ("bad step size")); goto exit_on_error; } } #if DEBUG_VARIABLE fprintf (stderr, "variable_open_xml: end\n"); #endif return 1; exit_on_error: variable_free (variable, INPUT_TYPE_XML); #if DEBUG_VARIABLE fprintf (stderr, "variable_open_xml: end\n"); #endif return 0; }
/** * \fn int variable_open_json (Variable * variable, JsonNode * node, \ * unsigned int algorithm, unsigned int nsteps) * \brief Function to open the variable file. * \param variable * \brief Variable struct. * \param node * \brief XML node. * \param algorithm * \brief Algorithm type. * \param nsteps * \brief Number of steps to do the direction search method. * \return 1 on success, 0 on error. */ int variable_open_json (Variable * variable, JsonNode * node, unsigned int algorithm, unsigned int nsteps) { JsonObject *object; const char *label; int error_code; #if DEBUG_VARIABLE fprintf (stderr, "variable_open_json: start\n"); #endif object = json_node_get_object (node); label = json_object_get_string_member (object, LABEL_NAME); if (!label) { variable_error (variable, gettext ("no name")); goto exit_on_error; } variable->name = g_strdup (label); if (json_object_get_member (object, LABEL_MINIMUM)) { variable->rangemin = json_object_get_float (object, LABEL_MINIMUM, &error_code); if (error_code) { variable_error (variable, gettext ("bad minimum")); goto exit_on_error; } variable->rangeminabs = json_object_get_float_with_default (object, LABEL_ABSOLUTE_MINIMUM, -G_MAXDOUBLE, &error_code); if (error_code) { variable_error (variable, gettext ("bad absolute minimum")); goto exit_on_error; } if (variable->rangemin < variable->rangeminabs) { variable_error (variable, gettext ("minimum range not allowed")); goto exit_on_error; } } else { variable_error (variable, gettext ("no minimum range")); goto exit_on_error; } if (json_object_get_member (object, LABEL_MAXIMUM)) { variable->rangemax = json_object_get_float (object, LABEL_MAXIMUM, &error_code); if (error_code) { variable_error (variable, gettext ("bad maximum")); goto exit_on_error; } variable->rangemaxabs = json_object_get_float_with_default (object, LABEL_ABSOLUTE_MAXIMUM, G_MAXDOUBLE, &error_code); if (error_code) { variable_error (variable, gettext ("bad absolute maximum")); goto exit_on_error; } if (variable->rangemax > variable->rangemaxabs) { variable_error (variable, gettext ("maximum range not allowed")); goto exit_on_error; } if (variable->rangemax < variable->rangemin) { variable_error (variable, gettext ("bad range")); goto exit_on_error; } } else { variable_error (variable, gettext ("no maximum range")); goto exit_on_error; } variable->precision = json_object_get_uint_with_default (object, LABEL_PRECISION, DEFAULT_PRECISION, &error_code); if (error_code || variable->precision >= NPRECISIONS) { variable_error (variable, gettext ("bad precision")); goto exit_on_error; } if (algorithm == ALGORITHM_SWEEP) { if (json_object_get_member (object, LABEL_NSWEEPS)) { variable->nsweeps = json_object_get_uint (object, LABEL_NSWEEPS, &error_code); if (error_code || !variable->nsweeps) { variable_error (variable, gettext ("bad sweeps")); goto exit_on_error; } } else { variable_error (variable, gettext ("no sweeps number")); goto exit_on_error; } #if DEBUG_VARIABLE fprintf (stderr, "variable_open_json: nsweeps=%u\n", variable->nsweeps); #endif } if (algorithm == ALGORITHM_GENETIC) { // Obtaining bits representing each variable if (json_object_get_member (object, LABEL_NBITS)) { variable->nbits = json_object_get_uint (object, LABEL_NBITS, &error_code); if (error_code || !variable->nbits) { variable_error (variable, gettext ("invalid bits number")); goto exit_on_error; } } else { variable_error (variable, gettext ("no bits number")); goto exit_on_error; } } else if (nsteps) { variable->step = json_object_get_float (object, LABEL_STEP, &error_code); if (error_code || variable->step < 0.) { variable_error (variable, gettext ("bad step size")); goto exit_on_error; } } #if DEBUG_VARIABLE fprintf (stderr, "variable_open_json: end\n"); #endif return 1; exit_on_error: variable_free (variable, INPUT_TYPE_JSON); #if DEBUG_VARIABLE fprintf (stderr, "variable_open_json: end\n"); #endif return 0; }
void variables_remove(variable_t *v) { variables = g_slist_remove(variables, v); variable_free(v); }