/** * \fn double json_object_get_float_with_default (JsonObject *object, \ * const char *prop, double default_value, int *error_code) * \brief Function to get a floating point number of a JSON object property with * a default value. * \param object * \brief JSON object. * \param prop * \brief JSON property. * \param default_value * \brief default value. * \param error_code * \brief Error code. * \return Floating point number value. */ double json_object_get_float_with_default (JsonObject * object, const char *prop, double default_value, int *error_code) { double x; if (json_object_get_member (object, prop)) x = json_object_get_float (object, prop, error_code); else { x = default_value; *error_code = 0; } return x; }
/** * \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; }