From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:55378) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1VrV2I-0004wN-K4 for qemu-devel@nongnu.org; Fri, 13 Dec 2013 10:52:24 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1VrV2C-0007Ev-Jr for qemu-devel@nongnu.org; Fri, 13 Dec 2013 10:52:18 -0500 Received: from mx1.redhat.com ([209.132.183.28]:48101) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1VrV2C-0007ED-9V for qemu-devel@nongnu.org; Fri, 13 Dec 2013 10:52:12 -0500 Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id rBDFqB6w029889 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Fri, 13 Dec 2013 10:52:11 -0500 Message-ID: <52AB2D60.6050403@redhat.com> Date: Fri, 13 Dec 2013 16:53:04 +0100 From: Max Reitz MIME-Version: 1.0 References: <1386785473-26157-1-git-send-email-mreitz@redhat.com> <1386785473-26157-5-git-send-email-mreitz@redhat.com> <52A955E5.8070505@redhat.com> In-Reply-To: <52A955E5.8070505@redhat.com> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: quoted-printable Subject: Re: [Qemu-devel] [PATCH v3 04/21] qapi: extend qdict_flatten() for QLists List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Fam Zheng , qemu-devel@nongnu.org Cc: Kevin Wolf , Stefan Hajnoczi On 12.12.2013 07:21, Fam Zheng wrote: > On 2013=E5=B9=B412=E6=9C=8812=E6=97=A5 02:10, Max Reitz wrote: >> Reversing qdict_array_split(), qdict_flatten() should flatten QLists a= s >> well by interpreting them as QDicts where every entry's key is its >> index. >> >> This allows bringing QDicts with QLists from QMP commands to the same >> form as they would be given as command-line options, thereby allowing >> them to be parsed the same way. >> >> Signed-off-by: Max Reitz >> --- >> qobject/qdict.c | 45 +++++++++++++++++++++++++++++++++++++++++---- >> 1 file changed, 41 insertions(+), 4 deletions(-) >> >> diff --git a/qobject/qdict.c b/qobject/qdict.c >> index fca1902..d7ce4b3 100644 >> --- a/qobject/qdict.c >> +++ b/qobject/qdict.c >> @@ -477,7 +477,40 @@ static void qdict_destroy_obj(QObject *obj) >> g_free(qdict); >> } >> >> -static void qdict_do_flatten(QDict *qdict, QDict *target, const char=20 >> *prefix) >> +static void qdict_flatten_qdict(QDict *qdict, QDict *target, >> + const char *prefix); >> + >> +static void qdict_flatten_qlist(QList *qlist, QDict *target, const=20 >> char *prefix) >> +{ >> + QObject *value; >> + const QListEntry *entry; >> + char *new_key; >> + int i; >> + >> + /* This function is never called with prefix =3D=3D NULL, i.e., it i= s=20 >> always >> + * called from within qdict_flatten_q(list|dict)(). Therefore, it=20 >> does not >> + * need to remove list entries during the iteration (the whole list=20 >> will be >> + * deleted eventually anyway from qdict_flatten_qdict()). Also,=20 >> prefix can >> + * never be NULL. */ >> + >> + entry =3D qlist_first(qlist); >> + >> + for (i =3D 0; entry; entry =3D qlist_next(entry), i++) { >> + value =3D qlist_entry_obj(entry); >> + >> + qobject_incref(value); >> + new_key =3D g_strdup_printf("%s.%i", prefix, i); >> + qdict_put_obj(target, new_key, value); >> + >> + if (qobject_type(value) =3D=3D QTYPE_QDICT) { >> + qdict_flatten_qdict(qobject_to_qdict(value), target, new_key); >> + } else { >> + qdict_flatten_qlist(qobject_to_qlist(value), target, new_key); >> + } >> + } >> +} >> + >> +static void qdict_flatten_qdict(QDict *qdict, QDict *target, const=20 >> char *prefix) > > Sorry for replying twice on the same patch. But it would be nice if=20 > you could add a few comments on this function with some examples, as=20 > you did with qdict_array_split, I appreciated that. :) Okay. Max