|
Packit Service |
b23acc |
// SPDX-License-Identifier: LGPL-2.1+
|
|
Packit Service |
b23acc |
/*
|
|
Packit Service |
b23acc |
* Copyright (C) 2017 Red Hat, Inc.
|
|
Packit Service |
b23acc |
*/
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
#include "nm-default.h"
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
#include "nm-enum-utils.h"
|
|
Packit Service |
b23acc |
#include "nm-str-buf.h"
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
/*****************************************************************************/
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
#define IS_FLAGS_SEPARATOR(ch) (NM_IN_SET ((ch), ' ', '\t', ',', '\n', '\r'))
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
static void
|
|
Packit Service |
b23acc |
_ASSERT_enum_values_info (GType type,
|
|
Packit Service |
b23acc |
const NMUtilsEnumValueInfo *value_infos)
|
|
Packit Service |
b23acc |
{
|
|
Packit Service |
b23acc |
#if NM_MORE_ASSERTS > 5
|
|
Packit Service |
b23acc |
nm_auto_unref_gtypeclass GTypeClass *klass = NULL;
|
|
Packit Service |
b23acc |
gs_unref_hashtable GHashTable *ht = NULL;
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
klass = g_type_class_ref (type);
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
g_assert (G_IS_ENUM_CLASS (klass) || G_IS_FLAGS_CLASS (klass));
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
if (!value_infos)
|
|
Packit Service |
b23acc |
return;
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
ht = g_hash_table_new (g_str_hash, g_str_equal);
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
for (; value_infos->nick; value_infos++) {
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
g_assert (value_infos->nick[0]);
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
/* duplicate nicks make no sense!! */
|
|
Packit Service |
b23acc |
g_assert (!g_hash_table_contains (ht, value_infos->nick));
|
|
Packit Service |
b23acc |
g_hash_table_add (ht, (gpointer) value_infos->nick);
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
if (G_IS_ENUM_CLASS (klass)) {
|
|
Packit Service |
b23acc |
GEnumValue *enum_value;
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
enum_value = g_enum_get_value_by_nick (G_ENUM_CLASS (klass), value_infos->nick);
|
|
Packit Service |
b23acc |
if (enum_value) {
|
|
Packit Service |
b23acc |
/* we do allow specifying the same name via @value_infos and @type.
|
|
Packit Service |
b23acc |
* That might make sense, if @type comes from a library where older versions
|
|
Packit Service |
b23acc |
* of the library don't yet support the value. In this case, the caller can
|
|
Packit Service |
b23acc |
* provide the nick via @value_infos, to support the older library version.
|
|
Packit Service |
b23acc |
* And then, when actually running against a newer library version where
|
|
Packit Service |
b23acc |
* @type knows the nick, we have this situation.
|
|
Packit Service |
b23acc |
*
|
|
Packit Service |
b23acc |
* Another reason for specifying a nick both in @value_infos and @type,
|
|
Packit Service |
b23acc |
* is to specify an alias which is not used with highest preference. For
|
|
Packit Service |
b23acc |
* example, if you add an alias "disabled" for "none" (both numerically
|
|
Packit Service |
b23acc |
* equal), then the first alias in @value_infos will be preferred over
|
|
Packit Service |
b23acc |
* the name from @type. So, to still use "none" as preferred name, you may
|
|
Packit Service |
b23acc |
* explicitly specify the "none" alias in @value_infos before "disabled".
|
|
Packit Service |
b23acc |
*
|
|
Packit Service |
b23acc |
* However, what never is allowed, is to use a name (nick) to re-number
|
|
Packit Service |
b23acc |
* the value. That is, if both @value_infos and @type contain a particular
|
|
Packit Service |
b23acc |
* nick, their numeric values must agree as well.
|
|
Packit Service |
b23acc |
* Allowing this, would be very confusing, because the name would have a different
|
|
Packit Service |
b23acc |
* value from the regular GLib GEnum API.
|
|
Packit Service |
b23acc |
*/
|
|
Packit Service |
b23acc |
g_assert (enum_value->value == value_infos->value);
|
|
Packit Service |
b23acc |
}
|
|
Packit Service |
b23acc |
} else {
|
|
Packit Service |
b23acc |
GFlagsValue *flags_value;
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
flags_value = g_flags_get_value_by_nick (G_FLAGS_CLASS (klass), value_infos->nick);
|
|
Packit Service |
b23acc |
if (flags_value) {
|
|
Packit Service |
b23acc |
/* see ENUM case above. */
|
|
Packit Service |
b23acc |
g_assert (flags_value->value == (guint) value_infos->value);
|
|
Packit Service |
b23acc |
}
|
|
Packit Service |
b23acc |
}
|
|
Packit Service |
b23acc |
}
|
|
Packit Service |
b23acc |
#endif
|
|
Packit Service |
b23acc |
}
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
static gboolean
|
|
Packit Service |
b23acc |
_is_hex_string (const char *str)
|
|
Packit Service |
b23acc |
{
|
|
Packit Service |
b23acc |
return str[0] == '0'
|
|
Packit Service |
b23acc |
&& str[1] == 'x'
|
|
Packit Service |
b23acc |
&& str[2]
|
|
Packit Service |
b23acc |
&& NM_STRCHAR_ALL (&str[2], ch, g_ascii_isxdigit (ch));
|
|
Packit Service |
b23acc |
}
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
static gboolean
|
|
Packit Service |
b23acc |
_is_dec_string (const char *str)
|
|
Packit Service |
b23acc |
{
|
|
Packit Service |
b23acc |
return str[0]
|
|
Packit Service |
b23acc |
&& NM_STRCHAR_ALL (&str[0], ch, g_ascii_isdigit (ch));
|
|
Packit Service |
b23acc |
}
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
static gboolean
|
|
Packit Service |
b23acc |
_enum_is_valid_enum_nick (const char *str)
|
|
Packit Service |
b23acc |
{
|
|
Packit Service |
b23acc |
return str[0]
|
|
Packit Service |
b23acc |
&& !NM_STRCHAR_ANY (str, ch, g_ascii_isspace (ch))
|
|
Packit Service |
b23acc |
&& !_is_dec_string (str)
|
|
Packit Service |
b23acc |
&& !_is_hex_string (str);
|
|
Packit Service |
b23acc |
}
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
static gboolean
|
|
Packit Service |
b23acc |
_enum_is_valid_flags_nick (const char *str)
|
|
Packit Service |
b23acc |
{
|
|
Packit Service |
b23acc |
return str[0]
|
|
Packit Service |
b23acc |
&& !NM_STRCHAR_ANY (str, ch, IS_FLAGS_SEPARATOR (ch))
|
|
Packit Service |
b23acc |
&& !_is_dec_string (str)
|
|
Packit Service |
b23acc |
&& !_is_hex_string (str);
|
|
Packit Service |
b23acc |
}
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
char *
|
|
Packit Service |
b23acc |
_nm_utils_enum_to_str_full (GType type,
|
|
Packit Service |
b23acc |
int value,
|
|
Packit Service |
b23acc |
const char *flags_separator,
|
|
Packit Service |
b23acc |
const NMUtilsEnumValueInfo *value_infos)
|
|
Packit Service |
b23acc |
{
|
|
Packit Service |
b23acc |
nm_auto_unref_gtypeclass GTypeClass *klass = NULL;
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
_ASSERT_enum_values_info (type, value_infos);
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
if ( flags_separator
|
|
Packit Service |
b23acc |
&& ( !flags_separator[0]
|
|
Packit Service |
b23acc |
|| NM_STRCHAR_ANY (flags_separator, ch, !IS_FLAGS_SEPARATOR (ch))))
|
|
Packit Service |
b23acc |
g_return_val_if_reached (NULL);
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
klass = g_type_class_ref (type);
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
if (G_IS_ENUM_CLASS (klass)) {
|
|
Packit Service |
b23acc |
GEnumValue *enum_value;
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
for ( ; value_infos && value_infos->nick; value_infos++) {
|
|
Packit Service |
b23acc |
if (value_infos->value == value)
|
|
Packit Service |
b23acc |
return g_strdup (value_infos->nick);
|
|
Packit Service |
b23acc |
}
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
enum_value = g_enum_get_value (G_ENUM_CLASS (klass), value);
|
|
Packit Service |
b23acc |
if ( !enum_value
|
|
Packit Service |
b23acc |
|| !_enum_is_valid_enum_nick (enum_value->value_nick))
|
|
Packit Service |
b23acc |
return g_strdup_printf ("%d", value);
|
|
Packit Service |
b23acc |
else
|
|
Packit Service |
b23acc |
return g_strdup (enum_value->value_nick);
|
|
Packit Service |
b23acc |
} else if (G_IS_FLAGS_CLASS (klass)) {
|
|
Packit Service |
b23acc |
unsigned uvalue = (unsigned) value;
|
|
Packit Service |
b23acc |
GFlagsValue *flags_value;
|
|
Packit Service |
b23acc |
NMStrBuf strbuf;
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
flags_separator = flags_separator ?: " ";
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
nm_str_buf_init (&strbuf, 16, FALSE);
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
for ( ; value_infos && value_infos->nick; value_infos++) {
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
nm_assert (_enum_is_valid_flags_nick (value_infos->nick));
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
if (uvalue == 0) {
|
|
Packit Service |
b23acc |
if (value_infos->value != 0)
|
|
Packit Service |
b23acc |
continue;
|
|
Packit Service |
b23acc |
} else {
|
|
Packit Service |
b23acc |
if (!NM_FLAGS_ALL (uvalue, (unsigned) value_infos->value))
|
|
Packit Service |
b23acc |
continue;
|
|
Packit Service |
b23acc |
}
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
if (strbuf.len)
|
|
Packit Service |
b23acc |
nm_str_buf_append (&strbuf, flags_separator);
|
|
Packit Service |
b23acc |
nm_str_buf_append (&strbuf, value_infos->nick);
|
|
Packit Service |
b23acc |
uvalue &= ~((unsigned) value_infos->value);
|
|
Packit Service |
b23acc |
if (uvalue == 0) {
|
|
Packit Service |
b23acc |
/* we printed all flags. Done. */
|
|
Packit Service |
b23acc |
goto flags_done;
|
|
Packit Service |
b23acc |
}
|
|
Packit Service |
b23acc |
}
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
do {
|
|
Packit Service |
b23acc |
flags_value = g_flags_get_first_value (G_FLAGS_CLASS (klass), uvalue);
|
|
Packit Service |
b23acc |
if (strbuf.len)
|
|
Packit Service |
b23acc |
nm_str_buf_append (&strbuf, flags_separator);
|
|
Packit Service |
b23acc |
if ( !flags_value
|
|
Packit Service |
b23acc |
|| !_enum_is_valid_flags_nick (flags_value->value_nick)) {
|
|
Packit Service |
b23acc |
if (uvalue)
|
|
Packit Service |
b23acc |
nm_str_buf_append_printf (&strbuf, "0x%x", uvalue);
|
|
Packit Service |
b23acc |
break;
|
|
Packit Service |
b23acc |
}
|
|
Packit Service |
b23acc |
nm_str_buf_append (&strbuf, flags_value->value_nick);
|
|
Packit Service |
b23acc |
uvalue &= ~flags_value->value;
|
|
Packit Service |
b23acc |
} while (uvalue);
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
flags_done:
|
|
Packit Service |
b23acc |
return nm_str_buf_finalize (&strbuf, NULL);
|
|
Packit Service |
b23acc |
}
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
g_return_val_if_reached (NULL);
|
|
Packit Service |
b23acc |
}
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
static const NMUtilsEnumValueInfo *
|
|
Packit Service |
b23acc |
_find_value_info (const NMUtilsEnumValueInfo *value_infos, const char *needle)
|
|
Packit Service |
b23acc |
{
|
|
Packit Service |
b23acc |
if (value_infos) {
|
|
Packit Service |
b23acc |
for (; value_infos->nick; value_infos++) {
|
|
Packit Service |
b23acc |
if (nm_streq (needle, value_infos->nick))
|
|
Packit Service |
b23acc |
return value_infos;
|
|
Packit Service |
b23acc |
}
|
|
Packit Service |
b23acc |
}
|
|
Packit Service |
b23acc |
return NULL;
|
|
Packit Service |
b23acc |
}
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
gboolean
|
|
Packit Service |
b23acc |
_nm_utils_enum_from_str_full (GType type,
|
|
Packit Service |
b23acc |
const char *str,
|
|
Packit Service |
b23acc |
int *out_value,
|
|
Packit Service |
b23acc |
char **err_token,
|
|
Packit Service |
b23acc |
const NMUtilsEnumValueInfo *value_infos)
|
|
Packit Service |
b23acc |
{
|
|
Packit Service |
b23acc |
nm_auto_unref_gtypeclass GTypeClass *klass = NULL;
|
|
Packit Service |
b23acc |
gboolean ret = FALSE;
|
|
Packit Service |
b23acc |
int value = 0;
|
|
Packit Service |
b23acc |
gs_free char *str_clone = NULL;
|
|
Packit Service |
b23acc |
char *s;
|
|
Packit Service |
b23acc |
gint64 v64;
|
|
Packit Service |
b23acc |
const NMUtilsEnumValueInfo *nick;
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
g_return_val_if_fail (str, FALSE);
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
_ASSERT_enum_values_info (type, value_infos);
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
str_clone = strdup (str);
|
|
Packit Service |
b23acc |
s = nm_str_skip_leading_spaces (str_clone);
|
|
Packit Service |
b23acc |
g_strchomp (s);
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
klass = g_type_class_ref (type);
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
if (G_IS_ENUM_CLASS (klass)) {
|
|
Packit Service |
b23acc |
GEnumValue *enum_value;
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
if (s[0]) {
|
|
Packit Service |
b23acc |
if (_is_hex_string (s)) {
|
|
Packit Service |
b23acc |
v64 = _nm_utils_ascii_str_to_int64 (s, 16, 0, G_MAXUINT, -1);
|
|
Packit Service |
b23acc |
if (v64 != -1) {
|
|
Packit Service |
b23acc |
value = (int) v64;
|
|
Packit Service |
b23acc |
ret = TRUE;
|
|
Packit Service |
b23acc |
}
|
|
Packit Service |
b23acc |
} else if (_is_dec_string (s)) {
|
|
Packit Service |
b23acc |
v64 = _nm_utils_ascii_str_to_int64 (s, 10, 0, G_MAXUINT, -1);
|
|
Packit Service |
b23acc |
if (v64 != -1) {
|
|
Packit Service |
b23acc |
value = (int) v64;
|
|
Packit Service |
b23acc |
ret = TRUE;
|
|
Packit Service |
b23acc |
}
|
|
Packit Service |
b23acc |
} else if ((nick = _find_value_info (value_infos, s))) {
|
|
Packit Service |
b23acc |
value = nick->value;
|
|
Packit Service |
b23acc |
ret = TRUE;
|
|
Packit Service |
b23acc |
} else if ((enum_value = g_enum_get_value_by_nick (G_ENUM_CLASS (klass), s))) {
|
|
Packit Service |
b23acc |
value = enum_value->value;
|
|
Packit Service |
b23acc |
ret = TRUE;
|
|
Packit Service |
b23acc |
}
|
|
Packit Service |
b23acc |
}
|
|
Packit Service |
b23acc |
} else if (G_IS_FLAGS_CLASS (klass)) {
|
|
Packit Service |
b23acc |
GFlagsValue *flags_value;
|
|
Packit Service |
b23acc |
unsigned uvalue = 0;
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
ret = TRUE;
|
|
Packit Service |
b23acc |
while (s[0]) {
|
|
Packit Service |
b23acc |
char *s_end;
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
for (s_end = s; s_end[0]; s_end++) {
|
|
Packit Service |
b23acc |
if (IS_FLAGS_SEPARATOR (s_end[0])) {
|
|
Packit Service |
b23acc |
s_end[0] = '\0';
|
|
Packit Service |
b23acc |
s_end++;
|
|
Packit Service |
b23acc |
break;
|
|
Packit Service |
b23acc |
}
|
|
Packit Service |
b23acc |
}
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
if (s[0]) {
|
|
Packit Service |
b23acc |
if (_is_hex_string (s)) {
|
|
Packit Service |
b23acc |
v64 = _nm_utils_ascii_str_to_int64 (&s[2], 16, 0, G_MAXUINT, -1);
|
|
Packit Service |
b23acc |
if (v64 == -1) {
|
|
Packit Service |
b23acc |
ret = FALSE;
|
|
Packit Service |
b23acc |
break;
|
|
Packit Service |
b23acc |
}
|
|
Packit Service |
b23acc |
uvalue |= (unsigned) v64;
|
|
Packit Service |
b23acc |
} else if (_is_dec_string (s)) {
|
|
Packit Service |
b23acc |
v64 = _nm_utils_ascii_str_to_int64 (s, 10, 0, G_MAXUINT, -1);
|
|
Packit Service |
b23acc |
if (v64 == -1) {
|
|
Packit Service |
b23acc |
ret = FALSE;
|
|
Packit Service |
b23acc |
break;
|
|
Packit Service |
b23acc |
}
|
|
Packit Service |
b23acc |
uvalue |= (unsigned) v64;
|
|
Packit Service |
b23acc |
} else if ((nick = _find_value_info (value_infos, s)))
|
|
Packit Service |
b23acc |
uvalue |= (unsigned) nick->value;
|
|
Packit Service |
b23acc |
else if ((flags_value = g_flags_get_value_by_nick (G_FLAGS_CLASS (klass), s)))
|
|
Packit Service |
b23acc |
uvalue |= flags_value->value;
|
|
Packit Service |
b23acc |
else {
|
|
Packit Service |
b23acc |
ret = FALSE;
|
|
Packit Service |
b23acc |
break;
|
|
Packit Service |
b23acc |
}
|
|
Packit Service |
b23acc |
}
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
s = s_end;
|
|
Packit Service |
b23acc |
}
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
value = (int) uvalue;
|
|
Packit Service |
b23acc |
} else
|
|
Packit Service |
b23acc |
g_return_val_if_reached (FALSE);
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
NM_SET_OUT (err_token, !ret && s[0] ? g_strdup (s) : NULL);
|
|
Packit Service |
b23acc |
NM_SET_OUT (out_value, ret ? value : 0);
|
|
Packit Service |
b23acc |
return ret;
|
|
Packit Service |
b23acc |
}
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
const char **
|
|
Packit Service |
b23acc |
_nm_utils_enum_get_values (GType type, int from, int to)
|
|
Packit Service |
b23acc |
{
|
|
Packit Service |
b23acc |
GTypeClass *klass;
|
|
Packit Service |
b23acc |
GPtrArray *array;
|
|
Packit Service |
b23acc |
int i;
|
|
Packit Service |
b23acc |
char sbuf[64];
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
klass = g_type_class_ref (type);
|
|
Packit Service |
b23acc |
array = g_ptr_array_new ();
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
if (G_IS_ENUM_CLASS (klass)) {
|
|
Packit Service |
b23acc |
GEnumClass *enum_class = G_ENUM_CLASS (klass);
|
|
Packit Service |
b23acc |
GEnumValue *enum_value;
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
for (i = 0; i < enum_class->n_values; i++) {
|
|
Packit Service |
b23acc |
enum_value = &enum_class->values[i];
|
|
Packit Service |
b23acc |
if (enum_value->value >= from && enum_value->value <= to) {
|
|
Packit Service |
b23acc |
if (_enum_is_valid_enum_nick (enum_value->value_nick))
|
|
Packit Service |
b23acc |
g_ptr_array_add (array, (gpointer) enum_value->value_nick);
|
|
Packit Service |
b23acc |
else
|
|
Packit Service |
b23acc |
g_ptr_array_add (array, (gpointer) g_intern_string (nm_sprintf_buf (sbuf, "%d", enum_value->value)));
|
|
Packit Service |
b23acc |
}
|
|
Packit Service |
b23acc |
}
|
|
Packit Service |
b23acc |
} else if (G_IS_FLAGS_CLASS (klass)) {
|
|
Packit Service |
b23acc |
GFlagsClass *flags_class = G_FLAGS_CLASS (klass);
|
|
Packit Service |
b23acc |
GFlagsValue *flags_value;
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
for (i = 0; i < flags_class->n_values; i++) {
|
|
Packit Service |
b23acc |
flags_value = &flags_class->values[i];
|
|
Packit Service |
b23acc |
if (flags_value->value >= (guint) from && flags_value->value <= (guint) to) {
|
|
Packit Service |
b23acc |
if (_enum_is_valid_flags_nick (flags_value->value_nick))
|
|
Packit Service |
b23acc |
g_ptr_array_add (array, (gpointer) flags_value->value_nick);
|
|
Packit Service |
b23acc |
else
|
|
Packit Service |
b23acc |
g_ptr_array_add (array, (gpointer) g_intern_string (nm_sprintf_buf (sbuf, "0x%x", (unsigned) flags_value->value)));
|
|
Packit Service |
b23acc |
}
|
|
Packit Service |
b23acc |
}
|
|
Packit Service |
b23acc |
} else {
|
|
Packit Service |
b23acc |
g_type_class_unref (klass);
|
|
Packit Service |
b23acc |
g_ptr_array_free (array, TRUE);
|
|
Packit Service |
b23acc |
g_return_val_if_reached (NULL);
|
|
Packit Service |
b23acc |
}
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
g_type_class_unref (klass);
|
|
Packit Service |
b23acc |
g_ptr_array_add (array, NULL);
|
|
Packit Service |
b23acc |
|
|
Packit Service |
b23acc |
return (const char **) g_ptr_array_free (array, FALSE);
|
|
Packit Service |
b23acc |
}
|