diff options
Diffstat (limited to 'libglusterfs/src')
| -rw-r--r-- | libglusterfs/src/dict.c | 96 | ||||
| -rw-r--r-- | libglusterfs/src/dict.h | 3 | 
2 files changed, 99 insertions, 0 deletions
diff --git a/libglusterfs/src/dict.c b/libglusterfs/src/dict.c index eb181f191c3..02c9e6062e3 100644 --- a/libglusterfs/src/dict.c +++ b/libglusterfs/src/dict.c @@ -810,6 +810,31 @@ data_from_uint64 (uint64_t value)  	return data;  } +static data_t * +data_from_double (double value) +{ +	data_t *data = NULL; +	int     ret  = 0; + +	data = get_new_data (); + +	if (!data) { +		gf_log ("dict", GF_LOG_CRITICAL, +			"@data - NULL returned by CALLOC"); +		return NULL; +	} + +	ret = asprintf (&data->data, "%f", value); +	if (ret == -1) { +		gf_log ("dict", GF_LOG_CRITICAL, +			"@data - allocation failed by ASPRINTF"); +		return NULL; +	} +	data->len = strlen (data->data) + 1; + +	return data; +} +  data_t *  data_from_uint32 (uint32_t value) @@ -1410,6 +1435,34 @@ err:  	return ret;  } +static int +_data_to_double (data_t *data, double *val) +{ +	int    ret = 0; +	char * str = NULL; + +	if (!data || !val) { +		ret = -EINVAL; +		goto err; +	} + +	str = alloca (data->len + 1); +	if (!str) { +		ret = -ENOMEM; +		goto err; +	} +	memcpy (str, data->data, data->len); +	str[data->len] = '\0'; + +	errno = 0; +	*val = strtod (str, NULL); +	if (errno != 0) +		ret = -errno; + +err: +	return ret; +} +  int  dict_get_int8 (dict_t *this, char *key, int8_t *val)  { @@ -1650,6 +1703,7 @@ err:  } +  int  dict_set_uint32 (dict_t *this, char *key, uint32_t val)  { @@ -1712,6 +1766,48 @@ err:  }  int +dict_get_double (dict_t *this, char *key, double *val) +{ +	data_t *data = NULL; +	int     ret  = 0; + +	if (!this || !key || !val) { +		ret = -EINVAL; +		goto err; +	} + +	ret = dict_get_with_ref (this, key, &data); +	if (ret != 0) { +		goto err; +	} + +	ret = _data_to_double (data, val); +     +err: +	if (data) +		data_unref (data); +	return ret; +} + +int +dict_set_double (dict_t *this, char *key, double val) +{ +	data_t * data = NULL; +	int      ret  = 0; + +	data = data_from_double (val); +	if (!data) { +		ret = -EINVAL; +		goto err; +	} + +	ret = dict_set (this, key, data); + +err: +	return ret; +} + +int  dict_set_static_ptr (dict_t *this, char *key, void *ptr)  {  	data_t * data = NULL; diff --git a/libglusterfs/src/dict.h b/libglusterfs/src/dict.h index 5c299d039e6..896daee08ed 100644 --- a/libglusterfs/src/dict.h +++ b/libglusterfs/src/dict.h @@ -163,6 +163,9 @@ GF_MUST_CHECK int dict_set_uint32 (dict_t *this, char *key, uint32_t val);  GF_MUST_CHECK int dict_get_uint64 (dict_t *this, char *key, uint64_t *val);  GF_MUST_CHECK int dict_set_uint64 (dict_t *this, char *key, uint64_t val); +GF_MUST_CHECK int dict_get_double (dict_t *this, char *key, double *val); +GF_MUST_CHECK int dict_set_double (dict_t *this, char *key, double val); +  GF_MUST_CHECK int dict_set_static_ptr (dict_t *this, char *key, void *ptr);  GF_MUST_CHECK int dict_get_ptr (dict_t *this, char *key, void **ptr);  GF_MUST_CHECK int dict_set_ptr (dict_t *this, char *key, void *ptr);  | 
