glib-aux: add int64/uint64 types to NMValueType

This commit is contained in:
Thomas Haller 2021-04-09 14:29:20 +02:00
parent 6107a94085
commit 9a2c47fc34
No known key found for this signature in database
GPG key ID: 29C2366E4DFC5728
2 changed files with 86 additions and 2 deletions

View file

@ -33,6 +33,12 @@ nm_json_gstr_append_int64(GString *gstr, gint64 v)
g_string_append_printf(gstr, "%" G_GINT64_FORMAT, v);
}
static inline void
nm_json_gstr_append_uint64(GString *gstr, guint64 v)
{
g_string_append_printf(gstr, "%" G_GUINT64_FORMAT, v);
}
void nm_json_gstr_append_obj_name(GString *gstr, const char *key, char start_container);
/*****************************************************************************/
@ -239,6 +245,44 @@ nm_jansson_json_as_int(const NMJsonVt *vt, const nm_json_t *elem, int *out_val)
return 1;
}
static inline int
nm_jansson_json_as_int64(const NMJsonVt *vt, const nm_json_t *elem, gint64 *out_val)
{
nm_json_int_t v;
if (!elem)
return 0;
if (!nm_json_is_integer(elem))
return -EINVAL;
v = vt->nm_json_integer_value(elem);
if (v < G_MININT64 || v > G_MAXINT64)
return -ERANGE;
NM_SET_OUT(out_val, v);
return 1;
}
static inline int
nm_jansson_json_as_uint64(const NMJsonVt *vt, const nm_json_t *elem, guint64 *out_val)
{
nm_json_int_t v;
if (!elem)
return 0;
if (!nm_json_is_integer(elem))
return -EINVAL;
v = vt->nm_json_integer_value(elem);
if (v < 0 || v > G_MAXUINT64)
return -ERANGE;
NM_SET_OUT(out_val, v);
return 1;
}
static inline int
nm_jansson_json_as_string(const NMJsonVt *vt, const nm_json_t *elem, const char **out_val)
{
@ -272,6 +316,12 @@ nm_value_type_to_json(NMValueType value_type, GString *gstr, gconstpointer p_fie
case NM_VALUE_TYPE_INT:
nm_json_gstr_append_int64(gstr, *((const int *) p_field));
return;
case NM_VALUE_TYPE_INT64:
nm_json_gstr_append_int64(gstr, *((const gint64 *) p_field));
return;
case NM_VALUE_TYPE_UINT64:
nm_json_gstr_append_uint64(gstr, *((const guint64 *) p_field));
return;
case NM_VALUE_TYPE_STRING:
nm_json_gstr_append_string(gstr, *((const char *const *) p_field));
return;
@ -294,6 +344,10 @@ nm_value_type_from_json(const NMJsonVt * vt,
return (nm_jansson_json_as_int32(vt, elem, out_val) > 0);
case NM_VALUE_TYPE_INT:
return (nm_jansson_json_as_int(vt, elem, out_val) > 0);
case NM_VALUE_TYPE_INT64:
return (nm_jansson_json_as_int64(vt, elem, out_val) > 0);
case NM_VALUE_TYPE_UINT64:
return (nm_jansson_json_as_uint64(vt, elem, out_val) > 0);
/* warning: this overwrites/leaks the previous value. You better have *out_val
* point to uninitialized memory or NULL. */

View file

@ -6,12 +6,14 @@
#ifndef __NM_VALUE_TYPE_H__
#define __NM_VALUE_TYPE_H__
typedef enum {
typedef enum _nm_packed {
NM_VALUE_TYPE_UNSPEC = 1,
NM_VALUE_TYPE_BOOL = 2,
NM_VALUE_TYPE_INT32 = 3,
NM_VALUE_TYPE_INT = 4,
NM_VALUE_TYPE_STRING = 5,
NM_VALUE_TYPE_INT64 = 5,
NM_VALUE_TYPE_UINT64 = 6,
NM_VALUE_TYPE_STRING = 7,
} NMValueType;
/*****************************************************************************/
@ -21,6 +23,8 @@ typedef enum {
typedef union {
bool v_bool;
gint32 v_int32;
gint64 v_int64;
guint64 v_uint64;
int v_int;
const char *v_string;
@ -78,6 +82,12 @@ nm_value_type_cmp(NMValueType value_type, gconstpointer p_a, gconstpointer p_b)
case NM_VALUE_TYPE_INT:
NM_CMP_DIRECT(*((const int *) p_a), *((const int *) p_b));
return 0;
case NM_VALUE_TYPE_INT64:
NM_CMP_DIRECT(*((const gint64 *) p_a), *((const gint64 *) p_b));
return 0;
case NM_VALUE_TYPE_UINT64:
NM_CMP_DIRECT(*((const guint64 *) p_a), *((const guint64 *) p_b));
return 0;
case NM_VALUE_TYPE_STRING:
return nm_strcmp0(*((const char *const *) p_a), *((const char *const *) p_b));
case NM_VALUE_TYPE_UNSPEC:
@ -106,6 +116,12 @@ nm_value_type_copy(NMValueType value_type, gpointer dst, gconstpointer src)
case NM_VALUE_TYPE_INT:
(*((int *) dst) = *((const int *) src));
return;
case NM_VALUE_TYPE_INT64:
(*((gint64 *) dst) = *((const gint64 *) src));
return;
case NM_VALUE_TYPE_UINT64:
(*((guint64 *) dst) = *((const guint64 *) src));
return;
case NM_VALUE_TYPE_STRING:
/* self assignment safe! */
if (*((char **) dst) != *((const char *const *) src)) {
@ -132,6 +148,12 @@ nm_value_type_get_from_variant(NMValueType value_type,
case NM_VALUE_TYPE_INT32:
*((gint32 *) dst) = g_variant_get_int32(variant);
return;
case NM_VALUE_TYPE_INT64:
*((gint64 *) dst) = g_variant_get_int64(variant);
return;
case NM_VALUE_TYPE_UINT64:
*((guint64 *) dst) = g_variant_get_uint64(variant);
return;
case NM_VALUE_TYPE_STRING:
if (clone) {
g_free(*((char **) dst));
@ -163,6 +185,10 @@ nm_value_type_to_variant(NMValueType value_type, gconstpointer src)
return g_variant_new_boolean(*((const bool *) src));
case NM_VALUE_TYPE_INT32:
return g_variant_new_int32(*((const gint32 *) src));
case NM_VALUE_TYPE_INT64:
return g_variant_new_int64(*((const gint64 *) src));
case NM_VALUE_TYPE_UINT64:
return g_variant_new_uint64(*((const guint64 *) src));
case NM_VALUE_TYPE_STRING:
v_string = *((const char *const *) src);
return v_string ? g_variant_new_string(v_string) : NULL;
@ -187,6 +213,10 @@ nm_value_type_get_variant_type(NMValueType value_type)
return G_VARIANT_TYPE_BOOLEAN;
case NM_VALUE_TYPE_INT32:
return G_VARIANT_TYPE_INT32;
case NM_VALUE_TYPE_INT64:
return G_VARIANT_TYPE_INT64;
case NM_VALUE_TYPE_UINT64:
return G_VARIANT_TYPE_UINT64;
case NM_VALUE_TYPE_STRING:
return G_VARIANT_TYPE_STRING;