/** * \fn int xml_node_get_uint_with_default (xmlNode *node, const xmlChar *prop, \ * unsigned int default_value, int *error_code) * \brief Function to get an unsigned integer number of a XML node property with * a default value. * \param node * \brief XML node. * \param prop * \brief XML property. * \param default_value * \brief default value. * \param error_code * \brief Error code. * \return Unsigned integer number value. */ unsigned int xml_node_get_uint_with_default (xmlNode * node, const xmlChar * prop, unsigned int default_value, int *error_code) { unsigned int i; if (xmlHasProp (node, prop)) i = xml_node_get_uint (node, prop, error_code); else { i = default_value; *error_code = 0; } return i; }
/** * \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; }