Implement qdict_flatten()
qdict_flatten(): For each nested QDict with key x, all fields with key y are moved to this QDict and their key is renamed to "x.y". This operation is applied recursively for nested QDicts. Signed-off-by: Kevin Wolf <kwolf@redhat.com> Reviewed-by: Eric Blake <eblake@redhat.com>
This commit is contained in:
parent
29c4e2b50d
commit
f660dc6a2e
|
@ -65,5 +65,6 @@ int qdict_get_try_bool(const QDict *qdict, const char *key, int def_value);
|
||||||
const char *qdict_get_try_str(const QDict *qdict, const char *key);
|
const char *qdict_get_try_str(const QDict *qdict, const char *key);
|
||||||
|
|
||||||
QDict *qdict_clone_shallow(const QDict *src);
|
QDict *qdict_clone_shallow(const QDict *src);
|
||||||
|
void qdict_flatten(QDict *qdict);
|
||||||
|
|
||||||
#endif /* QDICT_H */
|
#endif /* QDICT_H */
|
||||||
|
|
|
@ -476,3 +476,54 @@ static void qdict_destroy_obj(QObject *obj)
|
||||||
|
|
||||||
g_free(qdict);
|
g_free(qdict);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void qdict_do_flatten(QDict *qdict, QDict *target, const char *prefix)
|
||||||
|
{
|
||||||
|
QObject *value;
|
||||||
|
const QDictEntry *entry, *next;
|
||||||
|
const char *new_key;
|
||||||
|
bool delete;
|
||||||
|
|
||||||
|
entry = qdict_first(qdict);
|
||||||
|
|
||||||
|
while (entry != NULL) {
|
||||||
|
|
||||||
|
next = qdict_next(qdict, entry);
|
||||||
|
value = qdict_entry_value(entry);
|
||||||
|
new_key = NULL;
|
||||||
|
delete = false;
|
||||||
|
|
||||||
|
if (prefix) {
|
||||||
|
qobject_incref(value);
|
||||||
|
new_key = g_strdup_printf("%s.%s", prefix, entry->key);
|
||||||
|
qdict_put_obj(target, new_key, value);
|
||||||
|
delete = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (qobject_type(value) == QTYPE_QDICT) {
|
||||||
|
qdict_do_flatten(qobject_to_qdict(value), target,
|
||||||
|
new_key ? new_key : entry->key);
|
||||||
|
delete = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (delete) {
|
||||||
|
qdict_del(qdict, entry->key);
|
||||||
|
|
||||||
|
/* Restart loop after modifying the iterated QDict */
|
||||||
|
entry = qdict_first(qdict);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
entry = next;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* qdict_flatten(): For each nested QDict with key x, all fields with key y
|
||||||
|
* are moved to this QDict and their key is renamed to "x.y". This operation
|
||||||
|
* is applied recursively for nested QDicts.
|
||||||
|
*/
|
||||||
|
void qdict_flatten(QDict *qdict)
|
||||||
|
{
|
||||||
|
qdict_do_flatten(qdict, qdict, NULL);
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue